From dd1f0dff46b1432378bb3d8bd22d1807da5fc542 Mon Sep 17 00:00:00 2001 From: Vladimir Grichina Date: Mon, 7 Jan 2019 00:52:16 -0800 Subject: [PATCH 1/6] Implement JSON bindings generation --- dist/assemblyscript.js | 2 +- dist/assemblyscript.js.map | 2 +- src/definitions.ts | 40 +++++++++++++++++++++----------------- tests/near-bindgen/main.ts | 8 ++++---- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index 5a6adb1d2a..4418a5a380 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,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=Z;var J=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 n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=xe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=xe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.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}(j);t.DeclarationStatement=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return n(t,e),t}(J);t.IndexSignatureDeclaration=$;var ee=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(J);t.VariableLikeDeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(j);t.BlockStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(j);t.BreakStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.ClassDeclaration=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(j);t.ContinueStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(j);t.DoStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(j);t.EmptyStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(J);t.EnumDeclaration=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(J);t.EnumValueDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(j);t.ExportStatement=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(j);t.ExpressionStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}(ee);t.FieldDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(j);t.ForStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(j);t.IfStatement=ge;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(J);t.ImportDeclaration=ye;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(j);t.ImportStatement=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(ne);t.InterfaceDeclaration=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(me);t.MethodDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(J);t.NamespaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(j);t.ReturnStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(j);t.SwitchStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(j);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(j);t.TryStatement=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(J);t.TypeDeclaration=Se;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}(ee);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(j);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(j);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(j);function xe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?xe(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?xe(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Fe(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}}}},a=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 s,o=r(0),c=r(1),l=r(6),p=r(3),u=r(5),h=r(11),d=function(){return function(){}}(),_=function(){return function(){}}(),m=function(){return function(){}}();function g(e,t){switch(assert(t.length),e){case p.DecoratorKind.OPERATOR:case p.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 p.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 p.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 y,f,E=new Map,T=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=E,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=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 h.Resolver(r),r.sources=[],r}return n(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(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=s);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var o=0;switch(u.getExpressionType(e)){case 1:o=u.getConstValueI32(e);break;case 2:o=u.getConstValueI64Low(e);break;case 3:o=i32(u.getConstValueF32(e));break;case 4:o=i32(u.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 u.ExpressionId.Load:var c=void 0;switch(u.getLoadBytes(e)){case 1:c=u.isLoadSigned(e)?l.Type.i8:l.Type.u8;break;case 2:c=u.isLoadSigned(e)?l.Type.i16:l.Type.u16;break;default:c=u.isLoadSigned(e)?l.Type.i32:l.Type.u32}return z(c,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var p=assert(u.getBlockChildCount(e)),h=u.getBlockChild(e,p-1);return this.canOverflow(h,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(u.getCallTarget(e))));assert(_.kind==y.FUNCTION);var m=_.signature.returnType;return!_.flow.is(2)||z(m,t);case u.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 z(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=K},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";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||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(1),o=r(3),c=r(2);function l(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function p(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:case i.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"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=l,t.tokenIsAlsoIdentifier=p,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=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=u;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(c.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(c.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 _=null},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(23),c=r(1),l=r(5),p=r(0),u=r(4),h=r(8),d=r(3),_=r(6),m=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var g=function(){function e(){this.target=s.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==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?_.Type.usize64:_.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?_.Type.isize64:_.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?2:1},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"}(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 y,f,E=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=_.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=l.Module.create(),n}return n(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,s=this.program;s.initialize(r);var c=new u.Function(s.startFunction,"start",new _.Signature([],_.Type.void));this.startFunctionInstance=c;var p=new Array;this.startFunctionBody=p,this.currentFunction=c,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var h=s.sources,d=0,m=h.length;d"),!1;e.type=this.currentType,e.set(p.CommonFlags.RESOLVED)}else assert(!1);if(e.is(p.CommonFlags.AMBIENT)&&e.hasDecorator(u.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?T(e,r):(y="env",f=e.simpleName),t.addGlobalImport(e.internalName,y,f,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(c.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)),l.getExpressionId(n)!=l.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),l.getExpressionId(n)!=l.ExpressionId.Const&&(this.warning(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(u.DecoratorFlags.INLINE)&&!o){switch(assert(l.getExpressionId(n)==l.ExpressionId.Const),l.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI64Low(n),l.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var h=e.internalName;return o?(t.addGlobal(h,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(h,n))):t.addGlobal(h,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==u.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null,s=!1;if(e.members)try{for(var o=i(e.members.values()),h=o.next();!h.done;h=o.next()){var d=h.value;if(d.kind==u.ElementKind.ENUMVALUE){var m=!1,g=d,y=g.declaration;g.set(p.CommonFlags.COMPILED);var f=void 0;y.value?(f=this.compileExpression(y.value,_.Type.i32,1,0),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)?(f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),m=!0)):m=!0)):null==a?f=n.createI32(0):(s&&this.error(c.DiagnosticCode.Enum_member_must_have_initializer,y.range),f=n.createBinary(l.BinaryOp.AddI32,n.createGetGlobal(a.internalName,1),n.createI32(1)),f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),m=!0)),m?(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(p.CommonFlags.CONST),f),s=!1),a=g}}}catch(e){t={error:e}}finally{try{h&&!h.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==u.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(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var g=t.createBlock("case0|"+a,p,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),o.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(c.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==d.NodeKind.SOURCE){for(var s=0;s");continue}f=this.currentType}var T=!1;if(g.is(p.CommonFlags.CONST))if(E)if(E=this.module.precomputeExpression(E),l.getExpressionId(E)==l.ExpressionId.Const){var I=new u.Local(r,y,-1,f);switch(l.getExpressionType(E)){case 1:I=I.withConstantIntegerValue(i64_new(l.getConstValueI32(E),0));break;case 2:I=I.withConstantIntegerValue(i64_new(l.getConstValueI64Low(E),l.getConstValueI64High(E)));break;case 3:I=I.withConstantFloatValue(l.getConstValueF32(E));break;case 4:I=I.withConstantFloatValue(l.getConstValueF64(E));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(c.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(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,g.range);else this.error(c.DiagnosticCode._const_declarations_must_be_initialized,g.range);if(!T){I=void 0;I=g.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||h.is(2048)?h.addScopedLocal(f,y,!1,g):n.addLocal(f,y,g),E?(o.push(this.compileAssignmentWithValue(g.name,E)),I.type.is(36)&&h.setLocalWrapped(I.index,!h.canOverflow(E,f))):I.type.is(36)&&h.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,_.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(l.getExpressionId(n)==l.ExpressionId.Const&&1==l.getExpressionType(n)){if(!l.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.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 u="continue|"+a;o.continueLabel=u;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(u,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(u)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.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(_.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(u.DecoratorFlags.BUILTIN)||t!=_.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=_.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(c.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==_.Type.void?_.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(c.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(c.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(l.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(l.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToI64,e):s.createUnary(l.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToU64,e):s.createUnary(l.UnaryOp.TruncF32ToU32,e):r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToI64,e):s.createUnary(l.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToU64,e):s.createUnary(l.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)?l.UnaryOp.ConvertI64ToF32:l.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF32:l.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?l.UnaryOp.ConvertI64ToF64:l.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF64:l.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(l.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?l.UnaryOp.ExtendI32:l.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GtI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtI64:l.BinaryOp.GtI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GtU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtU64:l.BinaryOp.GtU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GtU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GtF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GtF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.LE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.LeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeI64:l.BinaryOp.LeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.LeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeU64:l.BinaryOp.LeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.LeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.LeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.LeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.GE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeI64:l.BinaryOp.GeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeU64:l.BinaryOp.GeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS_EQUALS_EQUALS:case h.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.EQ)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.EqI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.EqI64:l.BinaryOp.EqI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.EqI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.EqF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.EqF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EXCLAMATION_EQUALS_EQUALS:case h.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.NE)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.NeI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.NeI64:l.BinaryOp.NeI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.NeI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.NeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.NeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS:return this.compileAssignment(d,m,t);case h.Token.PLUS_EQUALS:g=!0;case h.Token.PLUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.ADD)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.AddI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AddI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.AddF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.AddF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.MINUS_EQUALS:g=!0;case h.Token.MINUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.SUB)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.SubI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.SubI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.SubF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.SubF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.MUL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.MulI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.MulI64:l.BinaryOp.MulI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.MulI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.MulF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.MulF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.POW)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,_.Type.f64,1,0,d),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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case h.Token.SLASH_EQUALS:g=!0;case h.Token.SLASH:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.DIV)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.DivI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivI64:l.BinaryOp.DivI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.DivU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivU64:l.BinaryOp.DivU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.DivU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.DivF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.DivF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.PERCENT_EQUALS:g=!0;case h.Token.PERCENT:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.REM)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.RemI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemI64:l.BinaryOp.RemI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.RemU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemU64:l.BinaryOp.RemU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,T;if(!(E=this.program.elementsLookup.get("Math"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.LESSTHAN_LESSTHAN_EQUALS:g=!0;case h.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShlI64:l.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.ShrI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.ShrI64,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrI64:l.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_EQUALS:g=!0;case h.Token.AMPERSAND:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.AndI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AndI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AndI64:l.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.BAR_EQUALS:g=!0;case h.Token.BAR:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.OrI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.OrI64:l.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.CARET_EQUALS:g=!0;case h.Token.CARET:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.XorI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,o=p.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=p.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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),i,p.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case h.Token.BAR_BAR:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),p.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return g?this.compileAssignmentWithValue(d,o,t!=_.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(u.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==u.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(u.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=_.Type.void);case u.ElementKind.LOCAL:case u.ElementKind.FIELD:n=s.type;break;case u.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var l=this.resolver.resolveFunction(o,null);if(!l)return this.module.createUnreachable();assert(1==l.signature.parameterTypes.length),n=l.signature.parameterTypes[0];break}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case u.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(4096),h=s.lookupOverload(u.OperatorKind.INDEXED_SET,p);if(!h)return s.lookupOverload(u.OperatorKind.INDEXED_GET,p)?this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=_.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=_.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 u.ElementKind.LOCAL:var a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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(),l=i.internalName;return n.createBlock(null,[n.createSetGlobal(l,t),n.createGetGlobal(l,o)],o)}return n.createSetGlobal(i.internalName,t);case u.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(c.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),m=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:_.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(b=this.currentFunction).flow;var g=b.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(a.byteSize,m,n.createGetLocal(g,o),o,i.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(a.byteSize,m,t,o,i.memoryOffset);case u.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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(f,[m,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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),g=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(f,[n.createTeeLocal(g,m),t]),this.makeCallDirect(T,[n.createGetLocal(g,I)])],I)}return n.createBlock(null,[this.makeCallDirect(f,[t]),this.makeCallDirect(T)],I)}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case u.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(u.OperatorKind.INDEXED_GET,A);if(!C)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(u.OperatorKind.INDEXED_SET,A);if(!N)return this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:_.Type.void,n.createUnreachable();var O=i.type,S=(d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,_.Type.i32,1,0));if(r){var b,L=(b=this.currentFunction).getTempLocal(O,!1),k=b.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(L),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(L.index,m),n.createTeeLocal(k.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(L.index,L.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,S,t])}}return this.error(c.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 u.ElementKind.FUNCTION_PROTOTYPE:var o=s,l=e.typeArguments;if(o.hasDecorator(u.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var h=null;if(l){if(!o.is(p.CommonFlags.GENERIC))return this.error(c.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();h=this.resolver.resolveFunctionInclTypeArguments(o,l,m.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(p.CommonFlags.GENERIC)){for(var g=new Map,y=assert(o.declaration.typeParameters),f=y.length,E=0;Es&&!i)||(this.error(c.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(p.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(c.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var l=n?a+1:a,u=new Array(l),h=0;n&&(u[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(c.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,h=e.is(p.CommonFlags.INSTANCE),d=r.requiredParameters,m=d,g=i.length,y=g;h&&(++m,++y);var f=assert(y-m),E=new Array(m),T=0,I=this.module;h&&(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(p.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(f))return this.module.createUnreachable();var I=f.type;return assert(I!=_.Type.void),f.is(p.CommonFlags.INLINED)?this.compileInlineConstant(f,t,r):(this.currentType=I,this.module.createGetGlobal(f.internalName,I.toNativeType()));case u.ElementKind.ENUMVALUE:return f.is(p.CommonFlags.COMPILED)?(this.currentType=_.Type.i32,f.is(p.CommonFlags.INLINED)?this.module.createI32(f.constantValue):this.module.createGetGlobal(f.internalName,1)):(this.error(c.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=_.Type.i32,this.module.createUnreachable());case u.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(f,null,m.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(c.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=_.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?l.BinaryOp.NeI64:l.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(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==_.Type.f32?n.createF32(a):(this.currentType=_.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=_.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=_.Type.u32,n.createI32(i64_low(s))):(this.currentType=_.Type.i64,n.createI64(i64_low(s),i64_high(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(c.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 c=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*c,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(o.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(c,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(c.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PRIVATE))return this.error(c.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PROTECTED))return this.error(c.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,l=e.values,h=n.members,d=!1,_=new Array(s+2),m=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==l.length);for(var g=0,y=s;g=0);var l=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),l,i.type.toNativeType(),i.memoryOffset);case u.ElementKind.PROPERTY:return this.compileGetter(i,e);case u.ElementKind.FUNCTION_PROTOTYPE:return this.error(c.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(c.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(p.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&u.DecoratorFlags.INLINE);if(n.is(p.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==u.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),l=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,l,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(c.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,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(l.getExpressionId(o)==l.ExpressionId.Const&&1==l.getExpressionType(o))return l.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;u.free();var m=a.fork();i.flow=m;var g=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var f=_.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(c.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==_.Type.void?_.Type.i32:t,0,0);if(l.getExpressionId(i)==l.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=_.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case h.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case h.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var d,m;if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.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=_.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 h.Token.PLUS:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case h.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==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(l.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(l.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=_.Type.bool;break;case h.Token.TILDE:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t.is(8)?_.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.TYPEOF:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=_.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(l.UnaryOp.ExtendI8ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(l.UnaryOp.ExtendI16ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(l.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(l.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(l.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?l.UnaryOp.EqzI64:l.UnaryOp.EqzI32,e);case 11:return r.createBinary(l.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(l.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(l.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(l.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(l.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(l.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,s=this.currentFunction,c=this.options.nativeSizeType,l=s.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(l.index,o.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==u.ElementKind.FIELD){var g=m,y=g.type,f=y.toNativeType(),E=g.prototype.declaration;if(assert(!g.isAny(p.CommonFlags.CONST)),E.initializer)h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),this.compileExpression(E.initializer,y,1,0),f,g.memoryOffset));else{var T=g.prototype.declaration.parameterIndex;h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),T>=0?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = bson;\n handler.decoder = new BSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(bson);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new BSONEncoder();"),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }"),this.sb.push("\n pushObject(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.readIndex);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+"[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n "+e+"[i32(parseInt(name))] = <"+t+">null;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.readIndex);\n return false;\n }\n pushArray(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.readIndex);\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),"Array"==e.classReference.prototype.simpleName&&e.classReference.typeArguments?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: BSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"near.str(i)","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: BSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_BSONHandler_"+t+" extends ThrowingBSONHandler {\n buffer: Uint8Array;\n decoder: BSONDecoder<__near_BSONHandler_"+t+">;\n value: "+e+" = new "+e+"();"),e.classReference.simpleName.startsWith("Array")?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),"Array"==e.classReference.prototype.simpleName&&e.classReference.typeArguments?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, offset: i32): "+e+" {\n let handler = new __near_BSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new BSONDecoder<__near_BSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, offset);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i="Array"==e.classReference.prototype.simpleName?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(bson);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();"),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }"),this.sb.push("\n pushObject(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.readIndex);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+"[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n "+e+"[i32(parseInt(name))] = <"+t+">null;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.readIndex);\n return false;\n }\n pushArray(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.readIndex);\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"near.str(i)","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?(console.log("generateHandler typeName "+e.classReference.simpleName),this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0])):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, offset: i32): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, offset);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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--;\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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"Uint8Array\": \"Uint8Array\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingBSONHandler {\n buffer: Uint8Array;\n decoder: BSONDecoder<__near_ArgsParser_${element.simpleName}>;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = bson;\n handler.decoder = new BSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(bson);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new BSONEncoder();`);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.readIndex);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n ${valuePrefix}[i32(parseInt(name))] = <${fieldType}>null;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex);\n return false;\n }\n pushArray(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex);\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (type.classReference.prototype.simpleName == \"Array\" && type.classReference.typeArguments) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments[0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: BSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments[0], \"near.str(i)\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: BSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_BSONHandler_${typeName} extends ThrowingBSONHandler {\n buffer: Uint8Array;\n decoder: BSONDecoder<__near_BSONHandler_${typeName}>;\n value: ${type} = new ${type}();`);\n if (type.classReference!.simpleName.startsWith(\"Array\")) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (type.classReference.prototype.simpleName == \"Array\" && type.classReference.typeArguments) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments[0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, offset: i32): ${type} {\n let handler = new __near_BSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new BSONDecoder<__near_BSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, offset);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = fieldType.classReference!.prototype.simpleName == \"Array\" ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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 +{"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/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/tokenizer.ts","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","CALL","ELEMENTACCESS","PROPERTYACCESS","PARENTHESIZED","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","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","SUPER","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","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","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","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","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","_BinaryenModuleCreate","cachedByValue","memory","allocate","createFrom","cArr","allocU8Array","_BinaryenModuleRead","changetype","addFunctionType","result","paramTypes","cStr","allocString","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","_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","_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","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","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Return","Break","numChildren","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","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","eval","e","window","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","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","numPages","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","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","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","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","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","parentBase","thisLocal","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","scopedThis","_this_cannot_be_referenced_in_current_location","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","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","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","compileAllocate","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","classInstance","compileInstantiate","currentClassInstance","makeAllocate","propertyAccess","resolvePropertyAccess","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","fieldType","nativeFieldType","fieldDeclaration","ReportMode","currentTypeIsPlaceholder","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","contextualFunction","targetExpression","propertyName","elementAccess","explicitLocal","functionTarget","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClass","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","NEARBindingsBuilder","typeMapping","nonNullableTypes","generatedEncodeFunctions","generatedDecodeFunctions","build","generateArgsParser","generateWrapperFunction","fields","paramName","forEach","generateDecodeFunction","generateHandlerMethods","generateEncodeFunction","generateFieldEncoder","valuePrefix","setterType","this_1","matchingFields","filter","generatePushHandler","encodeType","generateArrayHandlerMethods","isArrayType","getFields","sourceExpr","generateHandler","console","log","fieldExpr","indexOf","pushType","__spread","visitInterface","mainSource","IDLBuilder","indentLevel","indent","typeToString","members_1","members_1_1","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","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","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","PREFIX","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","POSITIVE_INFINITY","Infinity","NEGATIVE_INFINITY","NaN","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","copy","dest","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","gte","lte","minSafeF64","maxSafeF64","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","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","tempLocal0","tempLocal1","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","allocateInstance","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","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","buildNEAR"],"mappings":"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AAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKS,IACrB/hB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKS,IAAG,KAKZ,IAAK,QAOH,OANItZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcg8B,EAAS1lE,QAAQW,UACjChiB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,KAK9B,IAAK,OAOH,OANIvZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACrBjiB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKW,KAAI,KAKb,IAAK,MAOH,OANIxZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKY,IACrBliB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKY,I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AM,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,OAEtCE,GACJ,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,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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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(bson);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();`);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.readIndex);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n ${valuePrefix}[i32(parseInt(name))] = <${fieldType}>null;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex);\n return false;\n }\n pushArray(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex);\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"near.str(i)\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n console.log(`generateHandler typeName ${type.classReference!.simpleName}`)\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, offset: i32): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, offset);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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/src/definitions.ts b/src/definitions.ts index 7874dfc230..c90e2fa867 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -132,7 +132,6 @@ export class NEARBindingsBuilder extends ExportsWalker { private typeMapping: { [key: string]: string } = { "i32": "Integer", "String": "String", - "Uint8Array": "Uint8Array", "bool": "Boolean" }; @@ -169,9 +168,9 @@ export class NEARBindingsBuilder extends ExportsWalker { return { simpleName: paramName, type: signature.parameterTypes[i] }; }) : []; fields.forEach(field => this.generateDecodeFunction(field.type)); - this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingBSONHandler { + this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_ArgsParser_${element.simpleName}>; + decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>; `); if (signature.parameterNames) { fields.forEach((field) => { @@ -193,7 +192,7 @@ export class NEARBindingsBuilder extends ExportsWalker { input_read_into(bson.buffer.data); let handler = new __near_ArgsParser_${element.simpleName}(); handler.buffer = bson; - handler.decoder = new BSONDecoder<__near_ArgsParser_${element.simpleName}>(handler); + handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler); handler.decoder.deserialize(bson);`); if (returnType.toString() != "void") { this.sb.push(`let result = ${element.simpleName}(`); @@ -206,7 +205,7 @@ export class NEARBindingsBuilder extends ExportsWalker { this.sb.push(");"); if (returnType.toString() != "void") { this.sb.push(` - let encoder = new BSONEncoder();`); + let encoder = new JSONEncoder();`); this.generateFieldEncoder(returnType, '"result"', "result"); this.sb.push(` return_value(near.bufferWithSize(encoder.serialize()).buffer.data); @@ -300,15 +299,15 @@ export class NEARBindingsBuilder extends ExportsWalker { } this.generatedEncodeFunctions.add(typeName); - if (type.classReference.prototype.simpleName == "Array" && type.classReference.typeArguments) { + if (this.isArrayType(type)) { // Array - this.generateEncodeFunction(type.classReference.typeArguments[0]); + this.generateEncodeFunction(type.classReference.typeArguments![0]); this.sb.push(`export function __near_encode_${typeName}( value: ${type.toString()}, - encoder: BSONEncoder): void {`); + encoder: JSONEncoder): void {`); this.sb.push(`for (let i = 0; i < value.length; i++) {`); - this.generateFieldEncoder(type.classReference.typeArguments[0], "near.str(i)", "value[i]"); + this.generateFieldEncoder(type.classReference.typeArguments![0], "near.str(i)", "value[i]"); this.sb.push("}"); } else { @@ -319,7 +318,7 @@ export class NEARBindingsBuilder extends ExportsWalker { this.sb.push(`export function __near_encode_${typeName}( value: ${type.toString()}, - encoder: BSONEncoder): void {`); + encoder: JSONEncoder): void {`); this.getFields(type.classReference).forEach((field) => { let fieldType = field.type; let fieldName = field.simpleName; @@ -333,11 +332,12 @@ export class NEARBindingsBuilder extends ExportsWalker { private generateHandler(type: Type) { let typeName = this.encodeType(type); - this.sb.push(`export class __near_BSONHandler_${typeName} extends ThrowingBSONHandler { + this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_BSONHandler_${typeName}>; + decoder: JSONDecoder<__near_JSONHandler_${typeName}>; value: ${type} = new ${type}();`); - if (type.classReference!.simpleName.startsWith("Array")) { + if (this.isArrayType(type)) { + console.log(`generateHandler typeName ${type.classReference!.simpleName}`) this.generateArrayHandlerMethods("this.value", type.classReference!.typeArguments![0]); } else { this.generateHandlerMethods("this.value.", this.getFields(type.classReference!)); @@ -357,9 +357,9 @@ export class NEARBindingsBuilder extends ExportsWalker { this.generatedDecodeFunctions.add(typeName); this.generateHandler(type); - if (type.classReference.prototype.simpleName == "Array" && type.classReference.typeArguments) { + if (this.isArrayType(type)) { // Array - this.generateDecodeFunction(type.classReference.typeArguments[0]); + this.generateDecodeFunction(type.classReference.typeArguments![0]); } else { // Object this.getFields(type.classReference).forEach(field => { @@ -369,9 +369,9 @@ export class NEARBindingsBuilder extends ExportsWalker { this.sb.push(`export function __near_decode_${typeName}( buffer: Uint8Array, offset: i32): ${type} { - let handler = new __near_BSONHandler_${typeName}(); + let handler = new __near_JSONHandler_${typeName}(); handler.buffer = buffer; - handler.decoder = new BSONDecoder<__near_BSONHandler_${typeName}>(handler); + handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler); handler.decoder.deserialize(buffer, offset); return handler.value; }\n`); @@ -381,7 +381,7 @@ export class NEARBindingsBuilder extends ExportsWalker { let setterType = this.typeMapping[fieldType.toString()]; if (!setterType) { // Object / array - let pushType = fieldType.classReference!.prototype.simpleName == "Array" ? "Array" : "Object"; + let pushType = this.isArrayType(fieldType) ? "Array" : "Object"; this.sb.push(`if (${sourceExpr} != null) { encoder.push${pushType}(${fieldExpr}); __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder); @@ -410,6 +410,10 @@ export class NEARBindingsBuilder extends ExportsWalker { .replace(/>; } From 7733d22c214d6bc35960ae462ab801ce4a294283 Mon Sep 17 00:00:00 2001 From: Vladimir Grichina Date: Mon, 7 Jan 2019 23:28:27 -0800 Subject: [PATCH 2/6] Refactor JSON parser state into separate class --- dist/assemblyscript.js | 2 +- dist/assemblyscript.js.map | 2 +- src/definitions.ts | 11 +- tests/near-bindgen/main.ts | 2 +- tests/near-bindgen/main_near.ts.expected | 165 +++++++++++------------ 5 files changed, 83 insertions(+), 99 deletions(-) diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index 4418a5a380..8314f51590 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,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=Z;var J=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 n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=xe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=xe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.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}(j);t.DeclarationStatement=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return n(t,e),t}(J);t.IndexSignatureDeclaration=$;var ee=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(J);t.VariableLikeDeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(j);t.BlockStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(j);t.BreakStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.ClassDeclaration=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(j);t.ContinueStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(j);t.DoStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(j);t.EmptyStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(J);t.EnumDeclaration=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(J);t.EnumValueDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(j);t.ExportStatement=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(j);t.ExpressionStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}(ee);t.FieldDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(j);t.ForStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(j);t.IfStatement=ge;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(J);t.ImportDeclaration=ye;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(j);t.ImportStatement=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(ne);t.InterfaceDeclaration=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(me);t.MethodDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(J);t.NamespaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(j);t.ReturnStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(j);t.SwitchStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(j);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(j);t.TryStatement=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(J);t.TypeDeclaration=Se;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}(ee);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(j);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(j);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(j);function xe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?xe(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?xe(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Fe(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}}}},a=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 s,o=r(0),c=r(1),l=r(6),p=r(3),u=r(5),h=r(11),d=function(){return function(){}}(),_=function(){return function(){}}(),m=function(){return function(){}}();function g(e,t){switch(assert(t.length),e){case p.DecoratorKind.OPERATOR:case p.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 p.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 p.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 y,f,E=new Map,T=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=E,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=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 h.Resolver(r),r.sources=[],r}return n(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(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=s);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var o=0;switch(u.getExpressionType(e)){case 1:o=u.getConstValueI32(e);break;case 2:o=u.getConstValueI64Low(e);break;case 3:o=i32(u.getConstValueF32(e));break;case 4:o=i32(u.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 u.ExpressionId.Load:var c=void 0;switch(u.getLoadBytes(e)){case 1:c=u.isLoadSigned(e)?l.Type.i8:l.Type.u8;break;case 2:c=u.isLoadSigned(e)?l.Type.i16:l.Type.u16;break;default:c=u.isLoadSigned(e)?l.Type.i32:l.Type.u32}return z(c,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var p=assert(u.getBlockChildCount(e)),h=u.getBlockChild(e,p-1);return this.canOverflow(h,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(u.getCallTarget(e))));assert(_.kind==y.FUNCTION);var m=_.signature.returnType;return!_.flow.is(2)||z(m,t);case u.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 z(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=K},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";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||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(1),o=r(3),c=r(2);function l(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function p(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:case i.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"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=l,t.tokenIsAlsoIdentifier=p,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=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=u;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(c.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(c.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 _=null},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(23),c=r(1),l=r(5),p=r(0),u=r(4),h=r(8),d=r(3),_=r(6),m=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var g=function(){function e(){this.target=s.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==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?_.Type.usize64:_.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?_.Type.isize64:_.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?2:1},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"}(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 y,f,E=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=_.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=l.Module.create(),n}return n(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,s=this.program;s.initialize(r);var c=new u.Function(s.startFunction,"start",new _.Signature([],_.Type.void));this.startFunctionInstance=c;var p=new Array;this.startFunctionBody=p,this.currentFunction=c,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var h=s.sources,d=0,m=h.length;d"),!1;e.type=this.currentType,e.set(p.CommonFlags.RESOLVED)}else assert(!1);if(e.is(p.CommonFlags.AMBIENT)&&e.hasDecorator(u.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?T(e,r):(y="env",f=e.simpleName),t.addGlobalImport(e.internalName,y,f,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(c.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)),l.getExpressionId(n)!=l.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),l.getExpressionId(n)!=l.ExpressionId.Const&&(this.warning(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(u.DecoratorFlags.INLINE)&&!o){switch(assert(l.getExpressionId(n)==l.ExpressionId.Const),l.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI64Low(n),l.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var h=e.internalName;return o?(t.addGlobal(h,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(h,n))):t.addGlobal(h,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==u.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null,s=!1;if(e.members)try{for(var o=i(e.members.values()),h=o.next();!h.done;h=o.next()){var d=h.value;if(d.kind==u.ElementKind.ENUMVALUE){var m=!1,g=d,y=g.declaration;g.set(p.CommonFlags.COMPILED);var f=void 0;y.value?(f=this.compileExpression(y.value,_.Type.i32,1,0),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)?(f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),m=!0)):m=!0)):null==a?f=n.createI32(0):(s&&this.error(c.DiagnosticCode.Enum_member_must_have_initializer,y.range),f=n.createBinary(l.BinaryOp.AddI32,n.createGetGlobal(a.internalName,1),n.createI32(1)),f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),m=!0)),m?(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(p.CommonFlags.CONST),f),s=!1),a=g}}}catch(e){t={error:e}}finally{try{h&&!h.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==u.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(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var g=t.createBlock("case0|"+a,p,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),o.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(c.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==d.NodeKind.SOURCE){for(var s=0;s");continue}f=this.currentType}var T=!1;if(g.is(p.CommonFlags.CONST))if(E)if(E=this.module.precomputeExpression(E),l.getExpressionId(E)==l.ExpressionId.Const){var I=new u.Local(r,y,-1,f);switch(l.getExpressionType(E)){case 1:I=I.withConstantIntegerValue(i64_new(l.getConstValueI32(E),0));break;case 2:I=I.withConstantIntegerValue(i64_new(l.getConstValueI64Low(E),l.getConstValueI64High(E)));break;case 3:I=I.withConstantFloatValue(l.getConstValueF32(E));break;case 4:I=I.withConstantFloatValue(l.getConstValueF64(E));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(c.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(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,g.range);else this.error(c.DiagnosticCode._const_declarations_must_be_initialized,g.range);if(!T){I=void 0;I=g.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||h.is(2048)?h.addScopedLocal(f,y,!1,g):n.addLocal(f,y,g),E?(o.push(this.compileAssignmentWithValue(g.name,E)),I.type.is(36)&&h.setLocalWrapped(I.index,!h.canOverflow(E,f))):I.type.is(36)&&h.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,_.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(l.getExpressionId(n)==l.ExpressionId.Const&&1==l.getExpressionType(n)){if(!l.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.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 u="continue|"+a;o.continueLabel=u;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(u,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(u)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.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(_.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(u.DecoratorFlags.BUILTIN)||t!=_.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=_.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(c.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==_.Type.void?_.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(c.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(c.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(l.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(l.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToI64,e):s.createUnary(l.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToU64,e):s.createUnary(l.UnaryOp.TruncF32ToU32,e):r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToI64,e):s.createUnary(l.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToU64,e):s.createUnary(l.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)?l.UnaryOp.ConvertI64ToF32:l.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF32:l.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?l.UnaryOp.ConvertI64ToF64:l.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF64:l.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(l.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?l.UnaryOp.ExtendI32:l.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GtI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtI64:l.BinaryOp.GtI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GtU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtU64:l.BinaryOp.GtU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GtU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GtF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GtF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.LE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.LeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeI64:l.BinaryOp.LeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.LeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeU64:l.BinaryOp.LeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.LeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.LeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.LeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.GE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeI64:l.BinaryOp.GeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeU64:l.BinaryOp.GeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS_EQUALS_EQUALS:case h.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.EQ)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.EqI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.EqI64:l.BinaryOp.EqI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.EqI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.EqF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.EqF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EXCLAMATION_EQUALS_EQUALS:case h.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.NE)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.NeI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.NeI64:l.BinaryOp.NeI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.NeI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.NeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.NeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS:return this.compileAssignment(d,m,t);case h.Token.PLUS_EQUALS:g=!0;case h.Token.PLUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.ADD)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.AddI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AddI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.AddF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.AddF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.MINUS_EQUALS:g=!0;case h.Token.MINUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.SUB)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.SubI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.SubI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.SubF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.SubF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.MUL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.MulI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.MulI64:l.BinaryOp.MulI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.MulI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.MulF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.MulF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.POW)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,_.Type.f64,1,0,d),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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case h.Token.SLASH_EQUALS:g=!0;case h.Token.SLASH:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.DIV)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.DivI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivI64:l.BinaryOp.DivI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.DivU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivU64:l.BinaryOp.DivU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.DivU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.DivF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.DivF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.PERCENT_EQUALS:g=!0;case h.Token.PERCENT:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.REM)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.RemI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemI64:l.BinaryOp.RemI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.RemU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemU64:l.BinaryOp.RemU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,T;if(!(E=this.program.elementsLookup.get("Math"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.LESSTHAN_LESSTHAN_EQUALS:g=!0;case h.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShlI64:l.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.ShrI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.ShrI64,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrI64:l.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_EQUALS:g=!0;case h.Token.AMPERSAND:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.AndI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AndI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AndI64:l.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.BAR_EQUALS:g=!0;case h.Token.BAR:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.OrI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.OrI64:l.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.CARET_EQUALS:g=!0;case h.Token.CARET:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.XorI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,o=p.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=p.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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),i,p.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case h.Token.BAR_BAR:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),p.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return g?this.compileAssignmentWithValue(d,o,t!=_.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(u.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==u.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(u.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=_.Type.void);case u.ElementKind.LOCAL:case u.ElementKind.FIELD:n=s.type;break;case u.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var l=this.resolver.resolveFunction(o,null);if(!l)return this.module.createUnreachable();assert(1==l.signature.parameterTypes.length),n=l.signature.parameterTypes[0];break}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case u.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(4096),h=s.lookupOverload(u.OperatorKind.INDEXED_SET,p);if(!h)return s.lookupOverload(u.OperatorKind.INDEXED_GET,p)?this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=_.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=_.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 u.ElementKind.LOCAL:var a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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(),l=i.internalName;return n.createBlock(null,[n.createSetGlobal(l,t),n.createGetGlobal(l,o)],o)}return n.createSetGlobal(i.internalName,t);case u.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(c.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),m=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:_.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(b=this.currentFunction).flow;var g=b.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(a.byteSize,m,n.createGetLocal(g,o),o,i.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(a.byteSize,m,t,o,i.memoryOffset);case u.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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(f,[m,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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),g=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(f,[n.createTeeLocal(g,m),t]),this.makeCallDirect(T,[n.createGetLocal(g,I)])],I)}return n.createBlock(null,[this.makeCallDirect(f,[t]),this.makeCallDirect(T)],I)}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case u.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(u.OperatorKind.INDEXED_GET,A);if(!C)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(u.OperatorKind.INDEXED_SET,A);if(!N)return this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:_.Type.void,n.createUnreachable();var O=i.type,S=(d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,_.Type.i32,1,0));if(r){var b,L=(b=this.currentFunction).getTempLocal(O,!1),k=b.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(L),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(L.index,m),n.createTeeLocal(k.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(L.index,L.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,S,t])}}return this.error(c.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 u.ElementKind.FUNCTION_PROTOTYPE:var o=s,l=e.typeArguments;if(o.hasDecorator(u.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var h=null;if(l){if(!o.is(p.CommonFlags.GENERIC))return this.error(c.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();h=this.resolver.resolveFunctionInclTypeArguments(o,l,m.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(p.CommonFlags.GENERIC)){for(var g=new Map,y=assert(o.declaration.typeParameters),f=y.length,E=0;Es&&!i)||(this.error(c.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(p.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(c.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var l=n?a+1:a,u=new Array(l),h=0;n&&(u[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(c.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,h=e.is(p.CommonFlags.INSTANCE),d=r.requiredParameters,m=d,g=i.length,y=g;h&&(++m,++y);var f=assert(y-m),E=new Array(m),T=0,I=this.module;h&&(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(p.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(f))return this.module.createUnreachable();var I=f.type;return assert(I!=_.Type.void),f.is(p.CommonFlags.INLINED)?this.compileInlineConstant(f,t,r):(this.currentType=I,this.module.createGetGlobal(f.internalName,I.toNativeType()));case u.ElementKind.ENUMVALUE:return f.is(p.CommonFlags.COMPILED)?(this.currentType=_.Type.i32,f.is(p.CommonFlags.INLINED)?this.module.createI32(f.constantValue):this.module.createGetGlobal(f.internalName,1)):(this.error(c.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=_.Type.i32,this.module.createUnreachable());case u.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(f,null,m.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(c.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=_.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?l.BinaryOp.NeI64:l.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(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==_.Type.f32?n.createF32(a):(this.currentType=_.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=_.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=_.Type.u32,n.createI32(i64_low(s))):(this.currentType=_.Type.i64,n.createI64(i64_low(s),i64_high(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(c.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 c=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*c,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(o.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(c,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(c.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PRIVATE))return this.error(c.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PROTECTED))return this.error(c.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,l=e.values,h=n.members,d=!1,_=new Array(s+2),m=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==l.length);for(var g=0,y=s;g=0);var l=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),l,i.type.toNativeType(),i.memoryOffset);case u.ElementKind.PROPERTY:return this.compileGetter(i,e);case u.ElementKind.FUNCTION_PROTOTYPE:return this.error(c.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(c.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(p.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&u.DecoratorFlags.INLINE);if(n.is(p.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==u.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),l=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,l,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(c.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,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(l.getExpressionId(o)==l.ExpressionId.Const&&1==l.getExpressionType(o))return l.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;u.free();var m=a.fork();i.flow=m;var g=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var f=_.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(c.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==_.Type.void?_.Type.i32:t,0,0);if(l.getExpressionId(i)==l.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=_.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case h.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case h.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var d,m;if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.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=_.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 h.Token.PLUS:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case h.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==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(l.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(l.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=_.Type.bool;break;case h.Token.TILDE:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t.is(8)?_.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.TYPEOF:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=_.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(l.UnaryOp.ExtendI8ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(l.UnaryOp.ExtendI16ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(l.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(l.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(l.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?l.UnaryOp.EqzI64:l.UnaryOp.EqzI32,e);case 11:return r.createBinary(l.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(l.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(l.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(l.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(l.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(l.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,s=this.currentFunction,c=this.options.nativeSizeType,l=s.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(l.index,o.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==u.ElementKind.FIELD){var g=m,y=g.type,f=y.toNativeType(),E=g.prototype.declaration;if(assert(!g.isAny(p.CommonFlags.CONST)),E.initializer)h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),this.compileExpression(E.initializer,y,1,0),f,g.memoryOffset));else{var T=g.prototype.declaration.parameterIndex;h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),T>=0?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(bson);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();"),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }"),this.sb.push("\n pushObject(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.readIndex);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+"[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n "+e+"[i32(parseInt(name))] = <"+t+">null;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.readIndex);\n return false;\n }\n pushArray(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.readIndex);\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"near.str(i)","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?(console.log("generateHandler typeName "+e.classReference.simpleName),this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0])):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, offset: i32): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, offset);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(bson);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();"),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }"),this.sb.push("\n pushObject(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+"[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n "+e+"[i32(parseInt(name))] = <"+t+">null;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state);\n return false;\n }\n pushArray(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state);\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"near.str(i)","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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--;\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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(bson);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();`);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.readIndex);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n ${valuePrefix}[i32(parseInt(name))] = <${fieldType}>null;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex);\n return false;\n }\n pushArray(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex);\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"near.str(i)\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n console.log(`generateHandler typeName ${type.classReference!.simpleName}`)\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, offset: i32): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, offset);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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 +{"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/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/tokenizer.ts","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","CALL","ELEMENTACCESS","PROPERTYACCESS","PARENTHESIZED","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","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","SUPER","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","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","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","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","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","_BinaryenModuleCreate","cachedByValue","memory","allocate","createFrom","cArr","allocU8Array","_BinaryenModuleRead","changetype","addFunctionType","result","paramTypes","cStr","allocString","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","_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","_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","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","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Return","Break","numChildren","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","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","eval","e","window","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","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","numPages","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","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","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","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","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","parentBase","thisLocal","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","scopedThis","_this_cannot_be_referenced_in_current_location","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","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","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","compileAllocate","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","classInstance","compileInstantiate","currentClassInstance","makeAllocate","propertyAccess","resolvePropertyAccess","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","fieldType","nativeFieldType","fieldDeclaration","ReportMode","currentTypeIsPlaceholder","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","contextualFunction","targetExpression","propertyName","elementAccess","explicitLocal","functionTarget","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClass","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","NEARBindingsBuilder","typeMapping","nonNullableTypes","generatedEncodeFunctions","generatedDecodeFunctions","build","generateArgsParser","generateWrapperFunction","fields","paramName","forEach","generateDecodeFunction","generateHandlerMethods","generateEncodeFunction","generateFieldEncoder","valuePrefix","setterType","this_1","matchingFields","filter","generatePushHandler","encodeType","generateArrayHandlerMethods","isArrayType","getFields","sourceExpr","generateHandler","fieldExpr","indexOf","pushType","__spread","visitInterface","mainSource","IDLBuilder","indentLevel","indent","typeToString","members_1","members_1_1","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","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","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","PREFIX","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","POSITIVE_INFINITY","Infinity","NEGATIVE_INFINITY","NaN","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","copy","dest","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","gte","lte","minSafeF64","maxSafeF64","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","tempLocal0","tempLocal1","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","allocateInstance","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","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","buildNEAR"],"mappings":"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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,OAEtCE,GACJ,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,MAA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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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(bson);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();`);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n ${valuePrefix}[i32(parseInt(name))] = <${fieldType}>null;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state);\n return false;\n }\n pushArray(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"near.str(i)\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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/src/definitions.ts b/src/definitions.ts index c90e2fa867..284ac98bb9 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -260,7 +260,7 @@ export class NEARBindingsBuilder extends ExportsWalker { fields.forEach((field) => { if (!(field.type.toString() in this.typeMapping)) { this.sb.push(`if (name == "${field.simpleName}") { - ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.readIndex); + ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state); return false; }`); } @@ -278,11 +278,11 @@ export class NEARBindingsBuilder extends ExportsWalker { }`); } else { this.sb.push(`pushObject(name: string): bool { - ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex); + ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state); return false; } pushArray(name: string): bool { - ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.readIndex); + ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state); return false; }`); } @@ -337,7 +337,6 @@ export class NEARBindingsBuilder extends ExportsWalker { decoder: JSONDecoder<__near_JSONHandler_${typeName}>; value: ${type} = new ${type}();`); if (this.isArrayType(type)) { - console.log(`generateHandler typeName ${type.classReference!.simpleName}`) this.generateArrayHandlerMethods("this.value", type.classReference!.typeArguments![0]); } else { this.generateHandlerMethods("this.value.", this.getFields(type.classReference!)); @@ -368,11 +367,11 @@ export class NEARBindingsBuilder extends ExportsWalker { } this.sb.push(`export function __near_decode_${typeName}( - buffer: Uint8Array, offset: i32): ${type} { + buffer: Uint8Array, state: DecoderState): ${type} { let handler = new __near_JSONHandler_${typeName}(); handler.buffer = buffer; handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler); - handler.decoder.deserialize(buffer, offset); + handler.decoder.deserialize(buffer, state); return handler.value; }\n`); } diff --git a/tests/near-bindgen/main.ts b/tests/near-bindgen/main.ts index e1651d2680..8a60dba454 100644 --- a/tests/near-bindgen/main.ts +++ b/tests/near-bindgen/main.ts @@ -2,7 +2,7 @@ import "allocator/arena"; // TODO: Why cannot import from index? // import { JSONEncoder, JSONDecoder } from "./json"; import { JSONEncoder } from "./json/encoder"; -import { JSONDecoder, JSONHandler, ThrowingJSONHandler } from "./json/decoder"; +import { JSONDecoder, DecoderState, JSONHandler, ThrowingJSONHandler } from "./json/decoder"; import { near } from "./near" @external("env", "log") diff --git a/tests/near-bindgen/main_near.ts.expected b/tests/near-bindgen/main_near.ts.expected index 99a2214595..12195ab8c9 100644 --- a/tests/near-bindgen/main_near.ts.expected +++ b/tests/near-bindgen/main_near.ts.expected @@ -1,8 +1,13 @@ import "allocator/arena"; // TODO: Why cannot import from index? -// import { BSONEncoder, BSONDecoder } from "./bson"; -import { BSONEncoder } from "./bson/encoder"; -import { BSONDecoder, ThrowingBSONHandler } from "./bson/decoder"; +// import { JSONEncoder, JSONDecoder } from "./json"; +import { JSONEncoder } from "./json/encoder"; +import { + JSONDecoder, + DecoderState, + JSONHandler, + ThrowingJSONHandler +} from "./json/decoder"; import { near } from "./near"; declare function log(str: string): void; @@ -17,7 +22,7 @@ export class FooBar { bar: i32 = 1; flag: bool; baz: string = "123"; - foobar: Uint8Array; + //foobar: Uint8Array; arr: Array>; } @@ -51,9 +56,9 @@ export function convertFoobars(foobars: Array): Array { ); } -export class __near_ArgsParser_doNothing extends ThrowingBSONHandler { +export class __near_ArgsParser_doNothing extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_ArgsParser_doNothing>; + decoder: JSONDecoder<__near_ArgsParser_doNothing>; setNull(name: string): void { super.setNull(name); @@ -72,13 +77,13 @@ export function near_func_doNothing(): void { input_read_into(bson.buffer.data); let handler = new __near_ArgsParser_doNothing(); handler.buffer = bson; - handler.decoder = new BSONDecoder<__near_ArgsParser_doNothing>(handler); + handler.decoder = new JSONDecoder<__near_ArgsParser_doNothing>(handler); handler.decoder.deserialize(bson); doNothing(); } -export class __near_ArgsParser_add extends ThrowingBSONHandler { +export class __near_ArgsParser_add extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_ArgsParser_add>; + decoder: JSONDecoder<__near_ArgsParser_add>; __near_param_x: i32; __near_param_y: i32; @@ -120,18 +125,18 @@ export function near_func_add(): void { input_read_into(bson.buffer.data); let handler = new __near_ArgsParser_add(); handler.buffer = bson; - handler.decoder = new BSONDecoder<__near_ArgsParser_add>(handler); + handler.decoder = new JSONDecoder<__near_ArgsParser_add>(handler); handler.decoder.deserialize(bson); let result = add(handler.__near_param_x, handler.__near_param_y); - let encoder = new BSONEncoder(); + let encoder = new JSONEncoder(); encoder.setInteger("result", result); return_value(near.bufferWithSize(encoder.serialize()).buffer.data); } -export class __near_BSONHandler_ContainerClass extends ThrowingBSONHandler { +export class __near_JSONHandler_ContainerClass extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_BSONHandler_ContainerClass>; + decoder: JSONDecoder<__near_JSONHandler_ContainerClass>; value: ContainerClass = new ContainerClass(); setNull(name: string): void { if (name == "foobar") { @@ -144,10 +149,7 @@ export class __near_BSONHandler_ContainerClass extends ThrowingBSONHandler { pushObject(name: string): bool { if (name == "foobar") { - this.value.foobar = __near_decode_FooBar( - this.buffer, - this.decoder.readIndex - ); + this.value.foobar = __near_decode_FooBar(this.buffer, this.decoder.state); return false; } @@ -156,10 +158,7 @@ export class __near_BSONHandler_ContainerClass extends ThrowingBSONHandler { pushArray(name: string): bool { if (name == "foobar") { - this.value.foobar = __near_decode_FooBar( - this.buffer, - this.decoder.readIndex - ); + this.value.foobar = __near_decode_FooBar(this.buffer, this.decoder.state); return false; } @@ -167,9 +166,9 @@ export class __near_BSONHandler_ContainerClass extends ThrowingBSONHandler { } } -export class __near_BSONHandler_FooBar extends ThrowingBSONHandler { +export class __near_JSONHandler_FooBar extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_BSONHandler_FooBar>; + decoder: JSONDecoder<__near_JSONHandler_FooBar>; value: FooBar = new FooBar(); setInteger(name: string, value: i32): void { if (name == "foo") { @@ -191,14 +190,6 @@ export class __near_BSONHandler_FooBar extends ThrowingBSONHandler { super.setString(name, value); } - setUint8Array(name: string, value: Uint8Array): void { - if (name == "foobar") { - this.value.foobar = value; - return; - } - - super.setUint8Array(name, value); - } setBoolean(name: string, value: bool): void { if (name == "flag") { this.value.flag = value; @@ -224,10 +215,6 @@ export class __near_BSONHandler_FooBar extends ThrowingBSONHandler { this.value.baz = null; return; } - if (name == "foobar") { - this.value.foobar = null; - return; - } if (name == "arr") { this.value.arr = >>null; return; @@ -240,7 +227,7 @@ export class __near_BSONHandler_FooBar extends ThrowingBSONHandler { if (name == "arr") { this.value.arr = __near_decode_Array_Array_String( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } @@ -252,7 +239,7 @@ export class __near_BSONHandler_FooBar extends ThrowingBSONHandler { if (name == "arr") { this.value.arr = __near_decode_Array_Array_String( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } @@ -261,29 +248,29 @@ export class __near_BSONHandler_FooBar extends ThrowingBSONHandler { } } -export class __near_BSONHandler_Array_Array_String extends ThrowingBSONHandler { +export class __near_JSONHandler_Array_Array_String extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_BSONHandler_Array_Array_String>; + decoder: JSONDecoder<__near_JSONHandler_Array_Array_String>; value: Array> = new Array>(); pushObject(name: string): bool { this.value[i32(parseInt(name))] = __near_decode_Array_String( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } pushArray(name: string): bool { this.value[i32(parseInt(name))] = __near_decode_Array_String( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } } -export class __near_BSONHandler_Array_String extends ThrowingBSONHandler { +export class __near_JSONHandler_Array_String extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_BSONHandler_Array_String>; + decoder: JSONDecoder<__near_JSONHandler_Array_String>; value: Array = new Array(); setString(name: string, value: String): void { this.value[i32(parseInt(name))] = value; @@ -295,50 +282,53 @@ export class __near_BSONHandler_Array_String extends ThrowingBSONHandler { export function __near_decode_Array_String( buffer: Uint8Array, - offset: i32 + state: DecoderState ): Array { - let handler = new __near_BSONHandler_Array_String(); + let handler = new __near_JSONHandler_Array_String(); handler.buffer = buffer; - handler.decoder = new BSONDecoder<__near_BSONHandler_Array_String>(handler); - handler.decoder.deserialize(buffer, offset); + handler.decoder = new JSONDecoder<__near_JSONHandler_Array_String>(handler); + handler.decoder.deserialize(buffer, state); return handler.value; } export function __near_decode_Array_Array_String( buffer: Uint8Array, - offset: i32 + state: DecoderState ): Array> { - let handler = new __near_BSONHandler_Array_Array_String(); + let handler = new __near_JSONHandler_Array_Array_String(); handler.buffer = buffer; - handler.decoder = new BSONDecoder<__near_BSONHandler_Array_Array_String>( + handler.decoder = new JSONDecoder<__near_JSONHandler_Array_Array_String>( handler ); - handler.decoder.deserialize(buffer, offset); + handler.decoder.deserialize(buffer, state); return handler.value; } -export function __near_decode_FooBar(buffer: Uint8Array, offset: i32): FooBar { - let handler = new __near_BSONHandler_FooBar(); +export function __near_decode_FooBar( + buffer: Uint8Array, + state: DecoderState +): FooBar { + let handler = new __near_JSONHandler_FooBar(); handler.buffer = buffer; - handler.decoder = new BSONDecoder<__near_BSONHandler_FooBar>(handler); - handler.decoder.deserialize(buffer, offset); + handler.decoder = new JSONDecoder<__near_JSONHandler_FooBar>(handler); + handler.decoder.deserialize(buffer, state); return handler.value; } export function __near_decode_ContainerClass( buffer: Uint8Array, - offset: i32 + state: DecoderState ): ContainerClass { - let handler = new __near_BSONHandler_ContainerClass(); + let handler = new __near_JSONHandler_ContainerClass(); handler.buffer = buffer; - handler.decoder = new BSONDecoder<__near_BSONHandler_ContainerClass>(handler); - handler.decoder.deserialize(buffer, offset); + handler.decoder = new JSONDecoder<__near_JSONHandler_ContainerClass>(handler); + handler.decoder.deserialize(buffer, state); return handler.value; } -export class __near_ArgsParser_getFoobar extends ThrowingBSONHandler { +export class __near_ArgsParser_getFoobar extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_ArgsParser_getFoobar>; + decoder: JSONDecoder<__near_ArgsParser_getFoobar>; __near_param_container: ContainerClass; setNull(name: string): void { @@ -354,7 +344,7 @@ export class __near_ArgsParser_getFoobar extends ThrowingBSONHandler { if (name == "container") { this.__near_param_container = __near_decode_ContainerClass( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } @@ -366,7 +356,7 @@ export class __near_ArgsParser_getFoobar extends ThrowingBSONHandler { if (name == "container") { this.__near_param_container = __near_decode_ContainerClass( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } @@ -376,7 +366,7 @@ export class __near_ArgsParser_getFoobar extends ThrowingBSONHandler { } export function __near_encode_Array_String( value: Array, - encoder: BSONEncoder + encoder: JSONEncoder ): void { for (let i = 0; i < value.length; i++) { if (value[i] != null) { @@ -388,7 +378,7 @@ export function __near_encode_Array_String( } export function __near_encode_Array_Array_String( value: Array>, - encoder: BSONEncoder + encoder: JSONEncoder ): void { for (let i = 0; i < value.length; i++) { if (value[i] != null) { @@ -402,7 +392,7 @@ export function __near_encode_Array_Array_String( } export function __near_encode_FooBar( value: FooBar, - encoder: BSONEncoder + encoder: JSONEncoder ): void { encoder.setInteger("foo", value.foo); encoder.setInteger("bar", value.bar); @@ -412,11 +402,6 @@ export function __near_encode_FooBar( } else { encoder.setNull("baz"); } - if (value.foobar != null) { - encoder.setUint8Array("foobar", value.foobar); - } else { - encoder.setNull("foobar"); - } if (value.arr != null) { encoder.pushArray("arr"); __near_encode_Array_Array_String(value.arr, encoder); @@ -427,7 +412,7 @@ export function __near_encode_FooBar( } export function __near_encode_AnotherContainerClass( value: AnotherContainerClass, - encoder: BSONEncoder + encoder: JSONEncoder ): void { if (value.foobar != null) { encoder.pushObject("foobar"); @@ -442,11 +427,11 @@ export function near_func_getFoobar(): void { input_read_into(bson.buffer.data); let handler = new __near_ArgsParser_getFoobar(); handler.buffer = bson; - handler.decoder = new BSONDecoder<__near_ArgsParser_getFoobar>(handler); + handler.decoder = new JSONDecoder<__near_ArgsParser_getFoobar>(handler); handler.decoder.deserialize(bson); let result = getFoobar(handler.__near_param_container); - let encoder = new BSONEncoder(); + let encoder = new JSONEncoder(); if (result != null) { encoder.pushObject("result"); __near_encode_AnotherContainerClass(result, encoder); @@ -457,21 +442,21 @@ export function near_func_getFoobar(): void { return_value(near.bufferWithSize(encoder.serialize()).buffer.data); } -export class __near_BSONHandler_Array_FooBar extends ThrowingBSONHandler { +export class __near_JSONHandler_Array_FooBar extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_BSONHandler_Array_FooBar>; + decoder: JSONDecoder<__near_JSONHandler_Array_FooBar>; value: Array = new Array(); pushObject(name: string): bool { this.value[i32(parseInt(name))] = __near_decode_FooBar( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } pushArray(name: string): bool { this.value[i32(parseInt(name))] = __near_decode_FooBar( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } @@ -479,18 +464,18 @@ export class __near_BSONHandler_Array_FooBar extends ThrowingBSONHandler { export function __near_decode_Array_FooBar( buffer: Uint8Array, - offset: i32 + state: DecoderState ): Array { - let handler = new __near_BSONHandler_Array_FooBar(); + let handler = new __near_JSONHandler_Array_FooBar(); handler.buffer = buffer; - handler.decoder = new BSONDecoder<__near_BSONHandler_Array_FooBar>(handler); - handler.decoder.deserialize(buffer, offset); + handler.decoder = new JSONDecoder<__near_JSONHandler_Array_FooBar>(handler); + handler.decoder.deserialize(buffer, state); return handler.value; } -export class __near_ArgsParser_convertFoobars extends ThrowingBSONHandler { +export class __near_ArgsParser_convertFoobars extends ThrowingJSONHandler { buffer: Uint8Array; - decoder: BSONDecoder<__near_ArgsParser_convertFoobars>; + decoder: JSONDecoder<__near_ArgsParser_convertFoobars>; __near_param_foobars: Array; setNull(name: string): void { @@ -506,7 +491,7 @@ export class __near_ArgsParser_convertFoobars extends ThrowingBSONHandler { if (name == "foobars") { this.__near_param_foobars = __near_decode_Array_FooBar( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } @@ -518,7 +503,7 @@ export class __near_ArgsParser_convertFoobars extends ThrowingBSONHandler { if (name == "foobars") { this.__near_param_foobars = __near_decode_Array_FooBar( this.buffer, - this.decoder.readIndex + this.decoder.state ); return false; } @@ -528,7 +513,7 @@ export class __near_ArgsParser_convertFoobars extends ThrowingBSONHandler { } export function __near_encode_ContainerClass( value: ContainerClass, - encoder: BSONEncoder + encoder: JSONEncoder ): void { if (value.foobar != null) { encoder.pushObject("foobar"); @@ -540,7 +525,7 @@ export function __near_encode_ContainerClass( } export function __near_encode_Array_ContainerClass( value: Array, - encoder: BSONEncoder + encoder: JSONEncoder ): void { for (let i = 0; i < value.length; i++) { if (value[i] != null) { @@ -557,11 +542,11 @@ export function near_func_convertFoobars(): void { input_read_into(bson.buffer.data); let handler = new __near_ArgsParser_convertFoobars(); handler.buffer = bson; - handler.decoder = new BSONDecoder<__near_ArgsParser_convertFoobars>(handler); + handler.decoder = new JSONDecoder<__near_ArgsParser_convertFoobars>(handler); handler.decoder.deserialize(bson); let result = convertFoobars(handler.__near_param_foobars); - let encoder = new BSONEncoder(); + let encoder = new JSONEncoder(); if (result != null) { encoder.pushArray("result"); __near_encode_Array_ContainerClass(result, encoder); From 1ea0a2a317418d225956192b6b165edd56751e61 Mon Sep 17 00:00:00 2001 From: Vladimir Grichina Date: Tue, 8 Jan 2019 16:24:24 -0800 Subject: [PATCH 3/6] Make bindings work for nested objects and arrays --- dist/assemblyscript.js | 2 +- dist/assemblyscript.js.map | 2 +- src/definitions.ts | 42 +- tests/near-bindgen/main_near.ts.expected | 163 +- tests/near-bindgen/test.ts | 8 +- tests/near-bindgen/test.wat.expected | 13715 +++++++++++---------- 6 files changed, 7555 insertions(+), 6377 deletions(-) diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index 8314f51590..60e6c0fd8f 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,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=Z;var J=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 n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=xe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=xe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.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}(j);t.DeclarationStatement=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return n(t,e),t}(J);t.IndexSignatureDeclaration=$;var ee=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(J);t.VariableLikeDeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(j);t.BlockStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(j);t.BreakStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.ClassDeclaration=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(j);t.ContinueStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(j);t.DoStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(j);t.EmptyStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(J);t.EnumDeclaration=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(J);t.EnumValueDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(j);t.ExportStatement=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(j);t.ExpressionStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}(ee);t.FieldDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(j);t.ForStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(j);t.IfStatement=ge;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(J);t.ImportDeclaration=ye;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(j);t.ImportStatement=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(ne);t.InterfaceDeclaration=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(me);t.MethodDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(J);t.NamespaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(j);t.ReturnStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(j);t.SwitchStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(j);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(j);t.TryStatement=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(J);t.TypeDeclaration=Se;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}(ee);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(j);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(j);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(j);function xe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?xe(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?xe(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Fe(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}}}},a=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 s,o=r(0),c=r(1),l=r(6),p=r(3),u=r(5),h=r(11),d=function(){return function(){}}(),_=function(){return function(){}}(),m=function(){return function(){}}();function g(e,t){switch(assert(t.length),e){case p.DecoratorKind.OPERATOR:case p.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 p.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 p.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 y,f,E=new Map,T=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=E,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=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 h.Resolver(r),r.sources=[],r}return n(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(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=s);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var o=0;switch(u.getExpressionType(e)){case 1:o=u.getConstValueI32(e);break;case 2:o=u.getConstValueI64Low(e);break;case 3:o=i32(u.getConstValueF32(e));break;case 4:o=i32(u.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 u.ExpressionId.Load:var c=void 0;switch(u.getLoadBytes(e)){case 1:c=u.isLoadSigned(e)?l.Type.i8:l.Type.u8;break;case 2:c=u.isLoadSigned(e)?l.Type.i16:l.Type.u16;break;default:c=u.isLoadSigned(e)?l.Type.i32:l.Type.u32}return z(c,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var p=assert(u.getBlockChildCount(e)),h=u.getBlockChild(e,p-1);return this.canOverflow(h,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(u.getCallTarget(e))));assert(_.kind==y.FUNCTION);var m=_.signature.returnType;return!_.flow.is(2)||z(m,t);case u.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 z(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=K},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";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||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(1),o=r(3),c=r(2);function l(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function p(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:case i.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"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=l,t.tokenIsAlsoIdentifier=p,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=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=u;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(c.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(c.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 _=null},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(23),c=r(1),l=r(5),p=r(0),u=r(4),h=r(8),d=r(3),_=r(6),m=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var g=function(){function e(){this.target=s.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==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?_.Type.usize64:_.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?_.Type.isize64:_.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?2:1},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"}(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 y,f,E=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=_.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=l.Module.create(),n}return n(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,s=this.program;s.initialize(r);var c=new u.Function(s.startFunction,"start",new _.Signature([],_.Type.void));this.startFunctionInstance=c;var p=new Array;this.startFunctionBody=p,this.currentFunction=c,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var h=s.sources,d=0,m=h.length;d"),!1;e.type=this.currentType,e.set(p.CommonFlags.RESOLVED)}else assert(!1);if(e.is(p.CommonFlags.AMBIENT)&&e.hasDecorator(u.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?T(e,r):(y="env",f=e.simpleName),t.addGlobalImport(e.internalName,y,f,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(c.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)),l.getExpressionId(n)!=l.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),l.getExpressionId(n)!=l.ExpressionId.Const&&(this.warning(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(u.DecoratorFlags.INLINE)&&!o){switch(assert(l.getExpressionId(n)==l.ExpressionId.Const),l.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI64Low(n),l.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var h=e.internalName;return o?(t.addGlobal(h,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(h,n))):t.addGlobal(h,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==u.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null,s=!1;if(e.members)try{for(var o=i(e.members.values()),h=o.next();!h.done;h=o.next()){var d=h.value;if(d.kind==u.ElementKind.ENUMVALUE){var m=!1,g=d,y=g.declaration;g.set(p.CommonFlags.COMPILED);var f=void 0;y.value?(f=this.compileExpression(y.value,_.Type.i32,1,0),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)?(f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),m=!0)):m=!0)):null==a?f=n.createI32(0):(s&&this.error(c.DiagnosticCode.Enum_member_must_have_initializer,y.range),f=n.createBinary(l.BinaryOp.AddI32,n.createGetGlobal(a.internalName,1),n.createI32(1)),f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),m=!0)),m?(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(p.CommonFlags.CONST),f),s=!1),a=g}}}catch(e){t={error:e}}finally{try{h&&!h.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==u.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(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var g=t.createBlock("case0|"+a,p,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),o.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(c.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==d.NodeKind.SOURCE){for(var s=0;s");continue}f=this.currentType}var T=!1;if(g.is(p.CommonFlags.CONST))if(E)if(E=this.module.precomputeExpression(E),l.getExpressionId(E)==l.ExpressionId.Const){var I=new u.Local(r,y,-1,f);switch(l.getExpressionType(E)){case 1:I=I.withConstantIntegerValue(i64_new(l.getConstValueI32(E),0));break;case 2:I=I.withConstantIntegerValue(i64_new(l.getConstValueI64Low(E),l.getConstValueI64High(E)));break;case 3:I=I.withConstantFloatValue(l.getConstValueF32(E));break;case 4:I=I.withConstantFloatValue(l.getConstValueF64(E));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(c.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(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,g.range);else this.error(c.DiagnosticCode._const_declarations_must_be_initialized,g.range);if(!T){I=void 0;I=g.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||h.is(2048)?h.addScopedLocal(f,y,!1,g):n.addLocal(f,y,g),E?(o.push(this.compileAssignmentWithValue(g.name,E)),I.type.is(36)&&h.setLocalWrapped(I.index,!h.canOverflow(E,f))):I.type.is(36)&&h.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,_.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(l.getExpressionId(n)==l.ExpressionId.Const&&1==l.getExpressionType(n)){if(!l.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.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 u="continue|"+a;o.continueLabel=u;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(u,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(u)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.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(_.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(u.DecoratorFlags.BUILTIN)||t!=_.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=_.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(c.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==_.Type.void?_.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(c.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(c.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(l.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(l.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToI64,e):s.createUnary(l.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToU64,e):s.createUnary(l.UnaryOp.TruncF32ToU32,e):r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToI64,e):s.createUnary(l.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToU64,e):s.createUnary(l.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)?l.UnaryOp.ConvertI64ToF32:l.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF32:l.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?l.UnaryOp.ConvertI64ToF64:l.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF64:l.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(l.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?l.UnaryOp.ExtendI32:l.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GtI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtI64:l.BinaryOp.GtI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GtU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtU64:l.BinaryOp.GtU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GtU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GtF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GtF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.LE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.LeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeI64:l.BinaryOp.LeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.LeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeU64:l.BinaryOp.LeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.LeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.LeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.LeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.GE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeI64:l.BinaryOp.GeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeU64:l.BinaryOp.GeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS_EQUALS_EQUALS:case h.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.EQ)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.EqI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.EqI64:l.BinaryOp.EqI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.EqI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.EqF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.EqF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EXCLAMATION_EQUALS_EQUALS:case h.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.NE)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.NeI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.NeI64:l.BinaryOp.NeI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.NeI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.NeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.NeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS:return this.compileAssignment(d,m,t);case h.Token.PLUS_EQUALS:g=!0;case h.Token.PLUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.ADD)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.AddI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AddI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.AddF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.AddF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.MINUS_EQUALS:g=!0;case h.Token.MINUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.SUB)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.SubI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.SubI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.SubF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.SubF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.MUL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.MulI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.MulI64:l.BinaryOp.MulI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.MulI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.MulF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.MulF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.POW)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,_.Type.f64,1,0,d),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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case h.Token.SLASH_EQUALS:g=!0;case h.Token.SLASH:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.DIV)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.DivI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivI64:l.BinaryOp.DivI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.DivU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivU64:l.BinaryOp.DivU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.DivU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.DivF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.DivF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.PERCENT_EQUALS:g=!0;case h.Token.PERCENT:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.REM)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.RemI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemI64:l.BinaryOp.RemI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.RemU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemU64:l.BinaryOp.RemU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,T;if(!(E=this.program.elementsLookup.get("Math"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.LESSTHAN_LESSTHAN_EQUALS:g=!0;case h.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShlI64:l.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.ShrI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.ShrI64,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrI64:l.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_EQUALS:g=!0;case h.Token.AMPERSAND:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.AndI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AndI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AndI64:l.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.BAR_EQUALS:g=!0;case h.Token.BAR:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.OrI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.OrI64:l.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.CARET_EQUALS:g=!0;case h.Token.CARET:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.XorI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,o=p.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=p.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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),i,p.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case h.Token.BAR_BAR:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),p.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return g?this.compileAssignmentWithValue(d,o,t!=_.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(u.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==u.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(u.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=_.Type.void);case u.ElementKind.LOCAL:case u.ElementKind.FIELD:n=s.type;break;case u.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var l=this.resolver.resolveFunction(o,null);if(!l)return this.module.createUnreachable();assert(1==l.signature.parameterTypes.length),n=l.signature.parameterTypes[0];break}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case u.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(4096),h=s.lookupOverload(u.OperatorKind.INDEXED_SET,p);if(!h)return s.lookupOverload(u.OperatorKind.INDEXED_GET,p)?this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=_.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=_.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 u.ElementKind.LOCAL:var a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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(),l=i.internalName;return n.createBlock(null,[n.createSetGlobal(l,t),n.createGetGlobal(l,o)],o)}return n.createSetGlobal(i.internalName,t);case u.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(c.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),m=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:_.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(b=this.currentFunction).flow;var g=b.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(a.byteSize,m,n.createGetLocal(g,o),o,i.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(a.byteSize,m,t,o,i.memoryOffset);case u.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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(f,[m,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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),g=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(f,[n.createTeeLocal(g,m),t]),this.makeCallDirect(T,[n.createGetLocal(g,I)])],I)}return n.createBlock(null,[this.makeCallDirect(f,[t]),this.makeCallDirect(T)],I)}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case u.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(u.OperatorKind.INDEXED_GET,A);if(!C)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(u.OperatorKind.INDEXED_SET,A);if(!N)return this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:_.Type.void,n.createUnreachable();var O=i.type,S=(d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,_.Type.i32,1,0));if(r){var b,L=(b=this.currentFunction).getTempLocal(O,!1),k=b.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(L),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(L.index,m),n.createTeeLocal(k.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(L.index,L.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,S,t])}}return this.error(c.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 u.ElementKind.FUNCTION_PROTOTYPE:var o=s,l=e.typeArguments;if(o.hasDecorator(u.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var h=null;if(l){if(!o.is(p.CommonFlags.GENERIC))return this.error(c.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();h=this.resolver.resolveFunctionInclTypeArguments(o,l,m.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(p.CommonFlags.GENERIC)){for(var g=new Map,y=assert(o.declaration.typeParameters),f=y.length,E=0;Es&&!i)||(this.error(c.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(p.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(c.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var l=n?a+1:a,u=new Array(l),h=0;n&&(u[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(c.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,h=e.is(p.CommonFlags.INSTANCE),d=r.requiredParameters,m=d,g=i.length,y=g;h&&(++m,++y);var f=assert(y-m),E=new Array(m),T=0,I=this.module;h&&(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(p.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(f))return this.module.createUnreachable();var I=f.type;return assert(I!=_.Type.void),f.is(p.CommonFlags.INLINED)?this.compileInlineConstant(f,t,r):(this.currentType=I,this.module.createGetGlobal(f.internalName,I.toNativeType()));case u.ElementKind.ENUMVALUE:return f.is(p.CommonFlags.COMPILED)?(this.currentType=_.Type.i32,f.is(p.CommonFlags.INLINED)?this.module.createI32(f.constantValue):this.module.createGetGlobal(f.internalName,1)):(this.error(c.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=_.Type.i32,this.module.createUnreachable());case u.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(f,null,m.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(c.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=_.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?l.BinaryOp.NeI64:l.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(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==_.Type.f32?n.createF32(a):(this.currentType=_.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=_.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=_.Type.u32,n.createI32(i64_low(s))):(this.currentType=_.Type.i64,n.createI64(i64_low(s),i64_high(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(c.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 c=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*c,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(o.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(c,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(c.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PRIVATE))return this.error(c.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PROTECTED))return this.error(c.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,l=e.values,h=n.members,d=!1,_=new Array(s+2),m=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==l.length);for(var g=0,y=s;g=0);var l=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),l,i.type.toNativeType(),i.memoryOffset);case u.ElementKind.PROPERTY:return this.compileGetter(i,e);case u.ElementKind.FUNCTION_PROTOTYPE:return this.error(c.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(c.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(p.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&u.DecoratorFlags.INLINE);if(n.is(p.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==u.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),l=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,l,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(c.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,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(l.getExpressionId(o)==l.ExpressionId.Const&&1==l.getExpressionType(o))return l.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;u.free();var m=a.fork();i.flow=m;var g=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var f=_.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(c.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==_.Type.void?_.Type.i32:t,0,0);if(l.getExpressionId(i)==l.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=_.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case h.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case h.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var d,m;if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.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=_.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 h.Token.PLUS:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case h.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==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(l.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(l.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=_.Type.bool;break;case h.Token.TILDE:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t.is(8)?_.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.TYPEOF:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=_.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(l.UnaryOp.ExtendI8ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(l.UnaryOp.ExtendI16ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(l.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(l.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(l.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?l.UnaryOp.EqzI64:l.UnaryOp.EqzI32,e);case 11:return r.createBinary(l.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(l.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(l.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(l.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(l.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(l.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,s=this.currentFunction,c=this.options.nativeSizeType,l=s.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(l.index,o.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==u.ElementKind.FIELD){var g=m,y=g.type,f=y.toNativeType(),E=g.prototype.declaration;if(assert(!g.isAny(p.CommonFlags.CONST)),E.initializer)h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),this.compileExpression(E.initializer,y,1,0),f,g.memoryOffset));else{var T=g.prototype.declaration.parameterIndex;h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),T>=0?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(bson);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();"),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }"),this.sb.push("\n pushObject(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,t),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+"[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n "+e+"[i32(parseInt(name))] = <"+t+">null;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state);\n return false;\n }\n pushArray(name: string): bool {\n "+e+"[i32(parseInt(name))] = __near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state);\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"near.str(i)","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n handledRoot: boolean = false;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(json);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n "),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }");var s=t.filter(function(e){return!(e.type.toString()in r.typeMapping)});this.sb.push("\n pushObject(name: string): bool {"),this.sb.push("if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }"),this.generatePushHandler(e,s.filter(function(e){return!r.isArrayType(e.type)})),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,s.filter(function(e){return r.isArrayType(e.type)})),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+".push(value);\n }\n setNull(name: string): void {\n "+e+".push(<"+t+">null);\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"null","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n handledRoot: boolean = false;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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--;\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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let bson = new Uint8Array(input_read_len());\n input_read_into(bson.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = bson;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(bson);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();`);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, fields);\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}[i32(parseInt(name))] = value;\n }\n setNull(name: string): void {\n ${valuePrefix}[i32(parseInt(name))] = <${fieldType}>null;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state);\n return false;\n }\n pushArray(name: string): bool {\n ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"near.str(i)\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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 +{"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/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/tokenizer.ts","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","CALL","ELEMENTACCESS","PROPERTYACCESS","PARENTHESIZED","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","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","SUPER","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","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","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","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","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","_BinaryenModuleCreate","cachedByValue","memory","allocate","createFrom","cArr","allocU8Array","_BinaryenModuleRead","changetype","addFunctionType","result","paramTypes","cStr","allocString","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","_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","_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","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","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Return","Break","numChildren","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","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","eval","e","window","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","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","numPages","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","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","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","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","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","parentBase","thisLocal","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","scopedThis","_this_cannot_be_referenced_in_current_location","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","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","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","compileAllocate","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","classInstance","compileInstantiate","currentClassInstance","makeAllocate","propertyAccess","resolvePropertyAccess","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","fieldType","nativeFieldType","fieldDeclaration","ReportMode","currentTypeIsPlaceholder","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","contextualFunction","targetExpression","propertyName","elementAccess","explicitLocal","functionTarget","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClass","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","NEARBindingsBuilder","typeMapping","nonNullableTypes","generatedEncodeFunctions","generatedDecodeFunctions","build","generateArgsParser","generateWrapperFunction","fields","paramName","forEach","generateDecodeFunction","generateHandlerMethods","generateEncodeFunction","generateFieldEncoder","valuePrefix","setterType","this_1","matchingFields","filter","nonBasicFields","generatePushHandler","isArrayType","encodeType","generateArrayHandlerMethods","getFields","sourceExpr","generateHandler","fieldExpr","indexOf","pushType","__spread","visitInterface","mainSource","IDLBuilder","indentLevel","indent","typeToString","members_1","members_1_1","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","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","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","PREFIX","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","POSITIVE_INFINITY","Infinity","NEGATIVE_INFINITY","NaN","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","copy","dest","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","gte","lte","minSafeF64","maxSafeF64","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","tempLocal0","tempLocal1","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","allocateInstance","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","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","buildNEAR"],"mappings":"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M,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,OAEtCE,GACJ,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,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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n handledRoot: boolean = false;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(json);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n `);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping));\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.sb.push(`if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}.push(value);\n }\n setNull(name: string): void {\n ${valuePrefix}.push(<${fieldType}>null);\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"null\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n handledRoot: boolean = false;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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/src/definitions.ts b/src/definitions.ts index 284ac98bb9..66961dff45 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -171,6 +171,7 @@ export class NEARBindingsBuilder extends ExportsWalker { this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>; + handledRoot: boolean = false; `); if (signature.parameterNames) { fields.forEach((field) => { @@ -188,12 +189,12 @@ export class NEARBindingsBuilder extends ExportsWalker { let returnType = signature.returnType; this.generateEncodeFunction(returnType); this.sb.push(`export function near_func_${element.simpleName}(): void { - let bson = new Uint8Array(input_read_len()); - input_read_into(bson.buffer.data); + let json = new Uint8Array(input_read_len()); + input_read_into(json.buffer.data); let handler = new __near_ArgsParser_${element.simpleName}(); - handler.buffer = bson; + handler.buffer = json; handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler); - handler.decoder.deserialize(bson);`); + handler.decoder.deserialize(json);`); if (returnType.toString() != "void") { this.sb.push(`let result = ${element.simpleName}(`); } else { @@ -205,9 +206,12 @@ export class NEARBindingsBuilder extends ExportsWalker { this.sb.push(");"); if (returnType.toString() != "void") { this.sb.push(` - let encoder = new JSONEncoder();`); + let encoder = new JSONEncoder(); + encoder.pushObject(null); + `); this.generateFieldEncoder(returnType, '"result"', "result"); this.sb.push(` + encoder.popObject(); return_value(near.bufferWithSize(encoder.serialize()).buffer.data); `); } @@ -242,15 +246,23 @@ export class NEARBindingsBuilder extends ExportsWalker { super.setNull(name); }`); + let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping)); this.sb.push(` pushObject(name: string): bool {`); - this.generatePushHandler(valuePrefix, fields); + this.sb.push(`if (!this.handledRoot) { + assert(name == null); + this.handledRoot = true; + return true; + } else { + assert(name != null); + }`); + this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type))); this.sb.push(` return super.pushObject(name); }`); this.sb.push(` pushArray(name: string): bool {`); - this.generatePushHandler(valuePrefix, fields); + this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type))); this.sb.push(` return super.pushArray(name); }`); @@ -271,18 +283,23 @@ export class NEARBindingsBuilder extends ExportsWalker { let setterType = this.typeMapping[fieldType.toString()]; if (setterType) { this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void { - ${valuePrefix}[i32(parseInt(name))] = value; + ${valuePrefix}.push(value); } setNull(name: string): void { - ${valuePrefix}[i32(parseInt(name))] = <${fieldType}>null; + ${valuePrefix}.push(<${fieldType}>null); }`); } else { this.sb.push(`pushObject(name: string): bool { - ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state); + ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state)); return false; } pushArray(name: string): bool { - ${valuePrefix}[i32(parseInt(name))] = __near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state); + assert(name == null); + if (!this.handledRoot) { + this.handledRoot = true; + return true; + } + ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state)); return false; }`); } @@ -307,7 +324,7 @@ export class NEARBindingsBuilder extends ExportsWalker { value: ${type.toString()}, encoder: JSONEncoder): void {`); this.sb.push(`for (let i = 0; i < value.length; i++) {`); - this.generateFieldEncoder(type.classReference.typeArguments![0], "near.str(i)", "value[i]"); + this.generateFieldEncoder(type.classReference.typeArguments![0], "null", "value[i]"); this.sb.push("}"); } else { @@ -335,6 +352,7 @@ export class NEARBindingsBuilder extends ExportsWalker { this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_JSONHandler_${typeName}>; + handledRoot: boolean = false; value: ${type} = new ${type}();`); if (this.isArrayType(type)) { this.generateArrayHandlerMethods("this.value", type.classReference!.typeArguments![0]); diff --git a/tests/near-bindgen/main_near.ts.expected b/tests/near-bindgen/main_near.ts.expected index 12195ab8c9..4848886c16 100644 --- a/tests/near-bindgen/main_near.ts.expected +++ b/tests/near-bindgen/main_near.ts.expected @@ -59,12 +59,21 @@ export function convertFoobars(foobars: Array): Array { export class __near_ArgsParser_doNothing extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_ArgsParser_doNothing>; + handledRoot: boolean = false; setNull(name: string): void { super.setNull(name); } pushObject(name: string): bool { + if (!this.handledRoot) { + assert(name == null); + this.handledRoot = true; + return true; + } else { + assert(name != null); + } + return super.pushObject(name); } @@ -73,17 +82,18 @@ export class __near_ArgsParser_doNothing extends ThrowingJSONHandler { } } export function near_func_doNothing(): void { - let bson = new Uint8Array(input_read_len()); - input_read_into(bson.buffer.data); + let json = new Uint8Array(input_read_len()); + input_read_into(json.buffer.data); let handler = new __near_ArgsParser_doNothing(); - handler.buffer = bson; + handler.buffer = json; handler.decoder = new JSONDecoder<__near_ArgsParser_doNothing>(handler); - handler.decoder.deserialize(bson); + handler.decoder.deserialize(json); doNothing(); } export class __near_ArgsParser_add extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_ArgsParser_add>; + handledRoot: boolean = false; __near_param_x: i32; __near_param_y: i32; @@ -113,6 +123,14 @@ export class __near_ArgsParser_add extends ThrowingJSONHandler { } pushObject(name: string): bool { + if (!this.handledRoot) { + assert(name == null); + this.handledRoot = true; + return true; + } else { + assert(name != null); + } + return super.pushObject(name); } @@ -121,22 +139,26 @@ export class __near_ArgsParser_add extends ThrowingJSONHandler { } } export function near_func_add(): void { - let bson = new Uint8Array(input_read_len()); - input_read_into(bson.buffer.data); + let json = new Uint8Array(input_read_len()); + input_read_into(json.buffer.data); let handler = new __near_ArgsParser_add(); - handler.buffer = bson; + handler.buffer = json; handler.decoder = new JSONDecoder<__near_ArgsParser_add>(handler); - handler.decoder.deserialize(bson); + handler.decoder.deserialize(json); let result = add(handler.__near_param_x, handler.__near_param_y); let encoder = new JSONEncoder(); + encoder.pushObject(null); + encoder.setInteger("result", result); + encoder.popObject(); return_value(near.bufferWithSize(encoder.serialize()).buffer.data); } export class __near_JSONHandler_ContainerClass extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_JSONHandler_ContainerClass>; + handledRoot: boolean = false; value: ContainerClass = new ContainerClass(); setNull(name: string): void { if (name == "foobar") { @@ -148,6 +170,13 @@ export class __near_JSONHandler_ContainerClass extends ThrowingJSONHandler { } pushObject(name: string): bool { + if (!this.handledRoot) { + assert(name == null); + this.handledRoot = true; + return true; + } else { + assert(name != null); + } if (name == "foobar") { this.value.foobar = __near_decode_FooBar(this.buffer, this.decoder.state); return false; @@ -157,11 +186,6 @@ export class __near_JSONHandler_ContainerClass extends ThrowingJSONHandler { } pushArray(name: string): bool { - if (name == "foobar") { - this.value.foobar = __near_decode_FooBar(this.buffer, this.decoder.state); - return false; - } - return super.pushArray(name); } } @@ -169,6 +193,7 @@ export class __near_JSONHandler_ContainerClass extends ThrowingJSONHandler { export class __near_JSONHandler_FooBar extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_JSONHandler_FooBar>; + handledRoot: boolean = false; value: FooBar = new FooBar(); setInteger(name: string, value: i32): void { if (name == "foo") { @@ -224,12 +249,12 @@ export class __near_JSONHandler_FooBar extends ThrowingJSONHandler { } pushObject(name: string): bool { - if (name == "arr") { - this.value.arr = __near_decode_Array_Array_String( - this.buffer, - this.decoder.state - ); - return false; + if (!this.handledRoot) { + assert(name == null); + this.handledRoot = true; + return true; + } else { + assert(name != null); } return super.pushObject(name); @@ -251,18 +276,22 @@ export class __near_JSONHandler_FooBar extends ThrowingJSONHandler { export class __near_JSONHandler_Array_Array_String extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_JSONHandler_Array_Array_String>; + handledRoot: boolean = false; value: Array> = new Array>(); pushObject(name: string): bool { - this.value[i32(parseInt(name))] = __near_decode_Array_String( - this.buffer, - this.decoder.state + this.value.push( + __near_decode_Array_String(this.buffer, this.decoder.state) ); return false; } pushArray(name: string): bool { - this.value[i32(parseInt(name))] = __near_decode_Array_String( - this.buffer, - this.decoder.state + assert(name == null); + if (!this.handledRoot) { + this.handledRoot = true; + return true; + } + this.value.push( + __near_decode_Array_String(this.buffer, this.decoder.state) ); return false; } @@ -271,12 +300,13 @@ export class __near_JSONHandler_Array_Array_String extends ThrowingJSONHandler { export class __near_JSONHandler_Array_String extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_JSONHandler_Array_String>; + handledRoot: boolean = false; value: Array = new Array(); setString(name: string, value: String): void { - this.value[i32(parseInt(name))] = value; + this.value.push(value); } setNull(name: string): void { - this.value[i32(parseInt(name))] = null; + this.value.push(null); } } @@ -329,6 +359,7 @@ export function __near_decode_ContainerClass( export class __near_ArgsParser_getFoobar extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_ArgsParser_getFoobar>; + handledRoot: boolean = false; __near_param_container: ContainerClass; setNull(name: string): void { @@ -341,6 +372,13 @@ export class __near_ArgsParser_getFoobar extends ThrowingJSONHandler { } pushObject(name: string): bool { + if (!this.handledRoot) { + assert(name == null); + this.handledRoot = true; + return true; + } else { + assert(name != null); + } if (name == "container") { this.__near_param_container = __near_decode_ContainerClass( this.buffer, @@ -353,14 +391,6 @@ export class __near_ArgsParser_getFoobar extends ThrowingJSONHandler { } pushArray(name: string): bool { - if (name == "container") { - this.__near_param_container = __near_decode_ContainerClass( - this.buffer, - this.decoder.state - ); - return false; - } - return super.pushArray(name); } } @@ -370,9 +400,9 @@ export function __near_encode_Array_String( ): void { for (let i = 0; i < value.length; i++) { if (value[i] != null) { - encoder.setString(near.str(i), value[i]); + encoder.setString(null, value[i]); } else { - encoder.setNull(near.str(i)); + encoder.setNull(null); } } } @@ -382,11 +412,11 @@ export function __near_encode_Array_Array_String( ): void { for (let i = 0; i < value.length; i++) { if (value[i] != null) { - encoder.pushArray(near.str(i)); + encoder.pushArray(null); __near_encode_Array_String(value[i], encoder); encoder.popArray(); } else { - encoder.setNull(near.str(i)); + encoder.setNull(null); } } } @@ -423,15 +453,17 @@ export function __near_encode_AnotherContainerClass( } } export function near_func_getFoobar(): void { - let bson = new Uint8Array(input_read_len()); - input_read_into(bson.buffer.data); + let json = new Uint8Array(input_read_len()); + input_read_into(json.buffer.data); let handler = new __near_ArgsParser_getFoobar(); - handler.buffer = bson; + handler.buffer = json; handler.decoder = new JSONDecoder<__near_ArgsParser_getFoobar>(handler); - handler.decoder.deserialize(bson); + handler.decoder.deserialize(json); let result = getFoobar(handler.__near_param_container); let encoder = new JSONEncoder(); + encoder.pushObject(null); + if (result != null) { encoder.pushObject("result"); __near_encode_AnotherContainerClass(result, encoder); @@ -440,24 +472,25 @@ export function near_func_getFoobar(): void { encoder.setNull("result"); } + encoder.popObject(); return_value(near.bufferWithSize(encoder.serialize()).buffer.data); } export class __near_JSONHandler_Array_FooBar extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_JSONHandler_Array_FooBar>; + handledRoot: boolean = false; value: Array = new Array(); pushObject(name: string): bool { - this.value[i32(parseInt(name))] = __near_decode_FooBar( - this.buffer, - this.decoder.state - ); + this.value.push(__near_decode_FooBar(this.buffer, this.decoder.state)); return false; } pushArray(name: string): bool { - this.value[i32(parseInt(name))] = __near_decode_FooBar( - this.buffer, - this.decoder.state - ); + assert(name == null); + if (!this.handledRoot) { + this.handledRoot = true; + return true; + } + this.value.push(__near_decode_FooBar(this.buffer, this.decoder.state)); return false; } } @@ -476,6 +509,7 @@ export function __near_decode_Array_FooBar( export class __near_ArgsParser_convertFoobars extends ThrowingJSONHandler { buffer: Uint8Array; decoder: JSONDecoder<__near_ArgsParser_convertFoobars>; + handledRoot: boolean = false; __near_param_foobars: Array; setNull(name: string): void { @@ -488,12 +522,12 @@ export class __near_ArgsParser_convertFoobars extends ThrowingJSONHandler { } pushObject(name: string): bool { - if (name == "foobars") { - this.__near_param_foobars = __near_decode_Array_FooBar( - this.buffer, - this.decoder.state - ); - return false; + if (!this.handledRoot) { + assert(name == null); + this.handledRoot = true; + return true; + } else { + assert(name != null); } return super.pushObject(name); @@ -529,24 +563,26 @@ export function __near_encode_Array_ContainerClass( ): void { for (let i = 0; i < value.length; i++) { if (value[i] != null) { - encoder.pushObject(near.str(i)); + encoder.pushObject(null); __near_encode_ContainerClass(value[i], encoder); encoder.popObject(); } else { - encoder.setNull(near.str(i)); + encoder.setNull(null); } } } export function near_func_convertFoobars(): void { - let bson = new Uint8Array(input_read_len()); - input_read_into(bson.buffer.data); + let json = new Uint8Array(input_read_len()); + input_read_into(json.buffer.data); let handler = new __near_ArgsParser_convertFoobars(); - handler.buffer = bson; + handler.buffer = json; handler.decoder = new JSONDecoder<__near_ArgsParser_convertFoobars>(handler); - handler.decoder.deserialize(bson); + handler.decoder.deserialize(json); let result = convertFoobars(handler.__near_param_foobars); let encoder = new JSONEncoder(); + encoder.pushObject(null); + if (result != null) { encoder.pushArray("result"); __near_encode_Array_ContainerClass(result, encoder); @@ -555,5 +591,6 @@ export function near_func_convertFoobars(): void { encoder.setNull("result"); } + encoder.popObject(); return_value(near.bufferWithSize(encoder.serialize()).buffer.data); } diff --git a/tests/near-bindgen/test.ts b/tests/near-bindgen/test.ts index 1b703c60bd..6ea704648f 100644 --- a/tests/near-bindgen/test.ts +++ b/tests/near-bindgen/test.ts @@ -1,7 +1,7 @@ import * as main from "./main_near"; -import { BSONEncoder } from "./bson/encoder"; +import { JSONEncoder } from "./json/encoder"; @external("env", "log") declare function log(str: string): void; @@ -12,7 +12,7 @@ export function runTest(): void { original.bar = 123; original.flag = true; original.baz = "foo"; - let encoder: BSONEncoder = new BSONEncoder(); + let encoder: JSONEncoder = new JSONEncoder(); main.__near_encode_FooBar(original, encoder); let encoded = encoder.serialize(); let decoded = main.__near_decode_FooBar(encoded, 0); @@ -20,12 +20,12 @@ export function runTest(): void { assert(original.foo == decoded.foo); assert(original.bar == decoded.bar); - let argsEncoder: BSONEncoder = new BSONEncoder(); + let argsEncoder: JSONEncoder = new JSONEncoder(); argsEncoder.setInteger("x", 1); argsEncoder.setInteger("y", 2); let addBsonStr = bin2hex(argsEncoder.serialize()); - let expectedResultEncoder: BSONEncoder = new BSONEncoder(); + let expectedResultEncoder: JSONEncoder = new JSONEncoder(); expectedResultEncoder.setInteger("result", 3); /* diff --git a/tests/near-bindgen/test.wat.expected b/tests/near-bindgen/test.wat.expected index 365e727da5..6dfb77818b 100644 --- a/tests/near-bindgen/test.wat.expected +++ b/tests/near-bindgen/test.wat.expected @@ -1,59 +1,98 @@ (module - (type $v (func)) - (type $ii (func (param i32) (result i32))) (type $iii (func (param i32 i32) (result i32))) (type $iiiiv (func (param i32 i32 i32 i32))) - (type $iiiv (func (param i32 i32 i32))) + (type $v (func)) + (type $ii (func (param i32) (result i32))) (type $iiv (func (param i32 i32))) + (type $iiiv (func (param i32 i32 i32))) + (type $iiiiiv (func (param i32 i32 i32 i32 i32))) (type $iiiiii (func (param i32 i32 i32 i32 i32) (result i32))) - (type $iv (func (param i32))) (type $iiii (func (param i32 i32 i32) (result i32))) - (type $iiiiiv (func (param i32 i32 i32 i32 i32))) - (type $iiF (func (param i32 i32) (result f64))) + (type $iv (func (param i32))) (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (memory $0 1) - (data (i32.const 8) "\03\00\00\001\002\003\00") - (data (i32.const 24) "\03\00\00\00f\00o\00o\00") - (data (i32.const 40) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") - (data (i32.const 72) "\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 136) "\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 200) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 232) "\03\00\00\00b\00a\00r\00") - (data (i32.const 248) "\04\00\00\00f\00l\00a\00g\00") - (data (i32.const 264) "\03\00\00\00b\00a\00z\00") - (data (i32.const 280) "\06\00\00\00f\00o\00o\00b\00a\00r\00") - (data (i32.const 296) "\03\00\00\00a\00r\00r\00") - (data (i32.const 312) "\00\00\00\00") - (data (i32.const 320) "\01\00\00\000\00") - (data (i32.const 328) "\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 384) "\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 896) "\80\01\00\00d\00\00\00") - (data (i32.const 904) "\01\00\00\00,\00") - (data (i32.const 912) "\1e\00\00\00D\00o\00c\00u\00m\00e\00n\00t\00 \00e\00r\00r\00o\00r\00:\00 \00S\00i\00z\00e\00 \00<\00 \005\00 \00b\00y\00t\00e\00s\00") - (data (i32.const 976) "\0f\00\00\00b\00s\00o\00n\00/\00d\00e\00c\00o\00d\00e\00r\00.\00t\00s\00") - (data (i32.const 1016) "\1d\00\00\00D\00o\00c\00u\00m\00e\00n\00t\00 \00e\00r\00r\00o\00r\00:\00 \00S\00i\00z\00e\00 \00m\00i\00s\00m\00a\00t\00c\00h\00") - (data (i32.const 1080) "#\00\00\00D\00o\00c\00u\00m\00e\00n\00t\00 \00e\00r\00r\00o\00r\00:\00 \00M\00i\00s\00s\00i\00n\00g\00 \00t\00e\00r\00m\00i\00n\00a\00t\00i\00o\00n\00") - (data (i32.const 1160) " \00\00\00D\00o\00c\00u\00m\00e\00n\00t\00 \00e\00r\00r\00o\00r\00:\00 \00I\00l\00l\00e\00g\00a\00l\00 \00k\00e\00y\00 \00n\00a\00m\00e\00") - (data (i32.const 1232) "\04\00\00\00n\00u\00l\00l\00") - (data (i32.const 1248) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00s\00t\00r\00i\00n\00g\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 1304) "\04\00\00\00 \00:\00 \00\"\00") - (data (i32.const 1320) "\01\00\00\00\"\00") - (data (i32.const 1328) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00o\00b\00j\00e\00c\00t\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 1384) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00a\00r\00r\00a\00y\00 \00f\00i\00e\00l\00d\00") - (data (i32.const 1432) "\1c\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00b\00y\00t\00e\00 \00a\00r\00r\00a\00y\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 1496) "\03\00\00\00 \00:\00 \00") - (data (i32.const 1512) "\19\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00b\00o\00o\00l\00e\00a\00n\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 1568) "\04\00\00\00t\00r\00u\00e\00") - (data (i32.const 1584) "\05\00\00\00f\00a\00l\00s\00e\00") - (data (i32.const 1600) "\19\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00i\00n\00t\00e\00g\00e\00r\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 1656) "\1e\00\00\00P\00a\00r\00s\00i\00n\00g\00 \00e\00r\00r\00o\00r\00:\00 \00U\00n\00k\00n\00o\00w\00n\00 \00e\00l\00e\00m\00e\00n\00t\00") - (data (i32.const 1720) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00n\00u\00l\00l\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 1768) "\07\00\00\00t\00e\00s\00t\00.\00t\00s\00") - (data (i32.const 1792) "\01\00\00\00x\00") - (data (i32.const 1800) "\01\00\00\00y\00") - (data (i32.const 1808) "\10\00\00\000\001\002\003\004\005\006\007\008\009\00A\00B\00C\00D\00E\00F\00") - (data (i32.const 1848) "\10\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00") - (data (i32.const 1888) "\06\00\00\00r\00e\00s\00u\00l\00t\00") + (data (i32.const 8) "\04\00\00\00t\00r\00u\00e\00") + (data (i32.const 24) "\05\00\00\00f\00a\00l\00s\00e\00") + (data (i32.const 40) "\04\00\00\00n\00u\00l\00l\00") + (data (i32.const 56) "\01\00\00\000\00") + (data (i32.const 64) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 96) "\01\00\00\009\00") + (data (i32.const 104) "\01\00\00\00A\00") + (data (i32.const 112) "\01\00\00\00a\00") + (data (i32.const 120) "\03\00\00\001\002\003\00") + (data (i32.const 136) "\03\00\00\00f\00o\00o\00") + (data (i32.const 152) "\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 168) "\98\00\00\00\01\00\00\00") + (data (i32.const 176) "\00\00\00\00") + (data (i32.const 184) "\01\00\00\00,\00") + (data (i32.const 192) "\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 248) "\01\00\00\00\"\00") + (data (i32.const 256) "\01\00\00\00\\\00") + (data (i32.const 264) "\02\00\00\00\\\00\"\00") + (data (i32.const 272) "\02\00\00\00\\\00\\\00") + (data (i32.const 280) "\01\00\00\00\08\00") + (data (i32.const 288) "\02\00\00\00\\\00b\00") + (data (i32.const 296) "\01\00\00\00\n\00") + (data (i32.const 304) "\02\00\00\00\\\00n\00") + (data (i32.const 312) "\01\00\00\00\0d\00") + (data (i32.const 320) "\02\00\00\00\\\00r\00") + (data (i32.const 328) "\01\00\00\00\t\00") + (data (i32.const 336) "\02\00\00\00\\\00t\00") + (data (i32.const 344) "\1c\00\00\00U\00n\00s\00u\00p\00p\00o\00r\00t\00e\00d\00 \00c\00o\00n\00t\00r\00o\00l\00 \00c\00h\00r\00a\00c\00t\00e\00r\00") + (data (i32.const 408) "\0f\00\00\00j\00s\00o\00n\00/\00e\00n\00c\00o\00d\00e\00r\00.\00t\00s\00") + (data (i32.const 448) "\01\00\00\00:\00") + (data (i32.const 456) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 488) "\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 552) "\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 1064) "(\02\00\00d\00\00\00") + (data (i32.const 1072) "\03\00\00\00b\00a\00r\00") + (data (i32.const 1088) "\04\00\00\00f\00l\00a\00g\00") + (data (i32.const 1104) "\03\00\00\00b\00a\00z\00") + (data (i32.const 1120) "\03\00\00\00a\00r\00r\00") + (data (i32.const 1136) "\01\00\00\00[\00") + (data (i32.const 1144) "\01\00\00\00]\00") + (data (i32.const 1152) "\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 1216) "\14\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00i\00n\00p\00u\00t\00 \00e\00n\00d\00") + (data (i32.const 1264) "\0f\00\00\00j\00s\00o\00n\00/\00d\00e\00c\00o\00d\00e\00r\00.\00t\00s\00") + (data (i32.const 1304) "\01\00\00\00{\00") + (data (i32.const 1312) "\0c\00\00\00m\00a\00i\00n\00_\00n\00e\00a\00r\00.\00t\00s\00") + (data (i32.const 1344) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00o\00b\00j\00e\00c\00t\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 1400) "\01\00\00\00}\00") + (data (i32.const 1408) "\0c\00\00\00E\00x\00p\00e\00c\00t\00e\00d\00 \00\'\00,\00\'\00") + (data (i32.const 1440) "\1d\00\00\00E\00x\00p\00e\00c\00t\00e\00d\00 \00d\00o\00u\00b\00l\00e\00-\00q\00u\00o\00t\00e\00d\00 \00s\00t\00r\00i\00n\00g\00") + (data (i32.const 1504) "\1c\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00c\00o\00n\00t\00r\00o\00l\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r\00") + (data (i32.const 1568) "\01\00\00\00/\00") + (data (i32.const 1576) "\01\00\00\00b\00") + (data (i32.const 1584) "\01\00\00\00n\00") + (data (i32.const 1592) "\01\00\00\00r\00") + (data (i32.const 1600) "\01\00\00\00t\00") + (data (i32.const 1608) "\01\00\00\00u\00") + (data (i32.const 1616) "\13\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00\\\00u\00 \00d\00i\00g\00i\00t\00") + (data (i32.const 1664) "\1e\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00e\00s\00c\00a\00p\00e\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r\00:\00 \00") + (data (i32.const 1728) "\0c\00\00\00E\00x\00p\00e\00c\00t\00e\00d\00 \00\'\00:\00\'\00") + (data (i32.const 1760) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00e\00n\00d\00 \00o\00f\00 \00o\00b\00j\00e\00c\00t\00") + (data (i32.const 1816) "\17\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00a\00r\00r\00a\00y\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 1872) "\17\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00e\00n\00d\00 \00o\00f\00 \00a\00r\00r\00a\00y\00") + (data (i32.const 1928) "\n\00\00\00E\00x\00p\00e\00c\00t\00e\00d\00 \00\'\00") + (data (i32.const 1952) "\01\00\00\00\'\00") + (data (i32.const 1960) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00b\00o\00o\00l\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 2008) "\03\00\00\00 \00:\00 \00") + (data (i32.const 2024) "\01\00\00\00-\00") + (data (i32.const 2032) "\19\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00i\00n\00t\00e\00g\00e\00r\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 2088) "\11\00\00\00C\00a\00n\00n\00o\00t\00 \00p\00a\00r\00s\00e\00 \00J\00S\00O\00N\00") + (data (i32.const 2128) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00s\00t\00r\00i\00n\00g\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 2184) "\04\00\00\00 \00:\00 \00\"\00") + (data (i32.const 2200) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00n\00u\00l\00l\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 2248) "\07\00\00\00t\00e\00s\00t\00.\00t\00s\00") + (data (i32.const 2272) "\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2288) "\e0\08\00\00\01\00\00\00") + (data (i32.const 2296) "\01\00\00\00x\00") + (data (i32.const 2304) "\01\00\00\00y\00") + (data (i32.const 2312) "\10\00\00\000\001\002\003\004\005\006\007\008\009\00A\00B\00C\00D\00E\00F\00") + (data (i32.const 2352) "\10\00\00\000\001\002\003\004\005\006\007\008\009\00a\00b\00c\00d\00e\00f\00") + (data (i32.const 2392) "\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2408) "X\t\00\00\01\00\00\00") + (data (i32.const 2416) "\06\00\00\00r\00e\00s\00u\00l\00t\00") (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) @@ -62,14 +101,18 @@ (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 $bson/encoder/START_SIZE i32 (i32.const 32)) - (global $bson/encoder/GROWTH_MULT i32 (i32.const 2)) + (global $json/decoder/TRUE_STR i32 (i32.const 8)) + (global $json/decoder/FALSE_STR i32 (i32.const 24)) + (global $json/decoder/NULL_STR i32 (i32.const 40)) + (global $~lib/internal/string/HEADER_SIZE i32 (i32.const 4)) + (global $json/decoder/CHAR_0 (mut i32) (i32.const 0)) + (global $json/decoder/CHAR_9 (mut i32) (i32.const 0)) + (global $json/decoder/CHAR_A (mut i32) (i32.const 0)) + (global $json/decoder/CHAR_A_LOWER (mut i32) (i32.const 0)) + (global $~lib/internal/string/MAX_LENGTH i32 (i32.const 536870910)) (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 $~argc (mut i32) (i32.const 0)) (global $ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/internal/string/MAX_LENGTH i32 (i32.const 536870910)) (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)) @@ -97,13 +140,40 @@ (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 $NaN f64 (f64.const nan:0x8000000000000)) - (global $HEAP_BASE i32 (i32.const 1904)) + (global $HEAP_BASE i32 (i32.const 2432)) (export "memory" (memory $0)) (export "table" (table $0)) (export "runTest" (func $test/runTest)) (start $start) - (func $~lib/allocator/arena/__memory_allocate (; 1 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/string/String#charCodeAt (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 75 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 + get_local $0 + i32.load + i32.ge_u + if + i32.const -1 + return + end + get_local $0 + get_local $1 + i32.const 1 + i32.shl + i32.add + i32.load16_u offset=4 + ) + (func $~lib/allocator/arena/__memory_allocate (; 2 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -182,3182 +252,4587 @@ set_global $~lib/allocator/arena/offset get_local $1 ) - (func $~lib/memory/memory.allocate (; 2 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/memory/memory.allocate (; 3 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/allocator/arena/__memory_allocate return ) - (func $~lib/internal/arraybuffer/computeSize (; 3 ;) (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 (; 4 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 4 ;) (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.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 72 - i32.const 26 + i32.const 192 + i32.const 14 i32.const 2 call $~lib/env/abort unreachable end block $~lib/memory/memory.allocate|inlined.0 (result i32) + get_global $~lib/internal/string/HEADER_SIZE get_local $0 - call $~lib/internal/arraybuffer/computeSize - set_local $2 - get_local $2 + 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.0 end - set_local $1 - get_local $1 + set_local $2 + get_local $2 get_local $0 i32.store - get_local $1 + get_local $2 ) - (func $~lib/internal/memory/memset (; 5 ;) (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 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 + (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 - 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 + i32.const 0 + i32.eq 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 + 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 - br $continue|0 end end - end - ) - (func $~lib/array/Array#constructor (; 6 ;) (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 40 - 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) + 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 - call $~lib/memory/memory.allocate - set_local $4 - get_local $4 - i32.const 0 + 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 $4 - i32.const 0 - i32.store offset=4 - get_local $4 + get_local $0 + i32.const 4 + i32.add + set_local $0 + get_local $1 + i32.const 4 + i32.add + set_local $1 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/internal/typedarray/TypedArray#constructor (; 7 ;) (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 136 - 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 (; 8 ;) (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 136 - 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 (; 9 ;) (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 136 - 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 $bson/encoder/BSONEncoder#growIfNeeded (; 10 ;) (type $iiv) (param $0 i32) (param $1 i32) - (local $2 i32) - (local $3 i32) - block $~lib/internal/typedarray/TypedArray#get:length|inlined.1 (result i32) - get_local $0 - i32.load offset=4 - set_local $2 get_local $2 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - get_local $0 - i32.load offset=8 - get_local $1 - i32.add - i32.ge_s - if - return - end - get_local $0 - i32.load offset=4 - set_local $2 - get_local $0 - i32.const 0 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.2 (result i32) - get_local $0 - i32.load offset=4 - set_local $3 - get_local $3 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - get_global $bson/encoder/GROWTH_MULT - i32.mul - call $~lib/internal/typedarray/TypedArray#constructor - i32.store offset=4 - block $break|0 - i32.const 0 - set_local $3 - loop $repeat|0 - get_local $3 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.4 (result i32) - get_local $2 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.lt_s - i32.eqz - br_if $break|0 + i32.const 2 + i32.and + if get_local $0 - i32.load offset=4 - get_local $3 - get_local $2 - get_local $3 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $3 - i32.const 1 + get_local $1 + i32.load16_u + i32.store16 + get_local $0 + i32.const 2 i32.add - set_local $3 - br $repeat|0 - unreachable + set_local $0 + get_local $1 + i32.const 2 + i32.add + set_local $1 end - unreachable - end - ) - (func $bson/encoder/BSONEncoder#writeByte (; 11 ;) (type $iiv) (param $0 i32) (param $1 i32) - (local $2 i32) - get_local $0 - i32.const 1 - call $bson/encoder/BSONEncoder#growIfNeeded - get_local $0 - i32.load offset=4 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=8 - tee_local $2 - i32.const 1 - i32.add - i32.store offset=8 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 $1 - call $~lib/internal/typedarray/TypedArray#__set - ) - (func $~lib/string/String#charCodeAt (; 12 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.const 0 - i32.ne - i32.eqz - if - i32.const 0 - i32.const 200 - i32.const 75 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $1 - get_local $0 - i32.load + get_local $2 + i32.const 32 i32.ge_u if - i32.const -1 - return - end - get_local $0 - get_local $1 - i32.const 1 - i32.shl - i32.add - i32.load16_u offset=4 - ) - (func $bson/encoder/BSONEncoder#cstring (; 13 ;) (type $iiv) (param $0 i32) (param $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - block $break|0 - block - i32.const 0 - set_local $2 - get_local $1 - i32.load - set_local $3 - end - loop $repeat|0 - get_local $2 - get_local $3 - i32.lt_s - i32.eqz - br_if $break|0 - block - get_local $1 - get_local $2 - call $~lib/string/String#charCodeAt - set_local $4 - get_local $4 - i32.const 128 - i32.lt_s - if - get_local $0 - get_local $4 - call $bson/encoder/BSONEncoder#writeByte - else - get_local $4 - i32.const 2048 - i32.lt_s - if - get_local $0 - get_local $4 - i32.const 6 - i32.shr_u - i32.const 192 - i32.or - call $bson/encoder/BSONEncoder#writeByte + block $break|2 + block $case2|2 + block $case1|2 + block $case0|2 get_local $0 - get_local $4 - i32.const 63 + i32.const 3 i32.and - i32.const 128 - i32.or - call $bson/encoder/BSONEncoder#writeByte - else - get_local $0 - get_local $4 - i32.const 12 - i32.shr_u - i32.const 224 - i32.or - call $bson/encoder/BSONEncoder#writeByte + 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 - get_local $4 - i32.const 6 - i32.shr_u - i32.const 63 - i32.and - i32.const 128 - i32.or - call $bson/encoder/BSONEncoder#writeByte + 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 - get_local $4 - i32.const 63 - i32.and - i32.const 128 - i32.or - call $bson/encoder/BSONEncoder#writeByte + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 end - end - end - get_local $2 - i32.const 1 - i32.add - set_local $2 - br $repeat|0 - unreachable - end - unreachable - end - get_local $0 - i32.const 0 - call $bson/encoder/BSONEncoder#writeByte - ) - (func $bson/encoder/BSONEncoder#int32 (; 14 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - get_local $2 - i32.const -1 - i32.eq - if - get_local $0 - i32.const 4 - call $bson/encoder/BSONEncoder#growIfNeeded - get_local $0 - i32.load offset=8 - set_local $2 - get_local $0 - get_local $0 - i32.load offset=8 - i32.const 4 - i32.add - i32.store offset=8 - end - get_local $0 - i32.load offset=4 - get_local $2 - get_local $1 - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $0 - i32.load offset=4 - get_local $2 - i32.const 1 - i32.add - get_local $1 - i32.const 8 - i32.shr_u - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $0 - i32.load offset=4 - get_local $2 - i32.const 2 - i32.add - get_local $1 - i32.const 16 - i32.shr_u - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $0 - i32.load offset=4 - get_local $2 - i32.const 3 - i32.add - get_local $1 - i32.const 24 - i32.shr_u - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - ) - (func $bson/encoder/BSONEncoder#int32|trampoline (; 15 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - block $1of1 - block $0of1 - block $outOfRange - get_global $~argc - i32.const 1 - i32.sub - br_table $0of1 $1of1 $outOfRange - end - unreachable - end - i32.const -1 - set_local $2 - end - get_local $0 - get_local $1 - get_local $2 - call $bson/encoder/BSONEncoder#int32 - ) - (func $bson/encoder/BSONEncoder#setInteger (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - get_local $0 - i32.const 16 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - get_local $1 - call $bson/encoder/BSONEncoder#cstring - i32.const 1 - set_global $~argc - get_local $0 - get_local $2 - i32.const 0 - call $bson/encoder/BSONEncoder#int32|trampoline - ) - (func $bson/encoder/BSONEncoder#setBoolean (; 17 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - get_local $0 - i32.const 8 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - get_local $1 - call $bson/encoder/BSONEncoder#cstring - get_local $0 - get_local $2 - i32.const 0 - i32.ne - if (result i32) - i32.const 1 - else - i32.const 0 - end - call $bson/encoder/BSONEncoder#writeByte - ) - (func $~lib/internal/string/compareUnsafe (; 18 ;) (type $iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - i32.const 0 - set_local $5 - get_local $0 - get_local $1 - i32.const 1 - i32.shl - i32.add - set_local $6 - get_local $2 - get_local $3 - i32.const 1 - i32.shl - i32.add - set_local $7 - block $break|0 - loop $continue|0 - get_local $4 - if (result i32) - get_local $6 - i32.load16_u offset=4 - get_local $7 - i32.load16_u offset=4 - i32.sub - tee_local $5 - i32.eqz - else - get_local $4 + 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 - if - block - get_local $4 + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 i32.const 1 - i32.sub - set_local $4 - get_local $6 - i32.const 2 i32.add - set_local $6 - get_local $7 - i32.const 2 + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 i32.add - set_local $7 + set_local $1 + get_local $5 end - br $continue|0 - end - end - end - get_local $5 - ) - (func $~lib/string/String.__eq (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - get_local $0 - get_local $1 - i32.eq - if - i32.const 1 - return - end - get_local $0 - i32.const 0 - i32.eq - tee_local $2 - if (result i32) - get_local $2 - else - get_local $1 - i32.const 0 - i32.eq - end - if - i32.const 0 - return - end - get_local $0 - i32.load - set_local $3 - get_local $3 - get_local $1 - i32.load - i32.ne - if - i32.const 0 - return - end - get_local $0 - i32.const 0 - get_local $1 - i32.const 0 - get_local $3 - call $~lib/internal/string/compareUnsafe - i32.eqz - ) - (func $~lib/string/String.__ne (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - get_local $1 - call $~lib/string/String.__eq - i32.eqz - ) - (func $bson/encoder/BSONEncoder#setString (; 21 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - get_local $0 - i32.const 2 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - get_local $1 - call $bson/encoder/BSONEncoder#cstring - get_local $0 - i32.load offset=8 - set_local $3 - get_local $0 - get_local $0 - i32.load offset=8 - i32.const 4 - i32.add - i32.store offset=8 - get_local $0 - get_local $2 - call $bson/encoder/BSONEncoder#cstring - get_local $0 - get_local $0 - i32.load offset=8 - get_local $3 - i32.sub - i32.const 4 - i32.sub - get_local $3 - call $bson/encoder/BSONEncoder#int32 - ) - (func $bson/encoder/BSONEncoder#setNull (; 22 ;) (type $iiv) (param $0 i32) (param $1 i32) - get_local $0 - i32.const 10 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - get_local $1 - call $bson/encoder/BSONEncoder#cstring - ) - (func $bson/encoder/BSONEncoder#setUint8Array (; 23 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - get_local $0 - i32.const 5 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - get_local $1 - call $bson/encoder/BSONEncoder#cstring - i32.const 1 - set_global $~argc - get_local $0 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.5 (result i32) - get_local $2 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.const 0 - call $bson/encoder/BSONEncoder#int32|trampoline - get_local $0 - i32.const 0 - call $bson/encoder/BSONEncoder#writeByte - block $break|0 - i32.const 0 - set_local $3 - loop $repeat|0 - get_local $3 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.7 (result i32) - get_local $2 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.lt_s - i32.eqz - br_if $break|0 - get_local $0 - get_local $2 - get_local $3 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $bson/encoder/BSONEncoder#writeByte - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|0 - unreachable - end - unreachable - end - ) - (func $~lib/internal/memory/memcpy (; 24 ;) (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 + i32.load8_u + i32.store8 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 + 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 - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 end - br $continue|0 + br $break|2 + unreachable end + unreachable end end - get_local $0 - i32.const 3 + get_local $2 + i32.const 16 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 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 end - get_local $2 - i32.const 8 - i32.and - if + 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 - i32.load - i32.store + 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 - i32.const 4 + tee_local $5 + i32.const 1 i32.add + set_local $0 + get_local $5 + end + block (result i32) get_local $1 - i32.const 4 + tee_local $5 + i32.const 1 i32.add - i32.load - i32.store + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) get_local $0 - i32.const 8 + tee_local $5 + i32.const 1 i32.add set_local $0 + get_local $5 + end + block (result i32) get_local $1 - i32.const 8 + tee_local $5 + i32.const 1 i32.add set_local $1 + get_local $5 end - get_local $2 - i32.const 4 - i32.and - if + 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 - i32.load - i32.store + 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 - i32.const 4 + tee_local $5 + i32.const 1 i32.add set_local $0 + get_local $5 + end + block (result i32) get_local $1 - i32.const 4 + tee_local $5 + i32.const 1 i32.add set_local $1 + get_local $5 end - get_local $2 - i32.const 2 - i32.and - if + 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 - i32.load16_u - i32.store16 + 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 - i32.const 2 + tee_local $5 + i32.const 1 i32.add set_local $0 + get_local $5 + end + block (result i32) get_local $1 - i32.const 2 + tee_local $5 + i32.const 1 i32.add set_local $1 + get_local $5 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 + 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 - 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 + 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 $5 - end - block (result i32) get_local $1 - tee_local $5 - i32.const 1 + i32.const 8 i32.add set_local $1 - get_local $5 end - i32.load8_u - i32.store8 + 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 $5 + tee_local $3 i32.const 1 i32.add set_local $0 - get_local $5 + get_local $3 end block (result i32) get_local $1 - tee_local $5 + tee_local $3 i32.const 1 i32.add set_local $1 - get_local $5 + get_local $3 end i32.load8_u i32.store8 - block (result i32) + 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/internal/string/copyUnsafe (; 7 ;) (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 (; 8 ;) (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 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 110 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 0 + i32.eq + if + i32.const 40 + 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 176 + 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 (; 9 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 40 + set_local $0 + end + get_local $0 + get_local $1 + call $~lib/string/String#concat + ) + (func $json/encoder/JSONEncoder#write (; 10 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + get_local $0 + i32.load offset=8 + get_local $1 + call $~lib/string/String.__concat + i32.store offset=8 + ) + (func $~lib/internal/string/compareUnsafe (; 11 ;) (type $iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + i32.const 0 + set_local $5 + get_local $0 + get_local $1 + i32.const 1 + i32.shl + i32.add + set_local $6 + get_local $2 + get_local $3 + i32.const 1 + i32.shl + i32.add + set_local $7 + block $break|0 + loop $continue|0 + get_local $4 + if (result i32) + get_local $6 + i32.load16_u offset=4 + get_local $7 + i32.load16_u offset=4 + i32.sub + tee_local $5 + i32.eqz + else + get_local $4 + end + if + block + get_local $4 + i32.const 1 + i32.sub + set_local $4 + get_local $6 + i32.const 2 + i32.add + set_local $6 + get_local $7 + i32.const 2 + i32.add + set_local $7 + end + br $continue|0 + end + end + end + get_local $5 + ) + (func $~lib/string/String.__eq (; 12 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + i32.const 1 + return + end + get_local $0 + i32.const 0 + i32.eq + tee_local $2 + if (result i32) + get_local $2 + else + get_local $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + return + end + get_local $0 + i32.load + set_local $3 + get_local $3 + get_local $1 + i32.load + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.const 0 + get_local $1 + i32.const 0 + get_local $3 + call $~lib/internal/string/compareUnsafe + i32.eqz + ) + (func $~lib/string/String.__ne (; 13 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + get_local $1 + call $~lib/string/String.__eq + i32.eqz + ) + (func $~lib/string/String#substring (; 14 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + get_local $0 + i32.const 0 + i32.ne + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 269 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.load + set_local $3 + get_local $1 + tee_local $4 + i32.const 0 + tee_local $5 + get_local $4 + get_local $5 + i32.gt_s + select + tee_local $4 + get_local $3 + tee_local $5 + get_local $4 + get_local $5 + i32.lt_s + select + set_local $6 + get_local $2 + tee_local $4 + i32.const 0 + tee_local $5 + get_local $4 + get_local $5 + i32.gt_s + select + tee_local $4 + get_local $3 + tee_local $5 + get_local $4 + get_local $5 + i32.lt_s + select + set_local $7 + get_local $6 + tee_local $4 + get_local $7 + tee_local $5 + get_local $4 + get_local $5 + i32.lt_s + select + set_local $8 + get_local $6 + tee_local $4 + get_local $7 + tee_local $5 + get_local $4 + get_local $5 + i32.gt_s + select + set_local $9 + get_local $9 + get_local $8 + i32.sub + set_local $3 + get_local $3 + i32.eqz + if + i32.const 176 + return + end + get_local $8 + i32.eqz + tee_local $4 + if (result i32) + get_local $9 + get_local $0 + i32.load + i32.eq + else + get_local $4 + end + if + get_local $0 + return + end + get_local $3 + call $~lib/internal/string/allocateUnsafe + set_local $10 + get_local $10 + i32.const 0 + get_local $0 + get_local $8 + get_local $3 + call $~lib/internal/string/copyUnsafe + get_local $10 + ) + (func $json/encoder/JSONEncoder#writeString (; 15 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.const 248 + call $json/encoder/JSONEncoder#write + i32.const 0 + set_local $2 + block $break|0 + i32.const 0 + set_local $3 + loop $repeat|0 + get_local $3 + get_local $1 + i32.load + i32.lt_s + i32.eqz + br_if $break|0 + block + get_local $1 + get_local $3 + call $~lib/string/String#charCodeAt + set_local $4 + get_local $4 + i32.const 32 + i32.lt_s + tee_local $5 + if (result i32) + get_local $5 + else + get_local $4 + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + end + tee_local $5 + if (result i32) + get_local $5 + else + get_local $4 + i32.const 256 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + end + set_local $5 + get_local $5 + i32.const 0 + i32.ne + if + get_local $0 + get_local $1 + get_local $2 + get_local $3 + call $~lib/string/String#substring + call $json/encoder/JSONEncoder#write + get_local $3 + i32.const 1 + i32.add + set_local $2 + get_local $4 + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + i32.const 264 + call $json/encoder/JSONEncoder#write + else + get_local $4 + i32.const 256 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if 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 + i32.const 272 + call $json/encoder/JSONEncoder#write + else + get_local $4 + i32.const 280 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + i32.const 288 + call $json/encoder/JSONEncoder#write + else + get_local $4 + i32.const 296 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq 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 304 + call $json/encoder/JSONEncoder#write + else + get_local $4 + i32.const 312 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if get_local $0 - i32.const 12 - i32.add + i32.const 320 + call $json/encoder/JSONEncoder#write + else 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 + i32.const 328 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + i32.const 336 + call $json/encoder/JSONEncoder#write + else + i32.const 0 + i32.eqz + if + i32.const 344 + i32.const 408 + i32.const 98 + i32.const 20 + call $~lib/env/abort + unreachable + end + end end - br $continue|3 end end end - br $break|2 - 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 + get_local $1 + get_local $2 + get_local $1 + i32.load + call $~lib/string/String#substring + call $json/encoder/JSONEncoder#write + get_local $0 + i32.const 248 + call $json/encoder/JSONEncoder#write + ) + (func $json/encoder/JSONEncoder#writeKey (; 16 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + i32.load8_u + i32.const 0 + i32.ne + i32.eqz + if + get_local $0 + i32.const 184 + call $json/encoder/JSONEncoder#write + else + get_local $0 + i32.const 0 + i32.store8 + end + get_local $1 + i32.const 0 + call $~lib/string/String.__ne + if + get_local $0 + get_local $1 + call $json/encoder/JSONEncoder#writeString + get_local $0 + i32.const 448 + call $json/encoder/JSONEncoder#write + end + ) + (func $~lib/internal/arraybuffer/computeSize (; 17 ;) (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 (; 18 ;) (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 488 + i32.const 26 + i32.const 2 + call $~lib/env/abort + unreachable + end + block $~lib/memory/memory.allocate|inlined.1 (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.1 + end + set_local $1 + get_local $1 + get_local $0 + i32.store + get_local $1 + ) + (func $~lib/internal/memory/memset (; 19 ;) (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 $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 + get_local $5 + i64.store + get_local $0 + i32.const 8 i32.add - set_local $0 get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 + i64.store + get_local $0 + i32.const 16 i32.add - set_local $1 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 - 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 + br $continue|0 end - unreachable end end - get_local $2 - i32.const 16 - i32.and + ) + (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 456 + 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) - 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 + 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 - block (result i32) - get_local $1 - tee_local $5 + 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#__unchecked_set (; 21 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + i32.load + set_local $3 + i32.const 0 + set_local $4 + get_local $3 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $4 + i32.add + get_local $2 + i32.store offset=8 + ) + (func $~lib/internal/number/decimalCount32 (; 22 ;) (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.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + i32.const 2 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.const 10 + i32.lt_u + select + return + else + i32.const 4 + i32.const 5 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 + i32.const 10000 + i32.lt_u + select 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) + i32.const 3 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 + i32.const 1000 + i32.lt_u + select + return end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add + 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 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + i32.const 8 + get_local $1 get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 + i32.const 100000000 + i32.lt_u + select + return end - block (result i32) + unreachable + unreachable + end + unreachable + unreachable + ) + (func $~lib/internal/number/utoa32_lut (; 23 ;) (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 1064 + end + i32.load + set_local $3 + block $break|0 + loop $continue|0 get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 + 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 - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 + 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 - 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 + i32.load offset=8 end - i32.load8_u - i32.store8 + 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 $2 - i32.const 8 - i32.and + get_local $1 + i32.const 10 + i32.ge_u 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 $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 - 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.const 2 + i32.shl 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 + i32.load offset=8 end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 + 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/itoa32 (; 24 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.eqz + if + i32.const 56 + return + end + get_local $0 + i32.const 0 + i32.lt_s + set_local $1 + get_local $1 + if + i32.const 0 + get_local $0 + i32.sub + set_local $0 + end + get_local $0 + call $~lib/internal/number/decimalCount32 + get_local $1 + i32.add + set_local $2 + get_local $2 + call $~lib/internal/string/allocateUnsafe + set_local $3 + get_local $3 + get_local $0 + get_local $2 + call $~lib/internal/number/utoa32_lut + get_local $1 + if + get_local $3 + get_global $~lib/internal/string/CharCode.MINUS + i32.store16 offset=4 + end + get_local $3 + ) + (func $~lib/internal/number/itoa (; 25 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $~lib/internal/number/itoa32 + return + ) + (func $~lib/internal/number/itoa_stream (; 26 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + get_local $0 + get_local $1 + i32.const 1 + i32.shl + i32.add + set_local $0 + get_local $2 + i32.eqz + if + get_local $0 + get_global $~lib/internal/string/CharCode._0 + i32.store16 offset=4 + i32.const 1 + return + end + i32.const 0 + set_local $3 + get_local $2 + i32.const 0 + i32.lt_s + set_local $4 + get_local $4 + if + i32.const 0 + get_local $2 + i32.sub + set_local $2 + end + get_local $2 + call $~lib/internal/number/decimalCount32 + get_local $4 + i32.add + set_local $3 + get_local $0 + get_local $2 + get_local $3 + call $~lib/internal/number/utoa32_lut + get_local $4 + if + get_local $0 + get_global $~lib/internal/string/CharCode.MINUS + i32.store16 offset=4 + end + get_local $3 + ) + (func $~lib/allocator/arena/__memory_free (; 27 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/array/Array#join (; 28 ;) (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 176 + return + end + i32.const 176 + 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 + set_local $9 get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 + get_local $8 + i32.const 2 + i32.shl 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 + get_local $9 i32.add - set_local $0 - get_local $5 + i32.load offset=8 end - block (result i32) - get_local $1 - tee_local $5 + call $~lib/internal/number/itoa + return + end + i32.const 11 + get_local $6 + i32.add + get_local $2 + i32.mul + i32.const 11 + i32.add + set_local $9 + get_local $9 + call $~lib/internal/string/allocateUnsafe + set_local $8 + i32.const 0 + set_local $10 + block $break|0 + i32.const 0 + set_local $11 + loop $repeat|0 + get_local $11 + get_local $2 + i32.lt_s + i32.eqz + br_if $break|0 + block + block $~lib/internal/arraybuffer/LOAD|inlined.1 (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 $10 + get_local $8 + get_local $10 + get_local $4 + call $~lib/internal/number/itoa_stream + i32.add + set_local $10 + 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 $11 i32.const 1 i32.add - set_local $1 - get_local $5 + set_local $11 + br $repeat|0 + unreachable 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 + unreachable + end + block $~lib/internal/arraybuffer/LOAD|inlined.2 (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 $10 + get_local $8 + get_local $10 + get_local $4 + call $~lib/internal/number/itoa_stream + i32.add + set_local $10 + get_local $8 + set_local $11 + get_local $9 + get_local $10 + i32.gt_s + if + get_local $8 + i32.const 0 + get_local $10 + call $~lib/string/String#substring + set_local $11 + get_local $8 + i32.eqz + if + i32.const 0 + i32.const 192 + i32.const 28 + i32.const 4 + call $~lib/env/abort + unreachable end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 + block $~lib/memory/memory.free|inlined.0 + block + get_local $8 + call $~lib/allocator/arena/__memory_free + br $~lib/memory/memory.free|inlined.0 + unreachable + end + unreachable end - i32.load8_u - i32.store8 end + get_local $11 + return + ) + (func $json/encoder/JSONEncoder#writeInteger (; 29 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + block (result i32) + i32.const 0 + i32.const 1 + call $~lib/array/Array#constructor + set_local $2 + get_local $2 + i32.const 0 + get_local $1 + call $~lib/array/Array#__unchecked_set + get_local $2 + end + set_local $2 + get_local $0 + block $~lib/array/Array#toString|inlined.0 (result i32) + get_local $2 + i32.const 184 + call $~lib/array/Array#join + end + call $json/encoder/JSONEncoder#write + ) + (func $json/encoder/JSONEncoder#setInteger (; 30 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + call $json/encoder/JSONEncoder#writeKey + get_local $0 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 + call $json/encoder/JSONEncoder#writeInteger + ) + (func $json/encoder/JSONEncoder#writeBoolean (; 31 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + get_local $1 + i32.const 0 + i32.ne + if (result i32) + i32.const 8 + else + i32.const 24 + end + call $json/encoder/JSONEncoder#write + ) + (func $json/encoder/JSONEncoder#setBoolean (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + call $json/encoder/JSONEncoder#writeKey + get_local $0 + get_local $2 + call $json/encoder/JSONEncoder#writeBoolean + ) + (func $json/encoder/JSONEncoder#setString (; 33 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + call $json/encoder/JSONEncoder#writeKey + get_local $0 + get_local $2 + call $json/encoder/JSONEncoder#writeString + ) + (func $json/encoder/JSONEncoder#setNull (; 34 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + get_local $1 + call $json/encoder/JSONEncoder#writeKey + get_local $0 + i32.const 40 + call $json/encoder/JSONEncoder#write + ) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 35 ;) (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 488 + i32.const 40 + i32.const 4 + call $~lib/env/abort + unreachable end - i32.load8_u - i32.store8 - block (result i32) + 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 - 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.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 $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + set_local $4 get_local $0 - tee_local $5 - i32.const 1 + get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add - set_local $0 + set_local $5 + get_local $4 get_local $5 + get_local $2 + call $~lib/internal/memory/memmove + block $~lib/memory/memory.free|inlined.1 + block + get_local $0 + call $~lib/allocator/arena/__memory_free + br $~lib/memory/memory.free|inlined.1 + unreachable + end + unreachable + end + get_local $3 + set_local $0 end - block (result i32) + 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 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + i32.const 0 + i32.ge_s + i32.eqz + if + i32.const 0 + i32.const 488 + i32.const 62 + i32.const 4 + call $~lib/env/abort + unreachable + end 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 + i32.store end - i32.load8_u - i32.store8 end + get_local $0 + ) + (func $~lib/array/Array#push (; 36 ;) (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 0 + i32.shr_u + set_local $4 get_local $2 - i32.const 2 - i32.and + i32.const 1 + i32.add + set_local $5 + get_local $2 + get_local $4 + i32.ge_u 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 + get_local $2 + i32.const 1073741816 + i32.ge_u + if + i32.const 0 + i32.const 456 + i32.const 184 + i32.const 42 + call $~lib/env/abort + unreachable end - i32.load8_u - i32.store8 - block (result i32) + get_local $3 + get_local $5 + i32.const 0 + 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 0 + i32.shl + i32.add + get_local $6 + i32.add + get_local $1 + i32.store8 offset=8 + get_local $5 + ) + (func $json/encoder/JSONEncoder#pushArray (; 37 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + get_local $1 + call $json/encoder/JSONEncoder#writeKey + get_local $0 + i32.const 1136 + call $json/encoder/JSONEncoder#write + get_local $0 + i32.const 1 + i32.store8 + get_local $0 + i32.load offset=4 + i32.const 0 + call $~lib/array/Array#push + drop + i32.const 1 + ) + (func $~lib/array/Array>#__get (; 38 ;) (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#__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 $main_near/__near_encode_Array_String (; 40 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + 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 + end + i32.lt_s + i32.eqz + br_if $break|0 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 $2 + call $~lib/array/Array#__get + i32.const 0 + call $~lib/string/String.__ne + if + get_local $1 + i32.const 0 + get_local $0 + get_local $2 + call $~lib/array/Array#__get + call $json/encoder/JSONEncoder#setString + else + get_local $1 + i32.const 0 + call $json/encoder/JSONEncoder#setNull + end + get_local $2 i32.const 1 i32.add - set_local $1 - get_local $5 + set_local $2 + br $repeat|0 + unreachable end - i32.load8_u - i32.store8 + unreachable end - get_local $2 - i32.const 1 - i32.and - if - block (result i32) + ) + (func $json/encoder/JSONEncoder#popArray (; 41 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 1144 + call $json/encoder/JSONEncoder#write + ) + (func $main_near/__near_encode_Array_Array_String (; 42 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + 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 + end + i32.lt_s + i32.eqz + br_if $break|0 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 $2 + call $~lib/array/Array>#__get + i32.const 0 + i32.ne + if + get_local $1 + i32.const 0 + call $json/encoder/JSONEncoder#pushArray + drop + get_local $0 + get_local $2 + call $~lib/array/Array>#__get + get_local $1 + call $main_near/__near_encode_Array_String + get_local $1 + call $json/encoder/JSONEncoder#popArray + else + get_local $1 + i32.const 0 + call $json/encoder/JSONEncoder#setNull + end + get_local $2 i32.const 1 i32.add - set_local $1 - get_local $5 + set_local $2 + br $repeat|0 + unreachable end - i32.load8_u - i32.store8 + unreachable end ) - (func $~lib/internal/memory/memmove (; 25 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) + (func $main_near/__near_encode_FooBar (; 43 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $1 + i32.const 136 get_local $0 + i32.load + call $json/encoder/JSONEncoder#setInteger get_local $1 - i32.eq - if - return - end + i32.const 1072 + get_local $0 + i32.load offset=4 + call $json/encoder/JSONEncoder#setInteger get_local $1 - get_local $2 - i32.add + i32.const 1088 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 + i32.load8_u offset=8 + call $json/encoder/JSONEncoder#setBoolean + get_local $0 + i32.load offset=12 + i32.const 0 + call $~lib/string/String.__ne if + get_local $1 + i32.const 1104 get_local $0 + i32.load offset=12 + call $json/encoder/JSONEncoder#setString + else get_local $1 - get_local $2 - call $~lib/internal/memory/memcpy - return + i32.const 1104 + call $json/encoder/JSONEncoder#setNull end get_local $0 - get_local $1 - i32.lt_u + i32.load offset=16 + i32.const 0 + i32.ne if get_local $1 - i32.const 7 - i32.and + i32.const 1120 + call $json/encoder/JSONEncoder#pushArray + drop get_local $0 - i32.const 7 - i32.and - i32.eq - if - block $break|0 - loop $continue|0 + i32.load offset=16 + get_local $1 + call $main_near/__near_encode_Array_Array_String + get_local $1 + call $json/encoder/JSONEncoder#popArray + else + get_local $1 + i32.const 1120 + call $json/encoder/JSONEncoder#setNull + end + ) + (func $~lib/string/String#get:lengthUTF8 (; 44 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + i32.const 1 + set_local $1 + i32.const 0 + set_local $2 + get_local $0 + i32.load + set_local $3 + block $break|0 + loop $continue|0 + get_local $2 + get_local $3 + i32.lt_u + if + block get_local $0 - i32.const 7 - i32.and + get_local $2 + i32.const 1 + i32.shl + i32.add + i32.load16_u offset=4 + set_local $4 + get_local $4 + i32.const 128 + i32.lt_u if - block - get_local $2 - i32.eqz - if - return - end + get_local $1 + i32.const 1 + i32.add + set_local $1 + get_local $2 + i32.const 1 + i32.add + set_local $2 + else + get_local $4 + i32.const 2048 + i32.lt_u + if + get_local $1 + i32.const 2 + i32.add + set_local $1 get_local $2 i32.const 1 - i32.sub + i32.add set_local $2 - block (result i32) - get_local $0 - tee_local $3 + else + get_local $4 + i32.const 64512 + i32.and + i32.const 55296 + i32.eq + tee_local $5 + if (result i32) + get_local $2 i32.const 1 i32.add - set_local $0 get_local $3 + i32.lt_u + else + get_local $5 end - block (result i32) + tee_local $5 + if (result i32) + get_local $0 + get_local $2 + i32.const 1 + i32.add + i32.const 1 + i32.shl + i32.add + i32.load16_u offset=4 + i32.const 64512 + i32.and + i32.const 56320 + i32.eq + else + get_local $5 + end + if get_local $1 - tee_local $3 + i32.const 4 + i32.add + set_local $1 + get_local $2 + i32.const 2 + i32.add + set_local $2 + else + get_local $1 + i32.const 3 + i32.add + set_local $1 + get_local $2 i32.const 1 i32.add - set_local $1 - get_local $3 + set_local $2 end - i32.load8_u - i32.store8 end - br $continue|0 end end + br $continue|0 end - block $break|1 - loop $continue|1 - get_local $2 - i32.const 8 - i32.ge_u + end + end + get_local $1 + ) + (func $~lib/string/String#toUTF8 (; 45 ;) (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) + block $~lib/memory/memory.allocate|inlined.2 (result i32) + get_local $0 + call $~lib/string/String#get:lengthUTF8 + set_local $1 + get_local $1 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.2 + end + set_local $2 + i32.const 0 + set_local $3 + get_local $0 + i32.load + set_local $4 + i32.const 0 + set_local $5 + block $break|0 + loop $continue|0 + get_local $3 + get_local $4 + i32.lt_u + if + block + get_local $0 + get_local $3 + i32.const 1 + i32.shl + i32.add + i32.load16_u offset=4 + set_local $1 + get_local $1 + i32.const 128 + i32.lt_u if - block - get_local $0 - get_local $1 - i64.load - i64.store + get_local $2 + get_local $5 + i32.add + get_local $1 + i32.store8 + get_local $5 + i32.const 1 + i32.add + set_local $5 + get_local $3 + i32.const 1 + i32.add + set_local $3 + else + get_local $1 + i32.const 2048 + i32.lt_u + if get_local $2 - i32.const 8 - i32.sub - set_local $2 - get_local $0 - i32.const 8 + get_local $5 i32.add - set_local $0 + set_local $6 + get_local $6 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.const 6 + i32.shr_u + i32.const 192 + i32.or + i32.store8 + get_local $6 + get_local $1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=1 + get_local $5 + i32.const 2 i32.add - set_local $0 + set_local $5 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 + set_local $3 + else get_local $2 - i32.eqz + get_local $5 + i32.add + set_local $6 + get_local $1 + i32.const 64512 + i32.and + i32.const 55296 + i32.eq + tee_local $7 + if (result i32) + get_local $3 + i32.const 1 + i32.add + get_local $4 + i32.lt_u + else + get_local $7 + end if - return + get_local $0 + get_local $3 + i32.const 1 + i32.add + i32.const 1 + i32.shl + i32.add + i32.load16_u offset=4 + set_local $7 + get_local $7 + i32.const 64512 + i32.and + i32.const 56320 + i32.eq + if + i32.const 65536 + get_local $1 + i32.const 1023 + i32.and + i32.const 10 + i32.shl + i32.add + get_local $7 + i32.const 1023 + i32.and + i32.add + set_local $1 + get_local $6 + get_local $1 + i32.const 18 + i32.shr_u + i32.const 240 + i32.or + i32.store8 + get_local $6 + get_local $1 + i32.const 12 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=1 + get_local $6 + get_local $1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=2 + get_local $6 + get_local $1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=3 + get_local $5 + i32.const 4 + i32.add + set_local $5 + get_local $3 + i32.const 2 + i32.add + set_local $3 + br $continue|0 + end end - get_local $0 - get_local $2 - i32.const 1 - i32.sub - tee_local $2 - i32.add + get_local $6 get_local $1 - get_local $2 - i32.add - i32.load8_u + i32.const 12 + i32.shr_u + i32.const 224 + i32.or 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 + get_local $6 + get_local $1 + i32.const 6 + i32.shr_u + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=1 + get_local $6 + get_local $1 + i32.const 63 + i32.and + i32.const 128 + i32.or + i32.store8 offset=2 + get_local $5 + i32.const 3 i32.add - get_local $1 - get_local $2 + set_local $5 + get_local $3 + i32.const 1 i32.add - i64.load - i64.store + set_local $3 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 + br $continue|0 end end end + get_local $2 + get_local $5 + i32.add + i32.const 0 + i32.store8 + get_local $2 ) - (func $~lib/allocator/arena/__memory_free (; 26 ;) (type $iv) (param $0 i32) - nop - ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#constructor (; 46 ;) (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 + i32.const 1073741816 + i32.gt_u if - get_local $1 - get_global $~lib/internal/arraybuffer/MAX_BLENGTH - i32.le_s - i32.eqz - if - i32.const 0 - i32.const 72 - 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 + i32.const 1152 + 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 - get_local $1 - get_local $2 - i32.lt_s - if - get_local $1 + block (result i32) + i32.const 12 + call $~lib/memory/memory.allocate + set_local $5 + get_local $5 i32.const 0 - i32.ge_s - i32.eqz - if - i32.const 0 - i32.const 72 - i32.const 62 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $1 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/array/Array#push (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 47 ;) (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 $1 get_local $0 - i32.load offset=4 - set_local $2 + i32.load offset=8 + i32.const 0 + i32.shr_u + i32.ge_u + if + i32.const 0 + i32.const 1152 + i32.const 50 + i32.const 63 + call $~lib/env/abort + unreachable + end get_local $0 i32.load set_local $3 - get_local $3 - i32.load - i32.const 2 - i32.shr_u + get_local $0 + i32.load offset=4 set_local $4 - get_local $2 - i32.const 1 + get_local $3 + get_local $1 + i32.const 0 + i32.shl i32.add - set_local $5 - get_local $2 get_local $4 - i32.ge_u + i32.add + get_local $2 + i32.store8 offset=8 + ) + (func $~lib/typedarray/Uint8Array#subarray (; 48 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + block $~lib/internal/typedarray/TypedArray#get:length|inlined.3 (result i32) + get_local $0 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + set_local $3 + get_local $1 + i32.const 0 + i32.lt_s + if + get_local $3 + get_local $1 + i32.add + tee_local $4 + i32.const 0 + tee_local $5 + get_local $4 + get_local $5 + i32.gt_s + select + set_local $1 + else + get_local $1 + tee_local $4 + get_local $3 + tee_local $5 + get_local $4 + get_local $5 + i32.lt_s + select + set_local $1 + end + get_local $2 + i32.const 0 + i32.lt_s if - get_local $2 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 40 - i32.const 184 - i32.const 42 - call $~lib/env/abort - unreachable - end get_local $3 + get_local $2 + i32.add + tee_local $4 + get_local $1 + tee_local $5 + get_local $4 get_local $5 - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - set_local $3 - get_local $0 + i32.gt_s + select + set_local $2 + else + get_local $2 + tee_local $4 get_local $3 - i32.store + tee_local $5 + get_local $4 + get_local $5 + i32.lt_s + select + tee_local $4 + get_local $1 + tee_local $5 + get_local $4 + get_local $5 + i32.gt_s + select + set_local $2 end + block $~lib/memory/memory.allocate|inlined.3 (result i32) + i32.const 12 + set_local $4 + get_local $4 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.3 + end + set_local $4 + get_local $4 get_local $0 - get_local $5 - i32.store offset=4 + i32.load + i32.store + get_local $4 + get_local $0 + i32.load offset=4 + get_local $1 i32.const 0 - set_local $6 - get_local $3 - get_local $2 - i32.const 2 i32.shl i32.add - get_local $6 - i32.add + i32.store offset=4 + get_local $4 + get_local $2 get_local $1 + i32.sub + i32.const 0 + i32.shl i32.store offset=8 - get_local $5 + get_local $4 ) - (func $bson/encoder/BSONEncoder#pushArray (; 29 ;) (type $iiv) (param $0 i32) (param $1 i32) - get_local $0 - i32.const 4 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - get_local $1 - call $bson/encoder/BSONEncoder#cstring + (func $json/encoder/JSONEncoder#serialize (; 49 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) get_local $0 - i32.load + i32.load offset=8 + call $~lib/string/String#toUTF8 + set_local $1 + i32.const 0 get_local $0 i32.load offset=8 - call $~lib/array/Array#push - drop + call $~lib/string/String#get:lengthUTF8 + call $~lib/internal/typedarray/TypedArray#constructor + set_local $2 + block $break|0 + i32.const 0 + set_local $3 + loop $repeat|0 + get_local $3 + block $~lib/internal/typedarray/TypedArray#get:length|inlined.1 (result i32) + get_local $2 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + i32.lt_s + i32.eqz + br_if $break|0 + get_local $2 + get_local $3 + get_local $1 + get_local $3 + i32.add + i32.load8_u + call $~lib/internal/typedarray/TypedArray#__set + get_local $3 + i32.const 1 + i32.add + set_local $3 + br $repeat|0 + unreachable + end + unreachable + end + get_local $2 + i32.const 0 + block $~lib/internal/typedarray/TypedArray#get:length|inlined.2 (result i32) + get_local $2 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + i32.const 1 + i32.sub + call $~lib/typedarray/Uint8Array#subarray + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#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.load offset=8 - i32.const 4 - i32.add - i32.store offset=8 ) - (func $~lib/array/Array>#__get (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 51 ;) (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 + get_local $0 + i32.load offset=8 + i32.const 0 i32.shr_u - i32.lt_u - if (result i32) + i32.ge_u + if i32.const 0 + i32.const 1152 + 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 2 + i32.const 0 i32.shl i32.add get_local $3 i32.add - i32.load offset=8 - else - unreachable + i32.load8_u offset=8 end ) - (func $~lib/array/Array#__unchecked_set (; 31 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) - get_local $0 - i32.load - set_local $3 - i32.const 0 - set_local $4 - get_local $3 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $4 - i32.add - get_local $2 - i32.store offset=8 - ) - (func $~lib/internal/number/decimalCount32 (; 32 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar (; 52 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 - i32.const 100000 - i32.lt_u - if + i32.load offset=4 + i32.load + block $~lib/internal/typedarray/TypedArray#get:length|inlined.5 (result i32) 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 + i32.load offset=4 + i32.load offset=4 + set_local $1 + get_local $1 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + i32.ge_s + if + i32.const -1 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $0 + i32.load offset=4 + i32.load + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#isWhitespace (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $1 + i32.const 9 + i32.eq + tee_local $2 + if (result i32) + get_local $2 + else + get_local $1 + i32.const 10 + i32.eq + end + tee_local $2 + if (result i32) + get_local $2 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 + get_local $1 + i32.const 13 + i32.eq + end + tee_local $2 + if (result i32) + get_local $2 + else + get_local $1 + i32.const 32 + i32.eq end - unreachable - unreachable ) - (func $~lib/internal/string/allocateUnsafe (; 33 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar (; 54 ;) (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) + i32.load offset=4 + i32.load + block $~lib/internal/typedarray/TypedArray#get:length|inlined.6 (result i32) get_local $0 - get_global $~lib/internal/string/MAX_LENGTH - i32.le_s - else + i32.load offset=4 + i32.load offset=4 + set_local $1 get_local $1 + i32.load offset=8 + i32.const 0 + i32.shr_u end + i32.lt_s i32.eqz if - i32.const 0 - i32.const 328 - i32.const 14 - i32.const 2 + i32.const 1216 + i32.const 1264 + i32.const 115 + i32.const 8 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.load offset=4 + i32.load offset=4 + block (result i32) + get_local $0 + i32.load offset=4 get_local $0 + i32.load offset=4 + i32.load + tee_local $1 i32.const 1 - i32.shl i32.add - set_local $1 + i32.store get_local $1 - call $~lib/allocator/arena/__memory_allocate - br $~lib/memory/memory.allocate|inlined.1 end - set_local $2 - get_local $2 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace (; 55 ;) (type $iv) (param $0 i32) + loop $continue|0 + get_local $0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#isWhitespace + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + drop + br $continue|0 + end + end + ) + (func $json/decoder/ThrowingJSONHandler#pushObject (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + i32.const 0 + i32.eqz + if + i32.const 1344 + get_local $1 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 65 + i32.const 8 + call $~lib/env/abort + unreachable + end + i32.const 1 + ) + (func $main_near/__near_JSONHandler_FooBar#pushObject (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 - i32.store - get_local $2 + i32.load8_u offset=8 + i32.const 0 + i32.ne + i32.eqz + if + get_local $1 + i32.const 0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1312 + i32.const 253 + i32.const 6 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.const 1 + i32.store8 offset=8 + i32.const 1 + return + else + get_local $1 + i32.const 0 + call $~lib/string/String.__ne + i32.eqz + if + i32.const 0 + i32.const 1312 + i32.const 257 + i32.const 6 + call $~lib/env/abort + unreachable + end + end + get_local $0 + get_local $1 + call $json/decoder/ThrowingJSONHandler#pushObject ) - (func $~lib/internal/number/utoa32_lut (; 34 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#constructor (; 58 ;) (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 i64) - (local $10 i64) - block $~lib/internal/number/DIGITS|inlined.0 (result i32) - i32.const 896 + get_local $1 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 456 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable end - i32.load + get_local $1 + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe 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 + 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/arraybuffer/ArrayBuffer#get:data (; 59 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + ) + (func $~lib/string/String.fromUTF8 (; 60 ;) (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 100 - i32.ge_u + i32.const 1 + i32.lt_u if + i32.const 176 + return + end + i32.const 0 + set_local $2 + block $~lib/memory/memory.allocate|inlined.4 (result i32) 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 + set_local $3 + get_local $3 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.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 + set_local $4 + i32.const 0 + set_local $5 + block $break|0 + loop $continue|0 + get_local $2 get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $5 - i32.add - i32.load offset=8 + 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 64 + i32.const 510 + 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 64 + i32.const 514 + 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 64 + 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 + 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 + end + end + br $continue|0 + end 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/itoa32 (; 35 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - get_local $0 - i32.eqz - if - i32.const 320 - return - end - get_local $0 - i32.const 0 - i32.lt_s - set_local $1 - get_local $1 - if - i32.const 0 - get_local $0 - i32.sub - set_local $0 end - get_local $0 - call $~lib/internal/number/decimalCount32 - get_local $1 - i32.add - set_local $2 - get_local $2 - call $~lib/internal/string/allocateUnsafe - set_local $3 - get_local $3 - get_local $0 get_local $2 - call $~lib/internal/number/utoa32_lut - get_local $1 - if - get_local $3 - get_global $~lib/internal/string/CharCode.MINUS - i32.store16 offset=4 - end - get_local $3 - ) - (func $~lib/internal/number/itoa (; 36 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - call $~lib/internal/number/itoa32 - return - ) - (func $~lib/internal/number/itoa_stream (; 37 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) - (local $4 i32) - get_local $0 get_local $1 - i32.const 1 - i32.shl - i32.add - set_local $0 - get_local $2 + i32.eq i32.eqz - if - get_local $0 - get_global $~lib/internal/string/CharCode._0 - i32.store16 offset=4 - i32.const 1 - return - end - i32.const 0 - set_local $3 - get_local $2 - i32.const 0 - i32.lt_s - set_local $4 - get_local $4 if i32.const 0 - get_local $2 - i32.sub - set_local $2 - end - get_local $2 - call $~lib/internal/number/decimalCount32 - get_local $4 - i32.add - set_local $3 - get_local $0 - get_local $2 - get_local $3 - call $~lib/internal/number/utoa32_lut - get_local $4 - if - get_local $0 - get_global $~lib/internal/string/CharCode.MINUS - i32.store16 offset=4 + i32.const 64 + i32.const 535 + i32.const 4 + call $~lib/env/abort + unreachable end - get_local $3 - ) - (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 + get_local $5 i32.const 1 - i32.shl - i32.add + 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 $5 - get_local $2 + set_local $3 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 + block $~lib/memory/memory.free|inlined.2 + block + get_local $4 + call $~lib/allocator/arena/__memory_free + br $~lib/memory/memory.free|inlined.2 + unreachable + end + unreachable + end + get_local $7 ) - (func $~lib/string/String#substring (; 39 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/array/Array#push (; 61 ;) (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 $0 - i32.const 0 - i32.ne - i32.eqz - if - i32.const 0 - i32.const 200 - i32.const 269 - i32.const 4 - call $~lib/env/abort - unreachable - end + i32.load offset=4 + set_local $2 get_local $0 i32.load set_local $3 - get_local $1 - tee_local $4 - i32.const 0 - tee_local $5 - get_local $4 - get_local $5 - i32.gt_s - select - tee_local $4 - get_local $3 - tee_local $5 - get_local $4 - get_local $5 - i32.lt_s - select - set_local $6 - get_local $2 - tee_local $4 - i32.const 0 - tee_local $5 - get_local $4 - get_local $5 - i32.gt_s - select - tee_local $4 - get_local $3 - tee_local $5 - get_local $4 - get_local $5 - i32.lt_s - select - set_local $7 - get_local $6 - tee_local $4 - get_local $7 - tee_local $5 - get_local $4 - get_local $5 - i32.lt_s - select - set_local $8 - get_local $6 - tee_local $4 - get_local $7 - tee_local $5 - get_local $4 - get_local $5 - i32.gt_s - select - set_local $9 - get_local $9 - get_local $8 - i32.sub - set_local $3 get_local $3 - i32.eqz - if - i32.const 312 - return - end - get_local $8 - i32.eqz - tee_local $4 - if (result i32) - get_local $9 - get_local $0 - i32.load - i32.eq - else - get_local $4 - end + 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 456 + 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 - return + get_local $3 + i32.store end - get_local $3 - call $~lib/internal/string/allocateUnsafe - set_local $10 - get_local $10 - i32.const 0 get_local $0 - get_local $8 + get_local $5 + i32.store offset=4 + i32.const 0 + set_local $6 get_local $3 - call $~lib/internal/string/copyUnsafe - get_local $10 + 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 (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3378,10 +4853,10 @@ i32.const 0 i32.lt_s if - i32.const 312 + i32.const 176 return end - i32.const 312 + i32.const 176 set_local $3 get_local $0 i32.load @@ -3396,7 +4871,7 @@ get_local $2 i32.eqz if - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) i32.const 0 set_local $8 i32.const 0 @@ -3410,33 +4885,70 @@ i32.add i32.load offset=8 end - call $~lib/internal/number/itoa return end - i32.const 11 + 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 $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.2 (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 - i32.add get_local $2 i32.mul - i32.const 11 i32.add - set_local $9 - get_local $9 call $~lib/internal/string/allocateUnsafe set_local $8 - i32.const 0 - set_local $10 - block $break|0 + block $break|1 i32.const 0 set_local $11 - loop $repeat|0 + loop $repeat|1 get_local $11 get_local $2 i32.lt_s i32.eqz - br_if $break|0 + br_if $break|1 block - block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) + block $~lib/internal/arraybuffer/LOAD|inlined.3 (result i32) i32.const 0 set_local $12 get_local $5 @@ -3449,13 +4961,22 @@ i32.load offset=8 end set_local $4 - get_local $10 - get_local $8 - get_local $10 get_local $4 - call $~lib/internal/number/itoa_stream - i32.add - set_local $10 + 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 @@ -3467,479 +4988,186 @@ get_local $10 get_local $6 i32.add - set_local $10 - end - end - get_local $11 - i32.const 1 - i32.add - set_local $11 - br $repeat|0 - unreachable - end - unreachable - end - block $~lib/internal/arraybuffer/LOAD|inlined.2 (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 $10 - get_local $8 - get_local $10 - get_local $4 - call $~lib/internal/number/itoa_stream - i32.add - set_local $10 - get_local $8 - set_local $11 - get_local $9 - get_local $10 - i32.gt_s - if - get_local $8 - i32.const 0 - get_local $10 - call $~lib/string/String#substring - set_local $11 - get_local $8 - i32.eqz - if - i32.const 0 - i32.const 328 - i32.const 28 - i32.const 4 - call $~lib/env/abort - unreachable - end - block $~lib/memory/memory.free|inlined.1 - block - get_local $8 - call $~lib/allocator/arena/__memory_free - br $~lib/memory/memory.free|inlined.1 - unreachable - end - unreachable - end - end - get_local $11 - return - ) - (func $near/near.str (; 41 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - block (result i32) - i32.const 0 - i32.const 1 - call $~lib/array/Array#constructor - set_local $1 - get_local $1 - i32.const 0 - get_local $0 - call $~lib/array/Array#__unchecked_set - get_local $1 - end - set_local $1 - block $~lib/array/Array#toString|inlined.0 (result i32) - get_local $1 - i32.const 904 - call $~lib/array/Array#join - end - ) - (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 - 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 $main_near/__near_encode_Array_String (; 43 ;) (type $iiv) (param $0 i32) (param $1 i32) - (local $2 i32) - 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 - end - i32.lt_s - i32.eqz - br_if $break|0 - get_local $0 - get_local $2 - call $~lib/array/Array#__get - i32.const 0 - call $~lib/string/String.__ne - if - get_local $1 - get_local $2 - call $near/near.str - get_local $0 - get_local $2 - call $~lib/array/Array#__get - call $bson/encoder/BSONEncoder#setString - else - get_local $1 - get_local $2 - call $near/near.str - call $bson/encoder/BSONEncoder#setNull + set_local $10 + end end - get_local $2 + get_local $11 i32.const 1 i32.add - set_local $2 - br $repeat|0 + set_local $11 + br $repeat|1 unreachable end unreachable end - ) - (func $~lib/array/Array#pop (; 44 ;) (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 40 - i32.const 246 - i32.const 20 - call $~lib/env/abort - unreachable - end - block $~lib/internal/arraybuffer/LOAD|inlined.3 (result i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - i32.const 1 - i32.sub - tee_local $1 - set_local $3 + block $~lib/internal/arraybuffer/LOAD|inlined.4 (result i32) i32.const 0 - set_local $4 + set_local $11 + get_local $5 get_local $2 - get_local $3 i32.const 2 i32.shl i32.add - get_local $4 + get_local $11 i32.add i32.load offset=8 end - set_local $5 - get_local $0 - get_local $1 - i32.store offset=4 - get_local $5 + 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 $bson/encoder/BSONEncoder#popArray (; 45 ;) (type $iv) (param $0 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readHexDigit (; 63 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) get_local $0 - i32.const 0 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - i32.load - call $~lib/array/Array#pop + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar set_local $1 - get_local $0 - get_local $0 - i32.load offset=8 get_local $1 + get_global $json/decoder/CHAR_0 i32.sub - get_local $1 - call $bson/encoder/BSONEncoder#int32 - ) - (func $main_near/__near_encode_Array_Array_String (; 46 ;) (type $iiv) (param $0 i32) (param $1 i32) - (local $2 i32) - block $break|0 - i32.const 0 + set_local $2 + get_local $2 + i32.const 9 + i32.gt_s + if + get_local $1 + get_global $json/decoder/CHAR_A + i32.sub + i32.const 10 + i32.add 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 - end - i32.lt_s - i32.eqz - br_if $break|0 - get_local $0 - get_local $2 - call $~lib/array/Array>#__get - i32.const 0 - i32.ne - if - get_local $1 - get_local $2 - call $near/near.str - call $bson/encoder/BSONEncoder#pushArray - get_local $0 - get_local $2 - call $~lib/array/Array>#__get - get_local $1 - call $main_near/__near_encode_Array_String - get_local $1 - call $bson/encoder/BSONEncoder#popArray - else - get_local $1 - get_local $2 - call $near/near.str - call $bson/encoder/BSONEncoder#setNull - end + get_local $2 + i32.const 10 + i32.lt_s + tee_local $3 + if (result i32) + get_local $3 + else get_local $2 - i32.const 1 + i32.const 15 + i32.gt_s + end + if + get_local $1 + get_global $json/decoder/CHAR_A_LOWER + i32.sub + i32.const 10 i32.add set_local $2 - br $repeat|0 - unreachable end - unreachable - end - ) - (func $main_near/__near_encode_FooBar (; 47 ;) (type $iiv) (param $0 i32) (param $1 i32) - get_local $1 - i32.const 24 - get_local $0 - i32.load - call $bson/encoder/BSONEncoder#setInteger - get_local $1 - i32.const 232 - get_local $0 - i32.load offset=4 - call $bson/encoder/BSONEncoder#setInteger - get_local $1 - i32.const 248 - get_local $0 - i32.load8_u offset=8 - call $bson/encoder/BSONEncoder#setBoolean - get_local $0 - i32.load offset=12 - i32.const 0 - call $~lib/string/String.__ne - if - get_local $1 - i32.const 264 - get_local $0 - i32.load offset=12 - call $bson/encoder/BSONEncoder#setString - else - get_local $1 - i32.const 264 - call $bson/encoder/BSONEncoder#setNull - end - get_local $0 - i32.load offset=16 - i32.const 0 - i32.ne - if - get_local $1 - i32.const 280 - get_local $0 - i32.load offset=16 - call $bson/encoder/BSONEncoder#setUint8Array - else - get_local $1 - i32.const 280 - call $bson/encoder/BSONEncoder#setNull end - get_local $0 - i32.load offset=20 - i32.const 0 - i32.ne - if - get_local $1 - i32.const 296 - call $bson/encoder/BSONEncoder#pushArray - get_local $0 - i32.load offset=20 - get_local $1 - call $main_near/__near_encode_Array_Array_String - get_local $1 - call $bson/encoder/BSONEncoder#popArray - else - get_local $1 - i32.const 296 - call $bson/encoder/BSONEncoder#setNull - end - ) - (func $~lib/typedarray/Uint8Array#subarray (; 48 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - block $~lib/internal/typedarray/TypedArray#get:length|inlined.8 (result i32) - get_local $0 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - set_local $3 - get_local $1 - i32.const 0 - i32.lt_s - if - get_local $3 - get_local $1 - i32.add - tee_local $4 + block (result i32) i32.const 0 - tee_local $5 + i32.const 2 + call $~lib/array/Array#constructor + set_local $4 get_local $4 - get_local $5 - i32.gt_s - select - set_local $1 - else + i32.const 0 get_local $1 - tee_local $4 - get_local $3 - tee_local $5 + call $~lib/array/Array#__unchecked_set + get_local $4 + i32.const 1 + get_local $2 + call $~lib/array/Array#__unchecked_set get_local $4 - get_local $5 - i32.lt_s - select - set_local $1 end + set_local $4 get_local $2 i32.const 0 - i32.lt_s - if - get_local $3 + i32.ge_s + tee_local $3 + if (result i32) get_local $2 - i32.add - tee_local $4 - get_local $1 - tee_local $5 - get_local $4 - get_local $5 - i32.gt_s - select - set_local $2 + i32.const 16 + i32.lt_s else - get_local $2 - tee_local $4 get_local $3 - tee_local $5 - get_local $4 - get_local $5 - i32.lt_s - select - tee_local $4 - get_local $1 - tee_local $5 - get_local $4 - get_local $5 - i32.gt_s - select - set_local $2 end - block $~lib/memory/memory.allocate|inlined.2 (result i32) - i32.const 12 - set_local $4 - get_local $4 - call $~lib/allocator/arena/__memory_allocate - br $~lib/memory/memory.allocate|inlined.2 + i32.eqz + if + i32.const 1616 + i32.const 1264 + i32.const 269 + i32.const 8 + call $~lib/env/abort + unreachable end - set_local $4 - get_local $4 + get_local $2 + ) + (func $~lib/string/String.fromCodePoint (; 64 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) get_local $0 - i32.load - i32.store - get_local $4 + i32.const 1114111 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 34 + i32.const 4 + call $~lib/env/abort + unreachable + end get_local $0 - i32.load offset=4 + i32.const 65535 + i32.gt_s + set_local $1 get_local $1 - i32.const 0 - i32.shl + i32.const 1 i32.add - i32.store offset=4 - get_local $4 - get_local $2 + call $~lib/internal/string/allocateUnsafe + set_local $2 get_local $1 - i32.sub - i32.const 0 - i32.shl - i32.store offset=8 - get_local $4 - ) - (func $bson/encoder/BSONEncoder#serialize (; 49 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.const 0 - call $bson/encoder/BSONEncoder#writeByte - get_local $0 - get_local $0 - i32.load offset=8 - i32.const 0 - call $bson/encoder/BSONEncoder#int32 - get_local $0 - i32.load offset=4 - i32.const 0 - get_local $0 - i32.load offset=8 - call $~lib/typedarray/Uint8Array#subarray - ) - (func $bson/decoder/BSONDecoder<__near_BSONHandler_FooBar>#constructor (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - get_local $0 - if (result i32) + i32.eqz + if + get_local $2 get_local $0 + i32.store16 offset=4 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 $0 + i32.const 65536 + i32.sub + set_local $0 + get_local $0 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.add + set_local $3 + get_local $0 + i32.const 1023 + i32.and + i32.const 56320 + i32.add + set_local $4 + get_local $2 + get_local $3 + i32.const 16 + i32.shl + get_local $4 + i32.or + i32.store offset=4 end - tee_local $0 - get_local $1 - i32.store - get_local $0 + get_local $2 ) - (func $~lib/string/String.fromCharCode (; 51 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/string/String.fromCharCode (; 65 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) i32.const 1 call $~lib/internal/string/allocateUnsafe @@ -3949,328 +5177,384 @@ i32.store16 offset=4 get_local $1 ) - (func $~lib/string/String#concat (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readEscapedChar (; 66 ;) (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 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + set_local $1 + get_local $1 + i32.const 248 i32.const 0 - i32.ne - i32.eqz + call $~lib/string/String#charCodeAt + i32.eq if - i32.const 0 - i32.const 200 - i32.const 110 - i32.const 4 - call $~lib/env/abort - unreachable + i32.const 248 + return end get_local $1 + i32.const 256 i32.const 0 + call $~lib/string/String#charCodeAt i32.eq if - i32.const 1232 - set_local $1 + i32.const 256 + return 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 1568 i32.const 0 + call $~lib/string/String#charCodeAt i32.eq if - i32.const 312 + i32.const 1568 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 1576 i32.const 0 - get_local $3 - call $~lib/internal/string/copyUnsafe - get_local $5 - ) - (func $~lib/string/String.__concat (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz + call $~lib/string/String#charCodeAt + i32.eq if - i32.const 1232 - set_local $0 + i32.const 280 + return end - get_local $0 get_local $1 - call $~lib/string/String#concat - ) - (func $bson/decoder/bin2str (; 54 ;) (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) - i32.const 312 - set_local $1 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.15 (result i32) - get_local $0 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - set_local $2 + i32.const 1584 i32.const 0 - set_local $3 - block $break|0 - loop $continue|0 - get_local $3 - get_local $2 - i32.lt_s - if - block - get_local $0 - get_local $3 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - set_local $4 - get_local $4 - i32.const 128 - i32.lt_s - if - get_local $1 - get_local $4 - call $~lib/string/String.fromCharCode - call $~lib/string/String.__concat - set_local $1 - get_local $3 - i32.const 1 - i32.add - set_local $3 - else - get_local $4 - i32.const 191 - i32.gt_s - tee_local $7 - if (result i32) - get_local $4 - i32.const 224 - i32.lt_s - else - get_local $7 - end - if - get_local $0 - get_local $3 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - set_local $5 - get_local $1 - get_local $4 - i32.const 31 - i32.and - i32.const 6 - i32.shl - get_local $5 - i32.const 63 - i32.and - i32.or - call $~lib/string/String.fromCharCode - call $~lib/string/String.__concat - set_local $1 - get_local $3 - i32.const 2 - i32.add - set_local $3 - else - get_local $0 - get_local $3 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - set_local $5 - get_local $0 - get_local $3 - i32.const 2 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - set_local $6 - get_local $1 - get_local $4 - i32.const 15 - i32.and - i32.const 12 - i32.shl - get_local $5 - i32.const 63 - i32.and - i32.const 6 - i32.shl - i32.or - get_local $6 - i32.const 63 - i32.and - i32.or - call $~lib/string/String.fromCharCode - call $~lib/string/String.__concat - set_local $1 - get_local $3 - i32.const 3 - i32.add - set_local $3 - end - end - end - br $continue|0 - end - end + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 296 + return end get_local $1 - ) - (func $bson/decoder/ThrowingBSONHandler#setString (; 55 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + i32.const 1592 i32.const 0 - i32.eqz + call $~lib/string/String#charCodeAt + i32.eq if - i32.const 1248 - get_local $1 - call $~lib/string/String.__concat - i32.const 1304 - call $~lib/string/String.__concat - get_local $2 - call $~lib/string/String.__concat - i32.const 1320 - call $~lib/string/String.__concat - i32.const 976 - i32.const 45 - i32.const 7 - call $~lib/env/abort - unreachable + i32.const 312 + return end - ) - (func $main_near/__near_BSONHandler_FooBar#setString (; 56 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 - i32.const 264 - call $~lib/string/String.__eq + i32.const 1600 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 328 + return + end + get_local $1 + i32.const 1608 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq if get_local $0 - i32.load offset=8 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readHexDigit + set_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readHexDigit + set_local $3 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readHexDigit + set_local $4 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readHexDigit + set_local $5 get_local $2 - i32.store offset=12 + i32.const 4096 + i32.mul + get_local $3 + i32.const 256 + i32.mul + i32.add + get_local $4 + i32.const 16 + i32.mul + i32.add + get_local $5 + i32.add + set_local $6 + get_local $6 + call $~lib/string/String.fromCodePoint return end - get_local $0 - get_local $1 - get_local $2 - call $bson/decoder/ThrowingBSONHandler#setString + i32.const 0 + i32.eqz + if + i32.const 1664 + get_local $1 + call $~lib/string/String.fromCharCode + call $~lib/string/String.__concat + i32.const 1264 + i32.const 255 + i32.const 8 + call $~lib/env/abort + unreachable + end + i32.const 176 ) - (func $~lib/array/Array>#constructor (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readString (; 67 ;) (type $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 268435454 - i32.gt_u + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz if - i32.const 0 - i32.const 40 - i32.const 45 - i32.const 39 + i32.const 1440 + i32.const 1264 + i32.const 198 + i32.const 8 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 + i32.load offset=4 + i32.load + set_local $1 + i32.const 0 + i32.const 0 + call $~lib/array/Array#constructor + set_local $2 + block $break|0 + loop $repeat|0 + i32.const 1 + i32.eqz + br_if $break|0 + block + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + set_local $3 + get_local $3 + i32.const 32 + i32.ge_s + i32.eqz + if + i32.const 1504 + i32.const 1264 + i32.const 203 + i32.const 12 + call $~lib/env/abort + unreachable + end + get_local $3 + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $2 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.load + call $~lib/arraybuffer/ArrayBuffer#get:data + get_local $1 + i32.add + get_local $0 + i32.load offset=4 + i32.load + get_local $1 + i32.sub + i32.const 1 + i32.sub + call $~lib/string/String.fromUTF8 + call $~lib/array/Array#push + drop + get_local $2 + i32.const 176 + call $~lib/array/Array#join + return + end + get_local $3 + i32.const 256 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + i32.load offset=4 + i32.load + get_local $1 + i32.const 1 + i32.add + i32.gt_s + if + get_local $2 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.load + call $~lib/arraybuffer/ArrayBuffer#get:data + get_local $1 + i32.add + get_local $0 + i32.load offset=4 + i32.load + get_local $1 + i32.sub + i32.const 1 + i32.sub + call $~lib/string/String.fromUTF8 + call $~lib/array/Array#push + drop + end + get_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readEscapedChar + call $~lib/array/Array#push + drop + get_local $0 + i32.load offset=4 + i32.load + set_local $1 + end + end + br $repeat|0 + unreachable end - tee_local $0 + unreachable end - tee_local $0 - get_local $3 - i32.store + i32.const 176 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseKey (; 68 ;) (type $iv) (param $0 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 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace + get_local $0 + i32.load offset=4 get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readString + i32.store offset=8 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + i32.const 448 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1728 + i32.const 1264 + i32.const 161 + i32.const 8 + call $~lib/env/abort + unreachable + end + ) + (func $json/decoder/JSONHandler#popObject (; 69 ;) (type $iv) (param $0 i32) + nop ) - (func $bson/decoder/BSONDecoder<__near_BSONHandler_Array_Array_String>#constructor (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseObject (; 70 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) get_local $0 - if (result i32) + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + i32.const 1304 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=8 + set_local $1 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.load + get_local $1 + call $main_near/__near_JSONHandler_FooBar#pushObject + if 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 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + drop + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace + i32.const 1 + set_local $2 + block $break|0 + loop $continue|0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + i32.const 1400 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + block + get_local $2 + i32.eqz + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + i32.const 184 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1408 + i32.const 1264 + i32.const 144 + i32.const 20 + call $~lib/env/abort + unreachable + end + else + i32.const 0 + set_local $2 + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseKey + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseValue + drop + end + br $continue|0 + end + end + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + i32.const 1400 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1760 + i32.const 1264 + i32.const 151 + i32.const 12 + call $~lib/env/abort + unreachable end - tee_local $0 end - tee_local $0 - get_local $1 - i32.store get_local $0 + i32.load + call $json/decoder/JSONHandler#popObject + i32.const 1 ) - (func $~lib/array/Array#constructor (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array>#constructor (; 71 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4280,7 +5564,7 @@ i32.gt_u if i32.const 0 - i32.const 40 + i32.const 456 i32.const 45 i32.const 39 call $~lib/env/abort @@ -4316,1261 +5600,1256 @@ 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 $bson/decoder/BSONDecoder<__near_BSONHandler_Array_String>#constructor (; 60 ;) (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 - ) - (func $~lib/internal/string/parse (; 61 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 f64) - (local $6 i32) - (local $7 f64) - get_local $0 - i32.load - set_local $2 - get_local $2 - i32.eqz - if - f64.const nan:0x8000000000000 - return - end - get_local $0 - set_local $3 - get_local $3 - i32.load16_u offset=4 - set_local $4 - get_local $4 - get_global $~lib/internal/string/CharCode.MINUS - i32.eq - if - get_local $2 - i32.const 1 - i32.sub - tee_local $2 - i32.eqz - if - f64.const nan:0x8000000000000 - return - end - get_local $3 - i32.const 2 - i32.add - tee_local $3 - i32.load16_u offset=4 - set_local $4 - f64.const -1 - set_local $5 - else - get_local $4 - get_global $~lib/internal/string/CharCode.PLUS - i32.eq - if - get_local $2 - i32.const 1 - i32.sub - tee_local $2 - i32.eqz - if - f64.const nan:0x8000000000000 - return - end - get_local $3 - i32.const 2 - i32.add - tee_local $3 - i32.load16_u offset=4 - set_local $4 - f64.const 1 - set_local $5 - else - f64.const 1 - set_local $5 - end - end - get_local $1 - i32.eqz - if - get_local $4 - get_global $~lib/internal/string/CharCode._0 - i32.eq - tee_local $6 - if (result i32) - get_local $2 - i32.const 2 - i32.gt_s - else - get_local $6 - end - if - block $break|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - block $case0|0 - get_local $3 - i32.const 2 - i32.add - i32.load16_u offset=4 - set_local $6 - get_local $6 - get_global $~lib/internal/string/CharCode.B - i32.eq - br_if $case0|0 - get_local $6 - get_global $~lib/internal/string/CharCode.b - i32.eq - br_if $case1|0 - get_local $6 - get_global $~lib/internal/string/CharCode.O - i32.eq - br_if $case2|0 - get_local $6 - get_global $~lib/internal/string/CharCode.o - i32.eq - br_if $case3|0 - get_local $6 - get_global $~lib/internal/string/CharCode.X - i32.eq - br_if $case4|0 - get_local $6 - get_global $~lib/internal/string/CharCode.x - i32.eq - br_if $case5|0 - br $case6|0 - end - end - block - get_local $3 - i32.const 4 - i32.add - set_local $3 - get_local $2 - i32.const 2 - i32.sub - set_local $2 - i32.const 2 - set_local $1 - br $break|0 - unreachable - end - unreachable - end - end - block - get_local $3 - i32.const 4 - i32.add - set_local $3 - get_local $2 - i32.const 2 - i32.sub - set_local $2 - i32.const 8 - set_local $1 - br $break|0 - unreachable - end - unreachable - end - end - block - get_local $3 - i32.const 4 - i32.add - set_local $3 - get_local $2 - i32.const 2 - i32.sub - set_local $2 - i32.const 16 - set_local $1 - br $break|0 - unreachable - end - unreachable - end - i32.const 10 - set_local $1 - end - else - i32.const 10 - set_local $1 - end - else - get_local $1 - i32.const 2 - i32.lt_s - tee_local $6 - if (result i32) - get_local $6 - else - get_local $1 - i32.const 36 - i32.gt_s - end - if - f64.const nan:0x8000000000000 - return - end - end - f64.const 0 - set_local $7 - block $break|1 - loop $continue|1 - block (result i32) - get_local $2 - tee_local $6 - i32.const 1 - i32.sub - set_local $2 - get_local $6 - end - if - block - get_local $3 - i32.load16_u offset=4 - set_local $4 - get_local $4 - get_global $~lib/internal/string/CharCode._0 - i32.ge_s - tee_local $6 - if (result i32) - get_local $4 - get_global $~lib/internal/string/CharCode._9 - i32.le_s - else - get_local $6 - end - if - get_local $4 - get_global $~lib/internal/string/CharCode._0 - i32.sub - set_local $4 - else - get_local $4 - get_global $~lib/internal/string/CharCode.A - i32.ge_s - tee_local $6 - if (result i32) - get_local $4 - get_global $~lib/internal/string/CharCode.Z - i32.le_s - else - get_local $6 - end - if - get_local $4 - get_global $~lib/internal/string/CharCode.A - i32.const 10 - i32.sub - i32.sub - set_local $4 - else - get_local $4 - get_global $~lib/internal/string/CharCode.a - i32.ge_s - tee_local $6 - if (result i32) - get_local $4 - get_global $~lib/internal/string/CharCode.z - i32.le_s - else - get_local $6 - end - if - get_local $4 - get_global $~lib/internal/string/CharCode.a - i32.const 10 - i32.sub - i32.sub - set_local $4 - else - br $break|1 - end - end - end - get_local $4 - get_local $1 - i32.ge_s - if - br $break|1 - end - get_local $7 - get_local $1 - f64.convert_s/i32 - f64.mul - get_local $4 - f64.convert_s/i32 - f64.add - set_local $7 - get_local $3 - i32.const 2 - i32.add - set_local $3 - end - br $continue|1 - end - end - end + 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 $7 - f64.mul + get_local $2 + call $~lib/internal/memory/memset + get_local $0 ) - (func $~lib/string/parseInt (; 62 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#constructor (; 72 ;) (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 - call $~lib/internal/string/parse + i32.store + get_local $0 ) - (func $~lib/array/Array#__set (; 63 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar (; 73 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) get_local $0 + i32.load offset=4 i32.load - set_local $3 - get_local $3 + block $~lib/internal/typedarray/TypedArray#get:length|inlined.8 (result i32) + get_local $0 + i32.load offset=4 + i32.load offset=4 + set_local $1 + get_local $1 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + i32.ge_s + if + i32.const -1 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $0 + i32.load offset=4 i32.load - i32.const 2 - i32.shr_u - set_local $4 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#isWhitespace (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) get_local $1 - get_local $4 - i32.ge_u - if + i32.const 9 + i32.eq + tee_local $2 + if (result i32) + get_local $2 + else get_local $1 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 40 - i32.const 109 - i32.const 41 - call $~lib/env/abort - unreachable - end - get_local $3 + i32.const 10 + i32.eq + end + tee_local $2 + if (result i32) + get_local $2 + else 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 + i32.const 13 + i32.eq + end + tee_local $2 + if (result i32) + get_local $2 + else get_local $1 - i32.const 1 - i32.add - i32.store offset=4 + i32.const 32 + i32.eq 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 $main_near/__near_BSONHandler_Array_String#setString (; 64 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar (; 75 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) get_local $0 - i32.load offset=8 - get_local $1 - i32.const 0 - call $~lib/string/parseInt - i32.trunc_s/f64 - get_local $2 - call $~lib/array/Array#__set - ) - (func $bson/decoder/ThrowingBSONHandler#pushObject (; 65 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - i32.const 0 + i32.load offset=4 + i32.load + block $~lib/internal/typedarray/TypedArray#get:length|inlined.9 (result i32) + get_local $0 + i32.load offset=4 + i32.load offset=4 + set_local $1 + get_local $1 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + i32.lt_s i32.eqz if - i32.const 1328 - get_local $1 - call $~lib/string/String.__concat - i32.const 976 - i32.const 71 + i32.const 1216 + i32.const 1264 + i32.const 115 i32.const 8 call $~lib/env/abort unreachable end - i32.const 1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + block (result i32) + get_local $0 + i32.load offset=4 + get_local $0 + i32.load offset=4 + i32.load + tee_local $1 + i32.const 1 + i32.add + i32.store + get_local $1 + end + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and ) - (func $bson/decoder/BSONHandler#popObject (; 66 ;) (type $iv) (param $0 i32) - nop + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#skipWhitespace (; 76 ;) (type $iv) (param $0 i32) + loop $continue|0 + get_local $0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#isWhitespace + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + drop + br $continue|0 + end + end ) - (func $bson/decoder/ThrowingBSONHandler#pushArray (; 67 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - i32.const 0 - i32.eqz + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#constructor (; 77 ;) (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 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar (; 78 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + i32.load offset=4 + i32.load + block $~lib/internal/typedarray/TypedArray#get:length|inlined.11 (result i32) + get_local $0 + i32.load offset=4 + i32.load offset=4 + set_local $1 + get_local $1 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + i32.ge_s if - i32.const 1384 + i32.const -1 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $0 + i32.load offset=4 + i32.load + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#isWhitespace (; 79 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $1 + i32.const 9 + i32.eq + tee_local $2 + if (result i32) + get_local $2 + else + get_local $1 + i32.const 10 + i32.eq + end + tee_local $2 + if (result i32) + get_local $2 + else + get_local $1 + i32.const 13 + i32.eq + end + tee_local $2 + if (result i32) + get_local $2 + else + get_local $1 + i32.const 32 + i32.eq + end + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar (; 80 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + i32.load offset=4 + i32.load + block $~lib/internal/typedarray/TypedArray#get:length|inlined.12 (result i32) + get_local $0 + i32.load offset=4 + i32.load offset=4 + set_local $1 get_local $1 - call $~lib/string/String.__concat - i32.const 976 - i32.const 66 - i32.const 8 - call $~lib/env/abort - unreachable + i32.load offset=8 + i32.const 0 + i32.shr_u end - i32.const 1 - ) - (func $bson/decoder/BSONHandler#popArray (; 68 ;) (type $iv) (param $0 i32) - nop - ) - (func $bson/decoder/ThrowingBSONHandler#setUint8Array (; 69 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - i32.const 0 + i32.lt_s i32.eqz if - i32.const 1432 - get_local $1 - call $~lib/string/String.__concat - i32.const 1496 - call $~lib/string/String.__concat - get_local $2 - call $bson/decoder/bin2str - call $~lib/string/String.__concat - i32.const 976 - i32.const 62 + i32.const 1216 + i32.const 1264 + i32.const 115 i32.const 8 call $~lib/env/abort unreachable end + get_local $0 + i32.load offset=4 + i32.load offset=4 + block (result i32) + get_local $0 + i32.load offset=4 + get_local $0 + i32.load offset=4 + i32.load + tee_local $1 + i32.const 1 + i32.add + i32.store + get_local $1 + end + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and ) - (func $bson/decoder/ThrowingBSONHandler#setBoolean (; 70 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - i32.const 0 - i32.eqz + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#skipWhitespace (; 81 ;) (type $iv) (param $0 i32) + loop $continue|0 + get_local $0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#isWhitespace + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + drop + br $continue|0 + end + end + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readHexDigit (; 82 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + set_local $1 + get_local $1 + get_global $json/decoder/CHAR_0 + i32.sub + set_local $2 + get_local $2 + i32.const 9 + i32.gt_s if - i32.const 1512 get_local $1 - call $~lib/string/String.__concat - i32.const 1496 - call $~lib/string/String.__concat + get_global $json/decoder/CHAR_A + i32.sub + i32.const 10 + i32.add + set_local $2 get_local $2 - i32.const 0 - i32.ne + i32.const 10 + i32.lt_s + tee_local $3 if (result i32) - i32.const 1568 + get_local $3 else - i32.const 1584 + get_local $2 + i32.const 15 + i32.gt_s + end + if + get_local $1 + get_global $json/decoder/CHAR_A_LOWER + i32.sub + i32.const 10 + i32.add + set_local $2 end - call $~lib/string/String.__concat - i32.const 976 - i32.const 49 - i32.const 7 - call $~lib/env/abort - unreachable end - ) - (func $main_near/__near_BSONHandler_Array_String#setNull (; 71 ;) (type $iiv) (param $0 i32) (param $1 i32) - get_local $0 - i32.load offset=8 - get_local $1 - i32.const 0 - call $~lib/string/parseInt - i32.trunc_s/f64 - i32.const 0 - call $~lib/array/Array#__set - ) - (func $bson/decoder/ThrowingBSONHandler#setInteger (; 72 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) block (result i32) i32.const 0 - i32.const 1 + i32.const 2 call $~lib/array/Array#constructor - set_local $3 - get_local $3 + set_local $4 + get_local $4 i32.const 0 + get_local $1 + call $~lib/array/Array#__unchecked_set + get_local $4 + i32.const 1 get_local $2 call $~lib/array/Array#__unchecked_set - get_local $3 + get_local $4 end - set_local $3 + set_local $4 + get_local $2 i32.const 0 + i32.ge_s + tee_local $3 + if (result i32) + get_local $2 + i32.const 16 + i32.lt_s + else + get_local $3 + end i32.eqz if - i32.const 1600 - get_local $1 - call $~lib/string/String.__concat - i32.const 1496 - call $~lib/string/String.__concat - block $~lib/array/Array#toString|inlined.1 (result i32) - get_local $3 - i32.const 904 - call $~lib/array/Array#join - end - call $~lib/string/String.__concat - i32.const 976 - i32.const 58 - i32.const 7 + i32.const 1616 + i32.const 1264 + i32.const 269 + i32.const 8 call $~lib/env/abort unreachable end + get_local $2 ) - (func $bson/decoder/BSONDecoder<__near_BSONHandler_Array_String>#deserialize (; 73 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readEscapedChar (; 83 ;) (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 $0 - get_local $2 - i32.store offset=4 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.22 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + set_local $1 + get_local $1 + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 248 + return end - i32.const 5 - i32.ge_s - i32.eqz + get_local $1 + i32.const 256 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq if - i32.const 912 - i32.const 976 - i32.const 87 - i32.const 8 - call $~lib/env/abort - unreachable + i32.const 256 + return end get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + i32.const 1568 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 1568 + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + i32.const 1576 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 280 + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + i32.const 1584 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 296 + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or get_local $1 - block (result i32) + i32.const 1592 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 312 + return + end + get_local $1 + i32.const 1600 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 328 + return + end + get_local $1 + i32.const 1608 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readHexDigit + set_local $2 get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readHexDigit + set_local $3 get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readHexDigit + set_local $4 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readHexDigit + set_local $5 + get_local $2 + i32.const 4096 + i32.mul get_local $3 + i32.const 256 + i32.mul + i32.add + get_local $4 + i32.const 16 + i32.mul + i32.add + get_local $5 + i32.add + set_local $6 + get_local $6 + call $~lib/string/String.fromCodePoint + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $3 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.23 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.le_s + i32.const 0 i32.eqz if - i32.const 1016 - i32.const 976 - i32.const 90 + i32.const 1664 + get_local $1 + call $~lib/string/String.fromCharCode + call $~lib/string/String.__concat + i32.const 1264 + i32.const 255 i32.const 8 call $~lib/env/abort unreachable end - get_local $1 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.24 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.const 1 - i32.sub - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and + i32.const 176 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readString (; 84 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + i32.const 248 i32.const 0 + call $~lib/string/String#charCodeAt i32.eq i32.eqz if - i32.const 1080 - i32.const 976 - i32.const 91 + i32.const 1440 + i32.const 1264 + i32.const 198 i32.const 8 call $~lib/env/abort unreachable end + get_local $0 + i32.load offset=4 + i32.load + set_local $1 + i32.const 0 + i32.const 0 + call $~lib/array/Array#constructor + set_local $2 block $break|0 loop $repeat|0 i32.const 1 i32.eqz br_if $break|0 block - get_local $1 - block (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + set_local $3 + get_local $3 + i32.const 32 + i32.ge_s + i32.eqz + if + i32.const 1504 + i32.const 1264 + i32.const 203 + i32.const 12 + call $~lib/env/abort + unreachable + end + get_local $3 + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $2 get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.load + call $~lib/arraybuffer/ArrayBuffer#get:data + get_local $1 + i32.add get_local $0 i32.load offset=4 - tee_local $4 + i32.load + get_local $1 + i32.sub i32.const 1 - i32.add - i32.store offset=4 - get_local $4 + i32.sub + call $~lib/string/String.fromUTF8 + call $~lib/array/Array#push + drop + get_local $2 + i32.const 176 + call $~lib/array/Array#join + return end - call $~lib/internal/typedarray/TypedArray#__get - set_local $4 - get_local $4 - i32.const 255 - i32.and + get_local $3 + i32.const 256 i32.const 0 + call $~lib/string/String#charCodeAt i32.eq if - br $break|0 - end - get_local $0 - i32.load offset=4 - set_local $5 - block $break|1 - loop $repeat|1 - get_local $1 - get_local $5 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 0 - i32.ne - tee_local $6 - if (result i32) - get_local $5 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.26 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.lt_s - else - get_local $6 - end - i32.eqz - br_if $break|1 - nop - get_local $5 - i32.const 1 - i32.add - set_local $5 - br $repeat|1 - unreachable - end - unreachable - end - get_local $5 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.27 (result i32) + get_local $0 + i32.load offset=4 + i32.load get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.const 1 - i32.sub - i32.lt_s - i32.eqz - if - i32.const 1160 - i32.const 976 - i32.const 101 - i32.const 12 - call $~lib/env/abort - unreachable - end - get_local $1 - get_local $0 - i32.load offset=4 - get_local $5 - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/bin2str - set_local $6 - get_local $0 - get_local $5 - i32.const 1 - i32.add - tee_local $5 - i32.store offset=4 - block $break|2 - block $case7|2 - block $case6|2 - block $case5|2 - block $case4|2 - block $case3|2 - block $case2|2 - block $case1|2 - block $case0|2 - get_local $4 - i32.const 255 - i32.and - set_local $7 - get_local $7 - i32.const 2 - i32.eq - br_if $case0|2 - get_local $7 - i32.const 3 - i32.eq - br_if $case1|2 - get_local $7 - i32.const 4 - i32.eq - br_if $case2|2 - get_local $7 - i32.const 5 - i32.eq - br_if $case3|2 - get_local $7 - i32.const 8 - i32.eq - br_if $case4|2 - get_local $7 - i32.const 10 - i32.eq - br_if $case5|2 - get_local $7 - i32.const 16 - i32.eq - br_if $case6|2 - br $case7|2 - end - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - get_local $1 - get_local $0 - i32.load offset=4 - block (result i32) - get_local $0 - i32.load offset=4 - get_local $3 - i32.const 1 - i32.sub - i32.add - set_local $7 - get_local $0 - get_local $7 - i32.store offset=4 - get_local $7 - end - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/bin2str - call $main_near/__near_BSONHandler_Array_String#setString - get_local $0 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - i32.store offset=4 - br $break|2 - end - get_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 2 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 3 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - call $bson/decoder/ThrowingBSONHandler#pushObject - if - get_local $0 - get_local $1 - get_local $0 - i32.load offset=4 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_String>#deserialize - else - get_local $0 - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - i32.store offset=4 - end - get_local $0 - i32.load - call $bson/decoder/BSONHandler#popObject - br $break|2 - end - get_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 2 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 3 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - call $bson/decoder/ThrowingBSONHandler#pushArray - if - get_local $0 - get_local $1 - get_local $0 - i32.load offset=4 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_String>#deserialize - else - get_local $0 - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - i32.store offset=4 - end - get_local $0 - i32.load - call $bson/decoder/BSONHandler#popArray - br $break|2 - end - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 4 - i32.eq - if - return - end - get_local $0 - i32.load - get_local $6 - get_local $1 - get_local $0 - i32.load offset=4 - block (result i32) - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - set_local $7 - get_local $0 - get_local $7 - i32.store offset=4 - get_local $7 - end - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/ThrowingBSONHandler#setUint8Array - br $break|2 - end - get_local $0 - i32.load - get_local $6 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 1 - i32.eq - call $bson/decoder/ThrowingBSONHandler#setBoolean - br $break|2 - end - get_local $0 - i32.load - get_local $6 - call $main_near/__near_BSONHandler_Array_String#setNull - br $break|2 - end + i32.const 1 + i32.add + i32.gt_s + if + get_local $2 get_local $0 + i32.load offset=4 + i32.load offset=4 i32.load - get_local $6 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or + call $~lib/arraybuffer/ArrayBuffer#get:data get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or + i32.add + get_local $0 + i32.load offset=4 + i32.load get_local $1 - block (result i32) - get_local $0 + i32.sub + i32.const 1 + i32.sub + call $~lib/string/String.fromUTF8 + call $~lib/array/Array#push + drop + end + get_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readEscapedChar + call $~lib/array/Array#push + drop + get_local $0 + i32.load offset=4 + i32.load + set_local $1 + end + end + br $repeat|0 + unreachable + end + unreachable + end + i32.const 176 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseKey (; 85 ;) (type $iv) (param $0 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#skipWhitespace + get_local $0 + i32.load offset=4 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readString + i32.store offset=8 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#skipWhitespace + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + i32.const 448 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1728 + i32.const 1264 + i32.const 161 + i32.const 8 + call $~lib/env/abort + unreachable + end + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseObject (; 86 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + i32.const 1304 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=8 + set_local $1 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.load + get_local $1 + call $json/decoder/ThrowingJSONHandler#pushObject + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + drop + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#skipWhitespace + i32.const 1 + set_local $2 + block $break|0 + loop $continue|0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + i32.const 1400 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + block + get_local $2 + i32.eqz + if get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + i32.const 184 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1408 + i32.const 1264 + i32.const 144 + i32.const 20 + call $~lib/env/abort + unreachable + end + else + i32.const 0 + set_local $2 end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - call $bson/decoder/ThrowingBSONHandler#setInteger - br $break|2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseKey + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseValue + drop end - i32.const 0 - i32.eqz - if - i32.const 1656 - i32.const 976 - i32.const 154 - i32.const 20 - call $~lib/env/abort - unreachable + br $continue|0 + end + end + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + i32.const 1400 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1760 + i32.const 1264 + i32.const 151 + i32.const 12 + call $~lib/env/abort + unreachable + end + end + get_local $0 + i32.load + call $json/decoder/JSONHandler#popObject + i32.const 1 + ) + (func $json/decoder/ThrowingJSONHandler#pushArray (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + i32.const 0 + i32.eqz + if + i32.const 1816 + get_local $1 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 60 + i32.const 8 + call $~lib/env/abort + unreachable + end + i32.const 1 + ) + (func $json/decoder/JSONHandler#popArray (; 88 ;) (type $iv) (param $0 i32) + nop + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseArray (; 89 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + i32.const 1136 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=8 + set_local $1 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.load + get_local $1 + call $json/decoder/ThrowingJSONHandler#pushArray + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + drop + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#skipWhitespace + i32.const 1 + set_local $2 + block $break|0 + loop $continue|0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + i32.const 1144 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + block + get_local $2 + i32.eqz + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + i32.const 184 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1408 + i32.const 1264 + i32.const 177 + i32.const 20 + call $~lib/env/abort + unreachable + end + else + i32.const 0 + set_local $2 + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseValue + drop end + br $continue|0 + end + end + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + i32.const 1144 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1872 + i32.const 1264 + i32.const 183 + i32.const 12 + call $~lib/env/abort + unreachable + end + end + get_local $0 + i32.load + call $json/decoder/JSONHandler#popArray + i32.const 1 + return + ) + (func $main_near/__near_JSONHandler_Array_String#setString (; 90 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + i32.load offset=12 + get_local $2 + call $~lib/array/Array#push + drop + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseString (; 91 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readString + call $main_near/__near_JSONHandler_Array_String#setString + i32.const 1 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readAndAssert (; 92 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + block $break|0 + i32.const 0 + set_local $2 + loop $repeat|0 + get_local $2 + get_local $1 + i32.load + i32.lt_s + i32.eqz + br_if $break|0 + get_local $1 + get_local $2 + call $~lib/string/String#charCodeAt + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + i32.eq + i32.eqz + if + i32.const 1928 + get_local $1 + call $~lib/string/String.__concat + i32.const 1952 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 321 + i32.const 12 + call $~lib/env/abort + unreachable + end + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + unreachable + end + unreachable + end + ) + (func $json/decoder/ThrowingJSONHandler#setBoolean (; 93 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + i32.const 0 + i32.eqz + if + i32.const 1960 + get_local $1 + call $~lib/string/String.__concat + i32.const 2008 + call $~lib/string/String.__concat + get_local $2 + i32.const 0 + i32.ne + if (result i32) + i32.const 8 + else + i32.const 24 + end + call $~lib/string/String.__concat + i32.const 1264 + i32.const 47 + i32.const 7 + call $~lib/env/abort + unreachable + end + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseBoolean (; 94 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + get_global $json/decoder/FALSE_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + get_global $json/decoder/FALSE_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + i32.const 0 + call $json/decoder/ThrowingJSONHandler#setBoolean + i32.const 1 + return + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + get_global $json/decoder/TRUE_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + get_global $json/decoder/TRUE_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + i32.const 1 + call $json/decoder/ThrowingJSONHandler#setBoolean + i32.const 1 + return + end + i32.const 0 + ) + (func $json/decoder/ThrowingJSONHandler#setInteger (; 95 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + block (result i32) + i32.const 0 + i32.const 1 + call $~lib/array/Array#constructor + set_local $3 + get_local $3 + i32.const 0 + get_local $2 + call $~lib/array/Array#__unchecked_set + get_local $3 + end + set_local $3 + i32.const 0 + i32.eqz + if + i32.const 2032 + get_local $1 + call $~lib/string/String.__concat + i32.const 2008 + call $~lib/string/String.__concat + block $~lib/array/Array#toString|inlined.1 (result i32) + get_local $3 + i32.const 184 + call $~lib/array/Array#join + end + call $~lib/string/String.__concat + i32.const 1264 + i32.const 56 + i32.const 7 + call $~lib/env/abort + unreachable + end + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseNumber (; 96 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + i32.const 0 + set_local $1 + i32.const 1 + set_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + i32.const 2024 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const -1 + set_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + drop + end + i32.const 0 + set_local $3 + block $break|0 + loop $continue|0 + get_global $json/decoder/CHAR_0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + i32.le_s + tee_local $4 + if (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + get_global $json/decoder/CHAR_9 + i32.le_s + else + get_local $4 + end + if + block + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar + set_local $4 + get_local $1 + i32.const 10 + i32.mul + set_local $1 + get_local $1 + get_local $4 + get_global $json/decoder/CHAR_0 + i32.sub + i32.add + set_local $1 + get_local $3 + i32.const 1 + i32.add + set_local $3 end + br $continue|0 end - br $repeat|0 - unreachable end + end + get_local $3 + i32.const 0 + i32.gt_s + if + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + get_local $1 + get_local $2 + i32.mul + call $json/decoder/ThrowingJSONHandler#setInteger + i32.const 1 + return + end + i32.const 0 + ) + (func $main_near/__near_JSONHandler_Array_String#setNull (; 97 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + i32.load offset=12 + i32.const 0 + call $~lib/array/Array#push + drop + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseNull (; 98 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar + get_global $json/decoder/NULL_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + get_global $json/decoder/NULL_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + call $main_near/__near_JSONHandler_Array_String#setNull + i32.const 1 + return + end + i32.const 0 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseValue (; 99 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#skipWhitespace + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseObject + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseArray + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseString + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseBoolean + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseNumber + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseNull + end + set_local $1 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#skipWhitespace + get_local $1 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#deserialize (; 100 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + get_local $2 + if + get_local $0 + get_local $2 + i32.store offset=4 + else + get_local $0 + block (result i32) + i32.const 12 + 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 + i32.const 0 + i32.store offset=8 + get_local $3 + end + i32.store offset=4 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store + get_local $0 + i32.load offset=4 + get_local $1 + i32.store offset=4 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#parseValue + i32.const 0 + i32.ne + i32.eqz + if + i32.const 2088 + i32.const 1264 + i32.const 103 + i32.const 8 + call $~lib/env/abort unreachable end ) - (func $main_near/__near_decode_Array_String (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $main_near/__near_decode_Array_String (; 101 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) block (result i32) - i32.const 12 + i32.const 16 call $~lib/memory/memory.allocate set_local $2 get_local $2 @@ -5581,9 +6860,12 @@ i32.store offset=4 get_local $2 i32.const 0 + i32.store8 offset=8 + get_local $2 + i32.const 0 i32.const 0 call $~lib/array/Array#constructor - i32.store offset=8 + i32.store offset=12 get_local $2 end set_local $2 @@ -5593,20 +6875,25 @@ get_local $2 i32.const 0 get_local $2 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_String>#constructor + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#constructor i32.store offset=4 get_local $2 i32.load offset=4 get_local $0 get_local $1 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_String>#deserialize + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#deserialize get_local $2 - i32.load offset=8 + i32.load offset=12 ) - (func $~lib/array/Array>#__set (; 75 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array>#push (; 102 ;) (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 @@ -5615,25 +6902,27 @@ i32.const 2 i32.shr_u set_local $4 - get_local $1 + get_local $2 + i32.const 1 + i32.add + set_local $5 + get_local $2 get_local $4 i32.ge_u if - get_local $1 + get_local $2 i32.const 268435454 i32.ge_u if i32.const 0 - i32.const 40 - i32.const 109 - i32.const 41 + i32.const 456 + i32.const 184 + i32.const 42 call $~lib/env/abort unreachable - end - get_local $3 - get_local $1 - i32.const 1 - i32.add + end + get_local $3 + get_local $5 i32.const 2 i32.shl call $~lib/internal/arraybuffer/reallocateUnsafe @@ -5641,778 +6930,359 @@ get_local $0 get_local $3 i32.store - get_local $0 - get_local $1 - i32.const 1 - i32.add - i32.store offset=4 end + get_local $0 + get_local $5 + i32.store offset=4 i32.const 0 - set_local $5 + set_local $6 get_local $3 - get_local $1 + get_local $2 i32.const 2 i32.shl i32.add - get_local $5 + get_local $6 i32.add - get_local $2 + get_local $1 i32.store offset=8 + get_local $5 ) - (func $main_near/__near_BSONHandler_Array_Array_String#pushObject (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $main_near/__near_JSONHandler_Array_Array_String#pushObject (; 103 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 - i32.load offset=8 - get_local $1 - i32.const 0 - call $~lib/string/parseInt - i32.trunc_s/f64 + i32.load offset=12 get_local $0 i32.load get_local $0 i32.load offset=4 i32.load offset=4 call $main_near/__near_decode_Array_String - call $~lib/array/Array>#__set + call $~lib/array/Array>#push + drop i32.const 0 ) - (func $main_near/__near_BSONHandler_Array_Array_String#pushArray (; 77 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readHexDigit (; 104 ;) (type $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 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + set_local $1 get_local $1 + get_global $json/decoder/CHAR_0 + i32.sub + set_local $2 + get_local $2 + i32.const 9 + i32.gt_s + if + get_local $1 + get_global $json/decoder/CHAR_A + i32.sub + i32.const 10 + i32.add + set_local $2 + get_local $2 + i32.const 10 + i32.lt_s + tee_local $3 + if (result i32) + get_local $3 + else + get_local $2 + i32.const 15 + i32.gt_s + end + if + get_local $1 + get_global $json/decoder/CHAR_A_LOWER + i32.sub + i32.const 10 + i32.add + set_local $2 + end + end + block (result i32) + i32.const 0 + i32.const 2 + call $~lib/array/Array#constructor + set_local $4 + get_local $4 + i32.const 0 + get_local $1 + call $~lib/array/Array#__unchecked_set + get_local $4 + i32.const 1 + get_local $2 + call $~lib/array/Array#__unchecked_set + get_local $4 + end + set_local $4 + get_local $2 i32.const 0 - call $~lib/string/parseInt - i32.trunc_s/f64 - get_local $0 - i32.load - get_local $0 - i32.load offset=4 - i32.load offset=4 - call $main_near/__near_decode_Array_String - call $~lib/array/Array>#__set - i32.const 0 - ) - (func $bson/decoder/ThrowingBSONHandler#setNull (; 78 ;) (type $iiv) (param $0 i32) (param $1 i32) - i32.const 0 + i32.ge_s + tee_local $3 + if (result i32) + get_local $2 + i32.const 16 + i32.lt_s + else + get_local $3 + end i32.eqz if - i32.const 1720 - get_local $1 - call $~lib/string/String.__concat - i32.const 976 - i32.const 53 - i32.const 7 + i32.const 1616 + i32.const 1264 + i32.const 269 + i32.const 8 call $~lib/env/abort unreachable end + get_local $2 ) - (func $bson/decoder/BSONDecoder<__near_BSONHandler_Array_Array_String>#deserialize (; 79 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readEscapedChar (; 105 ;) (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 $0 - get_local $2 - i32.store offset=4 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.16 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + set_local $1 + get_local $1 + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 248 + return end - i32.const 5 - i32.ge_s - i32.eqz + get_local $1 + i32.const 256 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq if - i32.const 912 - i32.const 976 - i32.const 87 - i32.const 8 - call $~lib/env/abort - unreachable + i32.const 256 + return end get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + i32.const 1568 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 1568 + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + i32.const 1576 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 280 + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + i32.const 1584 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 296 + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or get_local $1 - block (result i32) + i32.const 1592 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 312 + return + end + get_local $1 + i32.const 1600 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const 328 + return + end + get_local $1 + i32.const 1608 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readHexDigit + set_local $2 get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readHexDigit + set_local $3 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readHexDigit + set_local $4 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readHexDigit + set_local $5 + get_local $2 + i32.const 4096 + i32.mul get_local $3 + i32.const 256 + i32.mul + i32.add + get_local $4 + i32.const 16 + i32.mul + i32.add + get_local $5 + i32.add + set_local $6 + get_local $6 + call $~lib/string/String.fromCodePoint + return end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $3 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.17 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.le_s + i32.const 0 i32.eqz if - i32.const 1016 - i32.const 976 - i32.const 90 + i32.const 1664 + get_local $1 + call $~lib/string/String.fromCharCode + call $~lib/string/String.__concat + i32.const 1264 + i32.const 255 i32.const 8 call $~lib/env/abort unreachable end - get_local $1 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.18 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.const 1 - i32.sub - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and + i32.const 176 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readString (; 106 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + i32.const 248 i32.const 0 + call $~lib/string/String#charCodeAt i32.eq i32.eqz if - i32.const 1080 - i32.const 976 - i32.const 91 + i32.const 1440 + i32.const 1264 + i32.const 198 i32.const 8 call $~lib/env/abort unreachable end + get_local $0 + i32.load offset=4 + i32.load + set_local $1 + i32.const 0 + i32.const 0 + call $~lib/array/Array#constructor + set_local $2 block $break|0 loop $repeat|0 i32.const 1 i32.eqz br_if $break|0 block - get_local $1 - block (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + set_local $3 + get_local $3 + i32.const 32 + i32.ge_s + i32.eqz + if + i32.const 1504 + i32.const 1264 + i32.const 203 + i32.const 12 + call $~lib/env/abort + unreachable + end + get_local $3 + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $2 get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.load + call $~lib/arraybuffer/ArrayBuffer#get:data + get_local $1 + i32.add get_local $0 i32.load offset=4 - tee_local $4 + i32.load + get_local $1 + i32.sub i32.const 1 - i32.add - i32.store offset=4 - get_local $4 + i32.sub + call $~lib/string/String.fromUTF8 + call $~lib/array/Array#push + drop + get_local $2 + i32.const 176 + call $~lib/array/Array#join + return end - call $~lib/internal/typedarray/TypedArray#__get - set_local $4 - get_local $4 - i32.const 255 - i32.and + get_local $3 + i32.const 256 i32.const 0 + call $~lib/string/String#charCodeAt i32.eq if - br $break|0 - end - get_local $0 - i32.load offset=4 - set_local $5 - block $break|1 - loop $repeat|1 - get_local $1 - get_local $5 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 0 - i32.ne - tee_local $6 - if (result i32) - get_local $5 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.20 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.lt_s - else - get_local $6 - end - i32.eqz - br_if $break|1 - nop - get_local $5 - i32.const 1 - i32.add - set_local $5 - br $repeat|1 - unreachable - end - unreachable - end - get_local $5 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.21 (result i32) + get_local $0 + i32.load offset=4 + i32.load get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.const 1 - i32.sub - i32.lt_s - i32.eqz - if - i32.const 1160 - i32.const 976 - i32.const 101 - i32.const 12 - call $~lib/env/abort - unreachable - end - get_local $1 - get_local $0 - i32.load offset=4 - get_local $5 - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/bin2str - set_local $6 - get_local $0 - get_local $5 - i32.const 1 - i32.add - tee_local $5 - i32.store offset=4 - block $break|2 - block $case7|2 - block $case6|2 - block $case5|2 - block $case4|2 - block $case3|2 - block $case2|2 - block $case1|2 - block $case0|2 - get_local $4 - i32.const 255 - i32.and - set_local $7 - get_local $7 - i32.const 2 - i32.eq - br_if $case0|2 - get_local $7 - i32.const 3 - i32.eq - br_if $case1|2 - get_local $7 - i32.const 4 - i32.eq - br_if $case2|2 - get_local $7 - i32.const 5 - i32.eq - br_if $case3|2 - get_local $7 - i32.const 8 - i32.eq - br_if $case4|2 - get_local $7 - i32.const 10 - i32.eq - br_if $case5|2 - get_local $7 - i32.const 16 - i32.eq - br_if $case6|2 - br $case7|2 - end - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - get_local $1 - get_local $0 - i32.load offset=4 - block (result i32) - get_local $0 - i32.load offset=4 - get_local $3 - i32.const 1 - i32.sub - i32.add - set_local $7 - get_local $0 - get_local $7 - i32.store offset=4 - get_local $7 - end - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/bin2str - call $bson/decoder/ThrowingBSONHandler#setString - get_local $0 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - i32.store offset=4 - br $break|2 - end - get_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 2 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 3 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - call $main_near/__near_BSONHandler_Array_Array_String#pushObject - if - get_local $0 - get_local $1 - get_local $0 - i32.load offset=4 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_Array_String>#deserialize - else - get_local $0 - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - i32.store offset=4 - end - get_local $0 - i32.load - call $bson/decoder/BSONHandler#popObject - br $break|2 - end - get_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 2 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 3 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - call $main_near/__near_BSONHandler_Array_Array_String#pushArray - if - get_local $0 - get_local $1 - get_local $0 - i32.load offset=4 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_Array_String>#deserialize - else - get_local $0 - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - i32.store offset=4 - end - get_local $0 - i32.load - call $bson/decoder/BSONHandler#popArray - br $break|2 - end - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 4 - i32.eq - if - return - end - get_local $0 - i32.load - get_local $6 - get_local $1 - get_local $0 - i32.load offset=4 - block (result i32) - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - set_local $7 - get_local $0 - get_local $7 - i32.store offset=4 - get_local $7 - end - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/ThrowingBSONHandler#setUint8Array - br $break|2 - end - get_local $0 - i32.load - get_local $6 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 1 - i32.eq - call $bson/decoder/ThrowingBSONHandler#setBoolean - br $break|2 - end - get_local $0 - i32.load - get_local $6 - call $bson/decoder/ThrowingBSONHandler#setNull - br $break|2 - end + i32.const 1 + i32.add + i32.gt_s + if + get_local $2 get_local $0 + i32.load offset=4 + i32.load offset=4 i32.load - get_local $6 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or + call $~lib/arraybuffer/ArrayBuffer#get:data get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or + i32.add + get_local $0 + i32.load offset=4 + i32.load get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - call $bson/decoder/ThrowingBSONHandler#setInteger - br $break|2 - end - i32.const 0 - i32.eqz - if - i32.const 1656 - i32.const 976 - i32.const 154 - i32.const 20 - call $~lib/env/abort - unreachable + i32.sub + i32.const 1 + i32.sub + call $~lib/string/String.fromUTF8 + call $~lib/array/Array#push + drop end + get_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readEscapedChar + call $~lib/array/Array#push + drop + get_local $0 + i32.load offset=4 + i32.load + set_local $1 end end br $repeat|0 @@ -6420,931 +7290,1183 @@ end unreachable end + i32.const 176 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseKey (; 107 ;) (type $iv) (param $0 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#skipWhitespace + get_local $0 + i32.load offset=4 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readString + i32.store offset=8 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#skipWhitespace + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + i32.const 448 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1728 + i32.const 1264 + i32.const 161 + i32.const 8 + call $~lib/env/abort + unreachable + end ) - (func $main_near/__near_decode_Array_Array_String (; 80 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseObject (; 108 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) - 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 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + i32.const 1304 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if i32.const 0 - call $~lib/array/Array>#constructor - i32.store offset=8 - get_local $2 + return end - set_local $2 - get_local $2 get_local $0 - i32.store - get_local $2 - i32.const 0 - get_local $2 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_Array_String>#constructor - i32.store offset=4 - get_local $2 i32.load offset=4 - get_local $0 - get_local $1 - call $bson/decoder/BSONDecoder<__near_BSONHandler_Array_Array_String>#deserialize - get_local $2 i32.load offset=8 - ) - (func $main_near/__near_BSONHandler_FooBar#pushObject (; 81 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + set_local $1 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.load get_local $1 - i32.const 296 - call $~lib/string/String.__eq + call $main_near/__near_JSONHandler_Array_Array_String#pushObject if get_local $0 - i32.load offset=8 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + drop get_local $0 - i32.load + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#skipWhitespace + i32.const 1 + set_local $2 + block $break|0 + loop $continue|0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + i32.const 1400 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + block + get_local $2 + i32.eqz + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + i32.const 184 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1408 + i32.const 1264 + i32.const 144 + i32.const 20 + call $~lib/env/abort + unreachable + end + else + i32.const 0 + set_local $2 + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseKey + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseValue + drop + end + br $continue|0 + end + end + end get_local $0 - i32.load offset=4 - i32.load offset=4 - call $main_near/__near_decode_Array_Array_String - i32.store offset=20 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + i32.const 1400 i32.const 0 - return + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1760 + i32.const 1264 + i32.const 151 + i32.const 12 + call $~lib/env/abort + unreachable + end end get_local $0 - get_local $1 - call $bson/decoder/ThrowingBSONHandler#pushObject + i32.load + call $json/decoder/JSONHandler#popObject + i32.const 1 ) - (func $main_near/__near_BSONHandler_FooBar#pushArray (; 82 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $main_near/__near_JSONHandler_Array_Array_String#pushArray (; 109 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $1 - i32.const 296 + i32.const 0 call $~lib/string/String.__eq + i32.eqz if - get_local $0 - i32.load offset=8 - get_local $0 - i32.load - get_local $0 - i32.load offset=4 - i32.load offset=4 - call $main_near/__near_decode_Array_Array_String - i32.store offset=20 i32.const 0 + i32.const 1312 + i32.const 288 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.load8_u offset=8 + i32.const 0 + i32.ne + i32.eqz + if + get_local $0 + i32.const 1 + i32.store8 offset=8 + i32.const 1 return end get_local $0 - get_local $1 - call $bson/decoder/ThrowingBSONHandler#pushArray + i32.load offset=12 + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=4 + call $main_near/__near_decode_Array_String + call $~lib/array/Array>#push + drop + i32.const 0 ) - (func $main_near/__near_BSONHandler_FooBar#setUint8Array (; 83 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseArray (; 110 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + i32.const 1136 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=8 + set_local $1 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.load get_local $1 - i32.const 280 - call $~lib/string/String.__eq + call $main_near/__near_JSONHandler_Array_Array_String#pushArray if get_local $0 - i32.load offset=8 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + drop + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#skipWhitespace + i32.const 1 + set_local $2 + block $break|0 + loop $continue|0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + i32.const 1144 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + block + get_local $2 + i32.eqz + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + i32.const 184 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1408 + i32.const 1264 + i32.const 177 + i32.const 20 + call $~lib/env/abort + unreachable + end + else + i32.const 0 + set_local $2 + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseValue + drop + end + br $continue|0 + end + end + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + i32.const 1144 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1872 + i32.const 1264 + i32.const 183 + i32.const 12 + call $~lib/env/abort + unreachable + end + end + get_local $0 + i32.load + call $json/decoder/JSONHandler#popArray + i32.const 1 + return + ) + (func $json/decoder/ThrowingJSONHandler#setString (; 111 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + i32.const 0 + i32.eqz + if + i32.const 2128 + get_local $1 + call $~lib/string/String.__concat + i32.const 2184 + call $~lib/string/String.__concat get_local $2 - i32.store offset=16 + call $~lib/string/String.__concat + i32.const 248 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 43 + i32.const 7 + call $~lib/env/abort + unreachable + end + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseString (; 112 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 return end get_local $0 - get_local $1 - get_local $2 - call $bson/decoder/ThrowingBSONHandler#setUint8Array + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readString + call $json/decoder/ThrowingJSONHandler#setString + i32.const 1 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readAndAssert (; 113 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + block $break|0 + i32.const 0 + set_local $2 + loop $repeat|0 + get_local $2 + get_local $1 + i32.load + i32.lt_s + i32.eqz + br_if $break|0 + get_local $1 + get_local $2 + call $~lib/string/String#charCodeAt + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + i32.eq + i32.eqz + if + i32.const 1928 + get_local $1 + call $~lib/string/String.__concat + i32.const 1952 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 321 + i32.const 12 + call $~lib/env/abort + unreachable + end + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + unreachable + end + unreachable + end ) - (func $main_near/__near_BSONHandler_FooBar#setBoolean (; 84 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - get_local $1 - i32.const 248 - call $~lib/string/String.__eq + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseBoolean (; 114 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + get_global $json/decoder/FALSE_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq if get_local $0 + get_global $json/decoder/FALSE_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 i32.load offset=8 - get_local $2 i32.const 0 - i32.ne - i32.store8 offset=8 + call $json/decoder/ThrowingJSONHandler#setBoolean + i32.const 1 return end get_local $0 - get_local $1 - get_local $2 - call $bson/decoder/ThrowingBSONHandler#setBoolean - ) - (func $main_near/__near_BSONHandler_FooBar#setNull (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) - get_local $1 - i32.const 24 - call $~lib/string/String.__eq + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + get_global $json/decoder/TRUE_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq if get_local $0 - i32.load offset=8 - i32.const 0 - i32.store - return - end - get_local $1 - i32.const 232 - call $~lib/string/String.__eq - if + get_global $json/decoder/TRUE_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readAndAssert get_local $0 - i32.load offset=8 - i32.const 0 - i32.store offset=4 - return - end - get_local $1 - i32.const 248 - call $~lib/string/String.__eq - if + i32.load get_local $0 + i32.load offset=4 i32.load offset=8 - i32.const 0 - i32.store8 offset=8 + i32.const 1 + call $json/decoder/ThrowingJSONHandler#setBoolean + i32.const 1 return end - get_local $1 - i32.const 264 - call $~lib/string/String.__eq + i32.const 0 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseNumber (; 115 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + i32.const 0 + set_local $1 + i32.const 1 + set_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + i32.const 2024 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq if + i32.const -1 + set_local $2 get_local $0 - i32.load offset=8 - i32.const 0 - i32.store offset=12 - return + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + drop end - get_local $1 - i32.const 280 - call $~lib/string/String.__eq - if - get_local $0 - i32.load offset=8 - i32.const 0 - i32.store offset=16 - return + i32.const 0 + set_local $3 + block $break|0 + loop $continue|0 + get_global $json/decoder/CHAR_0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + i32.le_s + tee_local $4 + if (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + get_global $json/decoder/CHAR_9 + i32.le_s + else + get_local $4 + end + if + block + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readChar + set_local $4 + get_local $1 + i32.const 10 + i32.mul + set_local $1 + get_local $1 + get_local $4 + get_global $json/decoder/CHAR_0 + i32.sub + i32.add + set_local $1 + get_local $3 + i32.const 1 + i32.add + set_local $3 + end + br $continue|0 + end + end end - get_local $1 - i32.const 296 - call $~lib/string/String.__eq + get_local $3 + i32.const 0 + i32.gt_s if get_local $0 + i32.load + get_local $0 + i32.load offset=4 i32.load offset=8 - i32.const 0 - i32.store offset=20 + get_local $1 + get_local $2 + i32.mul + call $json/decoder/ThrowingJSONHandler#setInteger + i32.const 1 return end - get_local $0 - get_local $1 - call $bson/decoder/ThrowingBSONHandler#setNull + i32.const 0 ) - (func $main_near/__near_BSONHandler_FooBar#setInteger (; 86 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - get_local $1 - i32.const 24 - call $~lib/string/String.__eq + (func $json/decoder/ThrowingJSONHandler#setNull (; 116 ;) (type $iiv) (param $0 i32) (param $1 i32) + i32.const 0 + i32.eqz if - get_local $0 - i32.load offset=8 - get_local $2 - i32.store - return + i32.const 2200 + get_local $1 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 51 + i32.const 7 + call $~lib/env/abort + unreachable end - get_local $1 - i32.const 232 - call $~lib/string/String.__eq + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseNull (; 117 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar + get_global $json/decoder/NULL_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq if get_local $0 + get_global $json/decoder/NULL_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 i32.load offset=8 - get_local $2 - i32.store offset=4 + call $json/decoder/ThrowingJSONHandler#setNull + i32.const 1 return end - get_local $0 - get_local $1 - get_local $2 - call $bson/decoder/ThrowingBSONHandler#setInteger + i32.const 0 ) - (func $bson/decoder/BSONDecoder<__near_BSONHandler_FooBar>#deserialize (; 87 ;) (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) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseValue (; 118 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) get_local $0 - get_local $2 - i32.store offset=4 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.9 (result i32) + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#skipWhitespace + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseObject + tee_local $1 + if (result i32) get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.const 5 - i32.ge_s - i32.eqz - if - i32.const 912 - i32.const 976 - i32.const 87 - i32.const 8 - call $~lib/env/abort - unreachable + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseArray end - get_local $1 - block (result i32) + tee_local $1 + if (result i32) + get_local $1 + else get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseString + end + tee_local $1 + if (result i32) + get_local $1 + else get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseBoolean end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) + tee_local $1 + if (result i32) + get_local $1 + else get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseNumber + end + tee_local $1 + if (result i32) + get_local $1 + else get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseNull end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or + set_local $1 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#skipWhitespace get_local $1 - block (result i32) + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#deserialize (; 119 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + get_local $2 + if get_local $0 + get_local $2 + i32.store offset=4 + else get_local $0 - i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add + block (result i32) + i32.const 12 + 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 + i32.const 0 + i32.store offset=8 + get_local $3 + end i32.store offset=4 - get_local $3 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) get_local $0 + i32.load offset=4 + i32.const 0 + i32.store get_local $0 i32.load offset=4 - tee_local $3 - i32.const 1 - i32.add - i32.store offset=4 - get_local $3 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $3 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.10 (result i32) get_local $1 - i32.load offset=8 + i32.store offset=4 + get_local $0 + i32.load offset=4 i32.const 0 - i32.shr_u + i32.store offset=8 end - i32.le_s + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#parseValue + i32.const 0 + i32.ne i32.eqz if - i32.const 1016 - i32.const 976 - i32.const 90 + i32.const 2088 + i32.const 1264 + i32.const 103 i32.const 8 call $~lib/env/abort unreachable end - get_local $1 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.11 (result i32) - get_local $1 - i32.load offset=8 + ) + (func $main_near/__near_decode_Array_Array_String (; 120 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + block (result i32) + i32.const 16 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 i32.const 0 - i32.shr_u + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + i32.const 0 + i32.store8 offset=8 + get_local $2 + i32.const 0 + i32.const 0 + call $~lib/array/Array>#constructor + i32.store offset=12 + get_local $2 end - i32.const 1 - i32.sub - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and + set_local $2 + get_local $2 + get_local $0 + i32.store + get_local $2 i32.const 0 - i32.eq - i32.eqz - if - i32.const 1080 - i32.const 976 - i32.const 91 - i32.const 8 - call $~lib/env/abort - unreachable - end - block $break|0 - loop $repeat|0 - i32.const 1 - i32.eqz - br_if $break|0 - block - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $4 - i32.const 1 - i32.add - i32.store offset=4 - get_local $4 - end - call $~lib/internal/typedarray/TypedArray#__get - set_local $4 - get_local $4 - i32.const 255 - i32.and - i32.const 0 - i32.eq - if - br $break|0 - end - get_local $0 - i32.load offset=4 - set_local $5 - block $break|1 - loop $repeat|1 - get_local $1 - get_local $5 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 0 - i32.ne - tee_local $6 - if (result i32) - get_local $5 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.13 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.lt_s - else - get_local $6 - end - i32.eqz - br_if $break|1 - nop - get_local $5 - i32.const 1 - i32.add - set_local $5 - br $repeat|1 - unreachable - end - unreachable - end - get_local $5 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.14 (result i32) - get_local $1 - i32.load offset=8 - i32.const 0 - i32.shr_u - end - i32.const 1 - i32.sub - i32.lt_s - i32.eqz - if - i32.const 1160 - i32.const 976 - i32.const 101 - i32.const 12 - call $~lib/env/abort - unreachable - end - get_local $1 - get_local $0 - i32.load offset=4 - get_local $5 - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/bin2str - set_local $6 - get_local $0 - get_local $5 - i32.const 1 - i32.add - tee_local $5 - i32.store offset=4 - block $break|2 - block $case7|2 - block $case6|2 - block $case5|2 - block $case4|2 - block $case3|2 - block $case2|2 - block $case1|2 - block $case0|2 - get_local $4 - i32.const 255 - i32.and - set_local $7 - get_local $7 - i32.const 2 - i32.eq - br_if $case0|2 - get_local $7 - i32.const 3 - i32.eq - br_if $case1|2 - get_local $7 - i32.const 4 - i32.eq - br_if $case2|2 - get_local $7 - i32.const 5 - i32.eq - br_if $case3|2 - get_local $7 - i32.const 8 - i32.eq - br_if $case4|2 - get_local $7 - i32.const 10 - i32.eq - br_if $case5|2 - get_local $7 - i32.const 16 - i32.eq - br_if $case6|2 - br $case7|2 - end - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - get_local $1 - get_local $0 - i32.load offset=4 - block (result i32) - get_local $0 - i32.load offset=4 - get_local $3 - i32.const 1 - i32.sub - i32.add - set_local $7 - get_local $0 - get_local $7 - i32.store offset=4 - get_local $7 - end - call $~lib/typedarray/Uint8Array#subarray - call $bson/decoder/bin2str - call $main_near/__near_BSONHandler_FooBar#setString - get_local $0 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - i32.store offset=4 - br $break|2 - end - get_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 2 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 3 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - call $main_near/__near_BSONHandler_FooBar#pushObject - if - get_local $0 - get_local $1 - get_local $0 - i32.load offset=4 - call $bson/decoder/BSONDecoder<__near_BSONHandler_FooBar>#deserialize - else - get_local $0 - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - i32.store offset=4 - end - get_local $0 - i32.load - call $bson/decoder/BSONHandler#popObject - br $break|2 - end - get_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 1 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 2 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - get_local $0 - i32.load offset=4 - i32.const 3 - i32.add - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $0 - i32.load - get_local $6 - call $main_near/__near_BSONHandler_FooBar#pushArray - if - get_local $0 - get_local $1 - get_local $0 - i32.load offset=4 - call $bson/decoder/BSONDecoder<__near_BSONHandler_FooBar>#deserialize - else - get_local $0 - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - i32.store offset=4 - end - get_local $0 - i32.load - call $bson/decoder/BSONHandler#popArray - br $break|2 - end - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - set_local $3 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 4 - i32.eq - if - return - end - get_local $0 - i32.load - get_local $6 - get_local $1 - get_local $0 - i32.load offset=4 - block (result i32) - get_local $0 - i32.load offset=4 - get_local $3 - i32.add - set_local $7 - get_local $0 - get_local $7 - i32.store offset=4 - get_local $7 - end - call $~lib/typedarray/Uint8Array#subarray - call $main_near/__near_BSONHandler_FooBar#setUint8Array - br $break|2 - end - get_local $0 - i32.load - get_local $6 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 1 - i32.eq - call $main_near/__near_BSONHandler_FooBar#setBoolean - br $break|2 - end + get_local $2 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#constructor + i32.store offset=4 + get_local $2 + i32.load offset=4 + get_local $0 + get_local $1 + call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#deserialize + get_local $2 + i32.load offset=12 + ) + (func $main_near/__near_JSONHandler_FooBar#pushArray (; 121 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $1 + i32.const 1120 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=4 + call $main_near/__near_decode_Array_Array_String + i32.store offset=16 + i32.const 0 + return + end + get_local $0 + get_local $1 + call $json/decoder/ThrowingJSONHandler#pushArray + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseArray (; 122 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + i32.const 1136 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.load offset=4 + i32.load offset=8 + set_local $1 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.load + get_local $1 + call $main_near/__near_JSONHandler_FooBar#pushArray + if + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + drop + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace + i32.const 1 + set_local $2 + block $break|0 + loop $continue|0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + i32.const 1144 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + block + get_local $2 + i32.eqz + if get_local $0 - i32.load - get_local $6 - call $main_near/__near_BSONHandler_FooBar#setNull - br $break|2 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + i32.const 184 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1408 + i32.const 1264 + i32.const 177 + i32.const 20 + call $~lib/env/abort + unreachable + end + else + i32.const 0 + set_local $2 end get_local $0 - i32.load - get_local $6 - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 8 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 16 - i32.shl - i32.or - get_local $1 - block (result i32) - get_local $0 - get_local $0 - i32.load offset=4 - tee_local $7 - i32.const 1 - i32.add - i32.store offset=4 - get_local $7 - end - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - i32.const 24 - i32.shl - i32.or - call $main_near/__near_BSONHandler_FooBar#setInteger - br $break|2 - end - i32.const 0 - i32.eqz - if - i32.const 1656 - i32.const 976 - i32.const 154 - i32.const 20 - call $~lib/env/abort - unreachable + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseValue + drop end + br $continue|0 + end + end + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + i32.const 1144 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + i32.eqz + if + i32.const 1872 + i32.const 1264 + i32.const 183 + i32.const 12 + call $~lib/env/abort + unreachable + end + end + get_local $0 + i32.load + call $json/decoder/JSONHandler#popArray + i32.const 1 + return + ) + (func $main_near/__near_JSONHandler_FooBar#setString (; 123 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $1 + i32.const 1104 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + get_local $2 + i32.store offset=12 + return + end + get_local $0 + get_local $1 + get_local $2 + call $json/decoder/ThrowingJSONHandler#setString + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseString (; 124 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + i32.const 248 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.ne + if + i32.const 0 + return + end + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readString + call $main_near/__near_JSONHandler_FooBar#setString + i32.const 1 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readAndAssert (; 125 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + block $break|0 + i32.const 0 + set_local $2 + loop $repeat|0 + get_local $2 + get_local $1 + i32.load + i32.lt_s + i32.eqz + br_if $break|0 + get_local $1 + get_local $2 + call $~lib/string/String#charCodeAt + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + i32.eq + i32.eqz + if + i32.const 1928 + get_local $1 + call $~lib/string/String.__concat + i32.const 1952 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 321 + i32.const 12 + call $~lib/env/abort + unreachable + end + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + unreachable + end + unreachable + end + ) + (func $main_near/__near_JSONHandler_FooBar#setBoolean (; 126 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $1 + i32.const 1088 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + get_local $2 + i32.const 0 + i32.ne + i32.store8 offset=8 + return + end + get_local $0 + get_local $1 + get_local $2 + call $json/decoder/ThrowingJSONHandler#setBoolean + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseBoolean (; 127 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + get_global $json/decoder/FALSE_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + get_global $json/decoder/FALSE_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + i32.const 0 + call $main_near/__near_JSONHandler_FooBar#setBoolean + i32.const 1 + return + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + get_global $json/decoder/TRUE_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + get_global $json/decoder/TRUE_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + i32.const 1 + call $main_near/__near_JSONHandler_FooBar#setBoolean + i32.const 1 + return + end + i32.const 0 + ) + (func $main_near/__near_JSONHandler_FooBar#setInteger (; 128 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $1 + i32.const 136 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + get_local $2 + i32.store + return + end + get_local $1 + i32.const 1072 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + get_local $2 + i32.store offset=4 + return + end + get_local $0 + get_local $1 + get_local $2 + call $json/decoder/ThrowingJSONHandler#setInteger + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNumber (; 129 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + i32.const 0 + set_local $1 + i32.const 1 + set_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + i32.const 2024 + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + i32.const -1 + set_local $2 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + drop + end + i32.const 0 + set_local $3 + block $break|0 + loop $continue|0 + get_global $json/decoder/CHAR_0 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + i32.le_s + tee_local $4 + if (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + get_global $json/decoder/CHAR_9 + i32.le_s + else + get_local $4 + end + if + block + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readChar + set_local $4 + get_local $1 + i32.const 10 + i32.mul + set_local $1 + get_local $1 + get_local $4 + get_global $json/decoder/CHAR_0 + i32.sub + i32.add + set_local $1 + get_local $3 + i32.const 1 + i32.add + set_local $3 end + br $continue|0 end - br $repeat|0 - unreachable end + end + get_local $3 + i32.const 0 + i32.gt_s + if + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + get_local $1 + get_local $2 + i32.mul + call $main_near/__near_JSONHandler_FooBar#setInteger + i32.const 1 + return + end + i32.const 0 + ) + (func $main_near/__near_JSONHandler_FooBar#setNull (; 130 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $1 + i32.const 136 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + i32.const 0 + i32.store + return + end + get_local $1 + i32.const 1072 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + i32.const 0 + i32.store offset=4 + return + end + get_local $1 + i32.const 1088 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + i32.const 0 + i32.store8 offset=8 + return + end + get_local $1 + i32.const 1104 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + i32.const 0 + i32.store offset=12 + return + end + get_local $1 + i32.const 1120 + call $~lib/string/String.__eq + if + get_local $0 + i32.load offset=12 + i32.const 0 + i32.store offset=16 + return + end + get_local $0 + get_local $1 + call $json/decoder/ThrowingJSONHandler#setNull + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNull (; 131 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar + get_global $json/decoder/NULL_STR + i32.const 0 + call $~lib/string/String#charCodeAt + i32.eq + if + get_local $0 + get_global $json/decoder/NULL_STR + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readAndAssert + get_local $0 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=8 + call $main_near/__near_JSONHandler_FooBar#setNull + i32.const 1 + return + end + i32.const 0 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseValue (; 132 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseObject + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseArray + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseString + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseBoolean + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNumber + end + tee_local $1 + if (result i32) + get_local $1 + else + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNull + end + set_local $1 + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace + get_local $1 + ) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#deserialize (; 133 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + get_local $2 + if + get_local $0 + get_local $2 + i32.store offset=4 + else + get_local $0 + block (result i32) + i32.const 12 + 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 + i32.const 0 + i32.store offset=8 + get_local $3 + end + i32.store offset=4 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store + get_local $0 + i32.load offset=4 + get_local $1 + i32.store offset=4 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.store offset=8 + end + get_local $0 + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseValue + i32.const 0 + i32.ne + i32.eqz + if + i32.const 2088 + i32.const 1264 + i32.const 103 + i32.const 8 + call $~lib/env/abort unreachable end ) - (func $main_near/__near_decode_FooBar (; 88 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $main_near/__near_decode_FooBar (; 134 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) block (result i32) - i32.const 12 + i32.const 16 call $~lib/memory/memory.allocate set_local $2 get_local $2 @@ -7354,8 +8476,11 @@ i32.const 0 i32.store offset=4 get_local $2 + i32.const 0 + i32.store8 offset=8 + get_local $2 block (result i32) - i32.const 24 + i32.const 20 call $~lib/memory/memory.allocate set_local $3 get_local $3 @@ -7368,17 +8493,14 @@ i32.const 0 i32.store8 offset=8 get_local $3 - i32.const 8 + i32.const 120 i32.store offset=12 get_local $3 i32.const 0 i32.store offset=16 get_local $3 - i32.const 0 - i32.store offset=20 - get_local $3 end - i32.store offset=8 + i32.store offset=12 get_local $2 end set_local $2 @@ -7388,17 +8510,17 @@ get_local $2 i32.const 0 get_local $2 - call $bson/decoder/BSONDecoder<__near_BSONHandler_FooBar>#constructor + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#constructor i32.store offset=4 get_local $2 i32.load offset=4 get_local $0 get_local $1 - call $bson/decoder/BSONDecoder<__near_BSONHandler_FooBar>#deserialize + call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#deserialize get_local $2 - i32.load offset=8 + i32.load offset=12 ) - (func $~lib/string/String#charAt (; 89 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#charAt (; 135 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) get_local $0 i32.const 0 @@ -7406,7 +8528,7 @@ i32.eqz if i32.const 0 - i32.const 200 + i32.const 64 i32.const 58 i32.const 4 call $~lib/env/abort @@ -7417,7 +8539,7 @@ i32.load i32.ge_u if - i32.const 312 + i32.const 176 return end i32.const 1 @@ -7433,7 +8555,7 @@ i32.store16 offset=4 get_local $2 ) - (func $test/bin2hex (; 90 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $test/bin2hex (; 136 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -7442,18 +8564,18 @@ i32.const 0 i32.ne if (result i32) - i32.const 1808 + i32.const 2312 else - i32.const 1848 + i32.const 2352 end set_local $2 - i32.const 312 + i32.const 176 set_local $3 block $break|0 block i32.const 0 set_local $4 - block $~lib/internal/typedarray/TypedArray#get:length|inlined.28 (result i32) + block $~lib/internal/typedarray/TypedArray#get:length|inlined.13 (result i32) get_local $0 i32.load offset=8 i32.const 0 @@ -7500,7 +8622,7 @@ end get_local $3 ) - (func $test/runTest (; 91 ;) (type $v) + (func $test/runTest (; 137 ;) (type $v) (local $0 i32) (local $1 i32) (local $2 i32) @@ -7509,7 +8631,7 @@ (local $5 i32) (local $6 i32) block (result i32) - i32.const 24 + i32.const 20 call $~lib/memory/memory.allocate set_local $0 get_local $0 @@ -7522,15 +8644,12 @@ i32.const 0 i32.store8 offset=8 get_local $0 - i32.const 8 + i32.const 120 i32.store offset=12 get_local $0 i32.const 0 i32.store offset=16 get_local $0 - i32.const 0 - i32.store offset=20 - get_local $0 end set_local $0 get_local $0 @@ -7543,24 +8662,20 @@ i32.const 1 i32.store8 offset=8 get_local $0 - i32.const 24 + i32.const 136 i32.store offset=12 block (result i32) i32.const 12 call $~lib/memory/memory.allocate set_local $1 get_local $1 - i32.const 0 - i32.const 0 - call $~lib/array/Array#constructor - i32.store + i32.const 1 + i32.store8 get_local $1 - i32.const 0 - get_global $bson/encoder/START_SIZE - call $~lib/internal/typedarray/TypedArray#constructor + i32.const 168 i32.store offset=4 get_local $1 - i32.const 4 + i32.const 176 i32.store offset=8 get_local $1 end @@ -7569,7 +8684,7 @@ get_local $1 call $main_near/__near_encode_FooBar get_local $1 - call $bson/encoder/BSONEncoder#serialize + call $json/encoder/JSONEncoder#serialize set_local $2 get_local $2 i32.const 0 @@ -7583,7 +8698,7 @@ i32.eqz if i32.const 0 - i32.const 1768 + i32.const 2248 i32.const 20 i32.const 2 call $~lib/env/abort @@ -7597,7 +8712,7 @@ i32.eqz if i32.const 0 - i32.const 1768 + i32.const 2248 i32.const 21 i32.const 2 call $~lib/env/abort @@ -7608,31 +8723,27 @@ call $~lib/memory/memory.allocate set_local $4 get_local $4 - i32.const 0 - i32.const 0 - call $~lib/array/Array#constructor - i32.store + i32.const 1 + i32.store8 get_local $4 - i32.const 0 - get_global $bson/encoder/START_SIZE - call $~lib/internal/typedarray/TypedArray#constructor + i32.const 2288 i32.store offset=4 get_local $4 - i32.const 4 + i32.const 176 i32.store offset=8 get_local $4 end set_local $4 get_local $4 - i32.const 1792 + i32.const 2296 i32.const 1 - call $bson/encoder/BSONEncoder#setInteger + call $json/encoder/JSONEncoder#setInteger get_local $4 - i32.const 1800 + i32.const 2304 i32.const 2 - call $bson/encoder/BSONEncoder#setInteger + call $json/encoder/JSONEncoder#setInteger get_local $4 - call $bson/encoder/BSONEncoder#serialize + call $json/encoder/JSONEncoder#serialize i32.const 0 call $test/bin2hex set_local $5 @@ -7641,27 +8752,23 @@ call $~lib/memory/memory.allocate set_local $6 get_local $6 - i32.const 0 - i32.const 0 - call $~lib/array/Array#constructor - i32.store + i32.const 1 + i32.store8 get_local $6 - i32.const 0 - get_global $bson/encoder/START_SIZE - call $~lib/internal/typedarray/TypedArray#constructor + i32.const 2408 i32.store offset=4 get_local $6 - i32.const 4 + i32.const 176 i32.store offset=8 get_local $6 end set_local $6 get_local $6 - i32.const 1888 + i32.const 2416 i32.const 3 - call $bson/encoder/BSONEncoder#setInteger + call $json/encoder/JSONEncoder#setInteger ) - (func $start (; 92 ;) (type $v) + (func $start (; 138 ;) (type $v) get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -7672,8 +8779,24 @@ set_global $~lib/allocator/arena/startOffset get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset + i32.const 56 + i32.const 0 + call $~lib/string/String#charCodeAt + set_global $json/decoder/CHAR_0 + i32.const 96 + i32.const 0 + call $~lib/string/String#charCodeAt + set_global $json/decoder/CHAR_9 + i32.const 104 + i32.const 0 + call $~lib/string/String#charCodeAt + set_global $json/decoder/CHAR_A + i32.const 112 + i32.const 0 + call $~lib/string/String#charCodeAt + set_global $json/decoder/CHAR_A_LOWER call $test/runTest ) - (func $null (; 93 ;) (type $v) + (func $null (; 139 ;) (type $v) ) ) From ef00bae68f2e7eae64684a927ce5c64fe7b7610a Mon Sep 17 00:00:00 2001 From: Vladimir Grichina Date: Tue, 8 Jan 2019 16:37:57 -0800 Subject: [PATCH 4/6] Fix bindings for array of primitives --- dist/assemblyscript.js | 2 +- dist/assemblyscript.js.map | 2 +- src/definitions.ts | 5 + tests/near-bindgen/main_near.ts.expected | 5 + tests/near-bindgen/test.wat.expected | 151 ++++++++++++++--------- 5 files changed, 102 insertions(+), 63 deletions(-) diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index 60e6c0fd8f..84979dd9c0 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,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=Z;var J=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 n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=xe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=xe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.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}(j);t.DeclarationStatement=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return n(t,e),t}(J);t.IndexSignatureDeclaration=$;var ee=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(J);t.VariableLikeDeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(j);t.BlockStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(j);t.BreakStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.ClassDeclaration=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(j);t.ContinueStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(j);t.DoStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(j);t.EmptyStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(J);t.EnumDeclaration=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(J);t.EnumValueDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(j);t.ExportStatement=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(j);t.ExpressionStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}(ee);t.FieldDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(j);t.ForStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(j);t.IfStatement=ge;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(J);t.ImportDeclaration=ye;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(j);t.ImportStatement=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(ne);t.InterfaceDeclaration=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(me);t.MethodDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(J);t.NamespaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(j);t.ReturnStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(j);t.SwitchStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(j);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(j);t.TryStatement=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(J);t.TypeDeclaration=Se;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}(ee);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(j);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(j);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(j);function xe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?xe(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?xe(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Fe(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}}}},a=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 s,o=r(0),c=r(1),l=r(6),p=r(3),u=r(5),h=r(11),d=function(){return function(){}}(),_=function(){return function(){}}(),m=function(){return function(){}}();function g(e,t){switch(assert(t.length),e){case p.DecoratorKind.OPERATOR:case p.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 p.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 p.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 y,f,E=new Map,T=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=E,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=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 h.Resolver(r),r.sources=[],r}return n(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(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=s);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var o=0;switch(u.getExpressionType(e)){case 1:o=u.getConstValueI32(e);break;case 2:o=u.getConstValueI64Low(e);break;case 3:o=i32(u.getConstValueF32(e));break;case 4:o=i32(u.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 u.ExpressionId.Load:var c=void 0;switch(u.getLoadBytes(e)){case 1:c=u.isLoadSigned(e)?l.Type.i8:l.Type.u8;break;case 2:c=u.isLoadSigned(e)?l.Type.i16:l.Type.u16;break;default:c=u.isLoadSigned(e)?l.Type.i32:l.Type.u32}return z(c,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var p=assert(u.getBlockChildCount(e)),h=u.getBlockChild(e,p-1);return this.canOverflow(h,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(u.getCallTarget(e))));assert(_.kind==y.FUNCTION);var m=_.signature.returnType;return!_.flow.is(2)||z(m,t);case u.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 z(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=K},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";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||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(1),o=r(3),c=r(2);function l(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function p(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:case i.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"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=l,t.tokenIsAlsoIdentifier=p,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=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=u;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(c.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(c.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 _=null},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(23),c=r(1),l=r(5),p=r(0),u=r(4),h=r(8),d=r(3),_=r(6),m=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var g=function(){function e(){this.target=s.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==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?_.Type.usize64:_.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?_.Type.isize64:_.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?2:1},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"}(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 y,f,E=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=_.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=l.Module.create(),n}return n(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,s=this.program;s.initialize(r);var c=new u.Function(s.startFunction,"start",new _.Signature([],_.Type.void));this.startFunctionInstance=c;var p=new Array;this.startFunctionBody=p,this.currentFunction=c,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var h=s.sources,d=0,m=h.length;d"),!1;e.type=this.currentType,e.set(p.CommonFlags.RESOLVED)}else assert(!1);if(e.is(p.CommonFlags.AMBIENT)&&e.hasDecorator(u.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?T(e,r):(y="env",f=e.simpleName),t.addGlobalImport(e.internalName,y,f,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(c.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)),l.getExpressionId(n)!=l.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),l.getExpressionId(n)!=l.ExpressionId.Const&&(this.warning(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(u.DecoratorFlags.INLINE)&&!o){switch(assert(l.getExpressionId(n)==l.ExpressionId.Const),l.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI64Low(n),l.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var h=e.internalName;return o?(t.addGlobal(h,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(h,n))):t.addGlobal(h,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==u.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null,s=!1;if(e.members)try{for(var o=i(e.members.values()),h=o.next();!h.done;h=o.next()){var d=h.value;if(d.kind==u.ElementKind.ENUMVALUE){var m=!1,g=d,y=g.declaration;g.set(p.CommonFlags.COMPILED);var f=void 0;y.value?(f=this.compileExpression(y.value,_.Type.i32,1,0),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)?(f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),m=!0)):m=!0)):null==a?f=n.createI32(0):(s&&this.error(c.DiagnosticCode.Enum_member_must_have_initializer,y.range),f=n.createBinary(l.BinaryOp.AddI32,n.createGetGlobal(a.internalName,1),n.createI32(1)),f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),m=!0)),m?(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(p.CommonFlags.CONST),f),s=!1),a=g}}}catch(e){t={error:e}}finally{try{h&&!h.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==u.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(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var g=t.createBlock("case0|"+a,p,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),o.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(c.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==d.NodeKind.SOURCE){for(var s=0;s");continue}f=this.currentType}var T=!1;if(g.is(p.CommonFlags.CONST))if(E)if(E=this.module.precomputeExpression(E),l.getExpressionId(E)==l.ExpressionId.Const){var I=new u.Local(r,y,-1,f);switch(l.getExpressionType(E)){case 1:I=I.withConstantIntegerValue(i64_new(l.getConstValueI32(E),0));break;case 2:I=I.withConstantIntegerValue(i64_new(l.getConstValueI64Low(E),l.getConstValueI64High(E)));break;case 3:I=I.withConstantFloatValue(l.getConstValueF32(E));break;case 4:I=I.withConstantFloatValue(l.getConstValueF64(E));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(c.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(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,g.range);else this.error(c.DiagnosticCode._const_declarations_must_be_initialized,g.range);if(!T){I=void 0;I=g.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||h.is(2048)?h.addScopedLocal(f,y,!1,g):n.addLocal(f,y,g),E?(o.push(this.compileAssignmentWithValue(g.name,E)),I.type.is(36)&&h.setLocalWrapped(I.index,!h.canOverflow(E,f))):I.type.is(36)&&h.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,_.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(l.getExpressionId(n)==l.ExpressionId.Const&&1==l.getExpressionType(n)){if(!l.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.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 u="continue|"+a;o.continueLabel=u;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(u,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(u)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.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(_.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(u.DecoratorFlags.BUILTIN)||t!=_.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=_.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(c.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==_.Type.void?_.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(c.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(c.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(l.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(l.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToI64,e):s.createUnary(l.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToU64,e):s.createUnary(l.UnaryOp.TruncF32ToU32,e):r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToI64,e):s.createUnary(l.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToU64,e):s.createUnary(l.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)?l.UnaryOp.ConvertI64ToF32:l.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF32:l.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?l.UnaryOp.ConvertI64ToF64:l.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF64:l.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(l.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?l.UnaryOp.ExtendI32:l.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GtI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtI64:l.BinaryOp.GtI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GtU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtU64:l.BinaryOp.GtU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GtU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GtF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GtF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.LE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.LeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeI64:l.BinaryOp.LeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.LeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeU64:l.BinaryOp.LeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.LeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.LeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.LeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.GE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeI64:l.BinaryOp.GeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeU64:l.BinaryOp.GeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS_EQUALS_EQUALS:case h.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.EQ)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.EqI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.EqI64:l.BinaryOp.EqI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.EqI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.EqF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.EqF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EXCLAMATION_EQUALS_EQUALS:case h.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.NE)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.NeI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.NeI64:l.BinaryOp.NeI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.NeI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.NeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.NeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS:return this.compileAssignment(d,m,t);case h.Token.PLUS_EQUALS:g=!0;case h.Token.PLUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.ADD)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.AddI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AddI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.AddF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.AddF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.MINUS_EQUALS:g=!0;case h.Token.MINUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.SUB)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.SubI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.SubI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.SubF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.SubF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.MUL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.MulI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.MulI64:l.BinaryOp.MulI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.MulI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.MulF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.MulF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.POW)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,_.Type.f64,1,0,d),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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case h.Token.SLASH_EQUALS:g=!0;case h.Token.SLASH:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.DIV)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.DivI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivI64:l.BinaryOp.DivI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.DivU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivU64:l.BinaryOp.DivU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.DivU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.DivF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.DivF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.PERCENT_EQUALS:g=!0;case h.Token.PERCENT:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.REM)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.RemI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemI64:l.BinaryOp.RemI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.RemU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemU64:l.BinaryOp.RemU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,T;if(!(E=this.program.elementsLookup.get("Math"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.LESSTHAN_LESSTHAN_EQUALS:g=!0;case h.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShlI64:l.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.ShrI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.ShrI64,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrI64:l.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_EQUALS:g=!0;case h.Token.AMPERSAND:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.AndI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AndI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AndI64:l.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.BAR_EQUALS:g=!0;case h.Token.BAR:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.OrI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.OrI64:l.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.CARET_EQUALS:g=!0;case h.Token.CARET:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.XorI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,o=p.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=p.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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),i,p.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case h.Token.BAR_BAR:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),p.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return g?this.compileAssignmentWithValue(d,o,t!=_.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(u.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==u.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(u.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=_.Type.void);case u.ElementKind.LOCAL:case u.ElementKind.FIELD:n=s.type;break;case u.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var l=this.resolver.resolveFunction(o,null);if(!l)return this.module.createUnreachable();assert(1==l.signature.parameterTypes.length),n=l.signature.parameterTypes[0];break}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case u.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(4096),h=s.lookupOverload(u.OperatorKind.INDEXED_SET,p);if(!h)return s.lookupOverload(u.OperatorKind.INDEXED_GET,p)?this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=_.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=_.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 u.ElementKind.LOCAL:var a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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(),l=i.internalName;return n.createBlock(null,[n.createSetGlobal(l,t),n.createGetGlobal(l,o)],o)}return n.createSetGlobal(i.internalName,t);case u.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(c.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),m=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:_.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(b=this.currentFunction).flow;var g=b.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(a.byteSize,m,n.createGetLocal(g,o),o,i.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(a.byteSize,m,t,o,i.memoryOffset);case u.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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(f,[m,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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),g=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(f,[n.createTeeLocal(g,m),t]),this.makeCallDirect(T,[n.createGetLocal(g,I)])],I)}return n.createBlock(null,[this.makeCallDirect(f,[t]),this.makeCallDirect(T)],I)}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case u.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(u.OperatorKind.INDEXED_GET,A);if(!C)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(u.OperatorKind.INDEXED_SET,A);if(!N)return this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:_.Type.void,n.createUnreachable();var O=i.type,S=(d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,_.Type.i32,1,0));if(r){var b,L=(b=this.currentFunction).getTempLocal(O,!1),k=b.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(L),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(L.index,m),n.createTeeLocal(k.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(L.index,L.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,S,t])}}return this.error(c.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 u.ElementKind.FUNCTION_PROTOTYPE:var o=s,l=e.typeArguments;if(o.hasDecorator(u.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var h=null;if(l){if(!o.is(p.CommonFlags.GENERIC))return this.error(c.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();h=this.resolver.resolveFunctionInclTypeArguments(o,l,m.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(p.CommonFlags.GENERIC)){for(var g=new Map,y=assert(o.declaration.typeParameters),f=y.length,E=0;Es&&!i)||(this.error(c.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(p.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(c.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var l=n?a+1:a,u=new Array(l),h=0;n&&(u[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(c.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,h=e.is(p.CommonFlags.INSTANCE),d=r.requiredParameters,m=d,g=i.length,y=g;h&&(++m,++y);var f=assert(y-m),E=new Array(m),T=0,I=this.module;h&&(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(p.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(f))return this.module.createUnreachable();var I=f.type;return assert(I!=_.Type.void),f.is(p.CommonFlags.INLINED)?this.compileInlineConstant(f,t,r):(this.currentType=I,this.module.createGetGlobal(f.internalName,I.toNativeType()));case u.ElementKind.ENUMVALUE:return f.is(p.CommonFlags.COMPILED)?(this.currentType=_.Type.i32,f.is(p.CommonFlags.INLINED)?this.module.createI32(f.constantValue):this.module.createGetGlobal(f.internalName,1)):(this.error(c.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=_.Type.i32,this.module.createUnreachable());case u.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(f,null,m.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(c.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=_.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?l.BinaryOp.NeI64:l.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(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==_.Type.f32?n.createF32(a):(this.currentType=_.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=_.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=_.Type.u32,n.createI32(i64_low(s))):(this.currentType=_.Type.i64,n.createI64(i64_low(s),i64_high(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(c.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 c=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*c,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(o.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(c,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(c.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PRIVATE))return this.error(c.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PROTECTED))return this.error(c.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,l=e.values,h=n.members,d=!1,_=new Array(s+2),m=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==l.length);for(var g=0,y=s;g=0);var l=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),l,i.type.toNativeType(),i.memoryOffset);case u.ElementKind.PROPERTY:return this.compileGetter(i,e);case u.ElementKind.FUNCTION_PROTOTYPE:return this.error(c.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(c.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(p.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&u.DecoratorFlags.INLINE);if(n.is(p.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==u.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),l=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,l,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(c.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,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(l.getExpressionId(o)==l.ExpressionId.Const&&1==l.getExpressionType(o))return l.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;u.free();var m=a.fork();i.flow=m;var g=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var f=_.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(c.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==_.Type.void?_.Type.i32:t,0,0);if(l.getExpressionId(i)==l.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=_.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case h.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case h.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var d,m;if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.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=_.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 h.Token.PLUS:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case h.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==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(l.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(l.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=_.Type.bool;break;case h.Token.TILDE:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t.is(8)?_.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.TYPEOF:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=_.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(l.UnaryOp.ExtendI8ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(l.UnaryOp.ExtendI16ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(l.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(l.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(l.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?l.UnaryOp.EqzI64:l.UnaryOp.EqzI32,e);case 11:return r.createBinary(l.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(l.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(l.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(l.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(l.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(l.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,s=this.currentFunction,c=this.options.nativeSizeType,l=s.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(l.index,o.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==u.ElementKind.FIELD){var g=m,y=g.type,f=y.toNativeType(),E=g.prototype.declaration;if(assert(!g.isAny(p.CommonFlags.CONST)),E.initializer)h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),this.compileExpression(E.initializer,y,1,0),f,g.memoryOffset));else{var T=g.prototype.declaration.parameterIndex;h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),T>=0?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n handledRoot: boolean = false;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(json);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n "),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }");var s=t.filter(function(e){return!(e.type.toString()in r.typeMapping)});this.sb.push("\n pushObject(name: string): bool {"),this.sb.push("if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }"),this.generatePushHandler(e,s.filter(function(e){return!r.isArrayType(e.type)})),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,s.filter(function(e){return r.isArrayType(e.type)})),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+".push(value);\n }\n setNull(name: string): void {\n "+e+".push(<"+t+">null);\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"null","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n handledRoot: boolean = false;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n handledRoot: boolean = false;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(json);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n "),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }");var s=t.filter(function(e){return!(e.type.toString()in r.typeMapping)});this.sb.push("\n pushObject(name: string): bool {"),this.sb.push("if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }"),this.generatePushHandler(e,s.filter(function(e){return!r.isArrayType(e.type)})),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,s.filter(function(e){return r.isArrayType(e.type)})),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+".push(value);\n }\n setNull(name: string): void {\n "+e+".push(<"+t+">null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"null","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n handledRoot: boolean = false;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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--;\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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n handledRoot: boolean = false;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(json);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n `);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping));\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.sb.push(`if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}.push(value);\n }\n setNull(name: string): void {\n ${valuePrefix}.push(<${fieldType}>null);\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"null\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n handledRoot: boolean = false;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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 +{"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/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/tokenizer.ts","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","CALL","ELEMENTACCESS","PROPERTYACCESS","PARENTHESIZED","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","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","SUPER","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","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","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","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","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","_BinaryenModuleCreate","cachedByValue","memory","allocate","createFrom","cArr","allocU8Array","_BinaryenModuleRead","changetype","addFunctionType","result","paramTypes","cStr","allocString","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","_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","_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","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","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Return","Break","numChildren","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","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","eval","e","window","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","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","numPages","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","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","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","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","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","parentBase","thisLocal","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","scopedThis","_this_cannot_be_referenced_in_current_location","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","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","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","compileAllocate","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","classInstance","compileInstantiate","currentClassInstance","makeAllocate","propertyAccess","resolvePropertyAccess","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","fieldType","nativeFieldType","fieldDeclaration","ReportMode","currentTypeIsPlaceholder","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","contextualFunction","targetExpression","propertyName","elementAccess","explicitLocal","functionTarget","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClass","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","NEARBindingsBuilder","typeMapping","nonNullableTypes","generatedEncodeFunctions","generatedDecodeFunctions","build","generateArgsParser","generateWrapperFunction","fields","paramName","forEach","generateDecodeFunction","generateHandlerMethods","generateEncodeFunction","generateFieldEncoder","valuePrefix","setterType","this_1","matchingFields","filter","nonBasicFields","generatePushHandler","isArrayType","encodeType","generateArrayHandlerMethods","getFields","sourceExpr","generateHandler","fieldExpr","indexOf","pushType","__spread","visitInterface","mainSource","IDLBuilder","indentLevel","indent","typeToString","members_1","members_1_1","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","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","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","PREFIX","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","POSITIVE_INFINITY","Infinity","NEGATIVE_INFINITY","NaN","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","copy","dest","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","gte","lte","minSafeF64","maxSafeF64","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","tempLocal0","tempLocal1","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","allocateInstance","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","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","buildNEAR"],"mappings":"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M,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,OAEtCE,GACJ,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,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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n handledRoot: boolean = false;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(json);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n `);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping));\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.sb.push(`if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}.push(value);\n }\n setNull(name: string): void {\n ${valuePrefix}.push(<${fieldType}>null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"null\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n handledRoot: boolean = false;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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/src/definitions.ts b/src/definitions.ts index 66961dff45..b9a3b99026 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -287,6 +287,11 @@ export class NEARBindingsBuilder extends ExportsWalker { } setNull(name: string): void { ${valuePrefix}.push(<${fieldType}>null); + } + pushArray(name: string): bool { + assert(name == null && !this.handledRoot); + this.handledRoot = true; + return true; }`); } else { this.sb.push(`pushObject(name: string): bool { diff --git a/tests/near-bindgen/main_near.ts.expected b/tests/near-bindgen/main_near.ts.expected index 4848886c16..1660697263 100644 --- a/tests/near-bindgen/main_near.ts.expected +++ b/tests/near-bindgen/main_near.ts.expected @@ -308,6 +308,11 @@ export class __near_JSONHandler_Array_String extends ThrowingJSONHandler { setNull(name: string): void { this.value.push(null); } + pushArray(name: string): bool { + assert(name == null && !this.handledRoot); + this.handledRoot = true; + return true; + } } export function __near_decode_Array_String( diff --git a/tests/near-bindgen/test.wat.expected b/tests/near-bindgen/test.wat.expected index 6dfb77818b..743442ad1d 100644 --- a/tests/near-bindgen/test.wat.expected +++ b/tests/near-bindgen/test.wat.expected @@ -71,18 +71,18 @@ (data (i32.const 1664) "\1e\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00e\00s\00c\00a\00p\00e\00d\00 \00c\00h\00a\00r\00a\00c\00t\00e\00r\00:\00 \00") (data (i32.const 1728) "\0c\00\00\00E\00x\00p\00e\00c\00t\00e\00d\00 \00\'\00:\00\'\00") (data (i32.const 1760) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00e\00n\00d\00 \00o\00f\00 \00o\00b\00j\00e\00c\00t\00") - (data (i32.const 1816) "\17\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00a\00r\00r\00a\00y\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 1872) "\17\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00e\00n\00d\00 \00o\00f\00 \00a\00r\00r\00a\00y\00") - (data (i32.const 1928) "\n\00\00\00E\00x\00p\00e\00c\00t\00e\00d\00 \00\'\00") - (data (i32.const 1952) "\01\00\00\00\'\00") - (data (i32.const 1960) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00b\00o\00o\00l\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 2008) "\03\00\00\00 \00:\00 \00") - (data (i32.const 2024) "\01\00\00\00-\00") - (data (i32.const 2032) "\19\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00i\00n\00t\00e\00g\00e\00r\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 2088) "\11\00\00\00C\00a\00n\00n\00o\00t\00 \00p\00a\00r\00s\00e\00 \00J\00S\00O\00N\00") - (data (i32.const 2128) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00s\00t\00r\00i\00n\00g\00 \00f\00i\00e\00l\00d\00 \00") - (data (i32.const 2184) "\04\00\00\00 \00:\00 \00\"\00") - (data (i32.const 2200) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00n\00u\00l\00l\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 1816) "\17\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00e\00n\00d\00 \00o\00f\00 \00a\00r\00r\00a\00y\00") + (data (i32.const 1872) "\n\00\00\00E\00x\00p\00e\00c\00t\00e\00d\00 \00\'\00") + (data (i32.const 1896) "\01\00\00\00\'\00") + (data (i32.const 1904) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00b\00o\00o\00l\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 1952) "\03\00\00\00 \00:\00 \00") + (data (i32.const 1968) "\01\00\00\00-\00") + (data (i32.const 1976) "\19\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00i\00n\00t\00e\00g\00e\00r\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 2032) "\11\00\00\00C\00a\00n\00n\00o\00t\00 \00p\00a\00r\00s\00e\00 \00J\00S\00O\00N\00") + (data (i32.const 2072) "\18\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00s\00t\00r\00i\00n\00g\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 2128) "\04\00\00\00 \00:\00 \00\"\00") + (data (i32.const 2144) "\16\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00n\00u\00l\00l\00 \00f\00i\00e\00l\00d\00 \00") + (data (i32.const 2192) "\17\00\00\00U\00n\00e\00x\00p\00e\00c\00t\00e\00d\00 \00a\00r\00r\00a\00y\00 \00f\00i\00e\00l\00d\00 \00") (data (i32.const 2248) "\07\00\00\00t\00e\00s\00t\00.\00t\00s\00") (data (i32.const 2272) "\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 2288) "\e0\08\00\00\01\00\00\00") @@ -6353,19 +6353,33 @@ call $json/decoder/JSONHandler#popObject i32.const 1 ) - (func $json/decoder/ThrowingJSONHandler#pushArray (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $main_near/__near_JSONHandler_Array_String#pushArray (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $1 i32.const 0 + call $~lib/string/String.__eq + tee_local $2 + if (result i32) + get_local $0 + i32.load8_u offset=8 + i32.const 0 + i32.ne + i32.eqz + else + get_local $2 + end i32.eqz if - i32.const 1816 - get_local $1 - call $~lib/string/String.__concat - i32.const 1264 - i32.const 60 - i32.const 8 + i32.const 0 + i32.const 1312 + i32.const 312 + i32.const 4 call $~lib/env/abort unreachable end + get_local $0 + i32.const 1 + i32.store8 offset=8 i32.const 1 ) (func $json/decoder/JSONHandler#popArray (; 88 ;) (type $iv) (param $0 i32) @@ -6395,7 +6409,7 @@ get_local $0 i32.load get_local $1 - call $json/decoder/ThrowingJSONHandler#pushArray + call $main_near/__near_JSONHandler_Array_String#pushArray if get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#readChar @@ -6452,7 +6466,7 @@ i32.eq i32.eqz if - i32.const 1872 + i32.const 1816 i32.const 1264 i32.const 183 i32.const 12 @@ -6514,10 +6528,10 @@ i32.eq i32.eqz if - i32.const 1928 + i32.const 1872 get_local $1 call $~lib/string/String.__concat - i32.const 1952 + i32.const 1896 call $~lib/string/String.__concat i32.const 1264 i32.const 321 @@ -6539,10 +6553,10 @@ i32.const 0 i32.eqz if - i32.const 1960 + i32.const 1904 get_local $1 call $~lib/string/String.__concat - i32.const 2008 + i32.const 1952 call $~lib/string/String.__concat get_local $2 i32.const 0 @@ -6620,10 +6634,10 @@ i32.const 0 i32.eqz if - i32.const 2032 + i32.const 1976 get_local $1 call $~lib/string/String.__concat - i32.const 2008 + i32.const 1952 call $~lib/string/String.__concat block $~lib/array/Array#toString|inlined.1 (result i32) get_local $3 @@ -6649,7 +6663,7 @@ set_local $2 get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_Array_String>#peekChar - i32.const 2024 + i32.const 1968 i32.const 0 call $~lib/string/String#charCodeAt i32.eq @@ -6838,7 +6852,7 @@ i32.ne i32.eqz if - i32.const 2088 + i32.const 2032 i32.const 1264 i32.const 103 i32.const 8 @@ -7532,7 +7546,7 @@ i32.eq i32.eqz if - i32.const 1872 + i32.const 1816 i32.const 1264 i32.const 183 i32.const 12 @@ -7550,10 +7564,10 @@ i32.const 0 i32.eqz if - i32.const 2128 + i32.const 2072 get_local $1 call $~lib/string/String.__concat - i32.const 2184 + i32.const 2128 call $~lib/string/String.__concat get_local $2 call $~lib/string/String.__concat @@ -7607,10 +7621,10 @@ i32.eq i32.eqz if - i32.const 1928 + i32.const 1872 get_local $1 call $~lib/string/String.__concat - i32.const 1952 + i32.const 1896 call $~lib/string/String.__concat i32.const 1264 i32.const 321 @@ -7682,7 +7696,7 @@ set_local $2 get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_Array_Array_String>#peekChar - i32.const 2024 + i32.const 1968 i32.const 0 call $~lib/string/String#charCodeAt i32.eq @@ -7756,7 +7770,7 @@ i32.const 0 i32.eqz if - i32.const 2200 + i32.const 2144 get_local $1 call $~lib/string/String.__concat i32.const 1264 @@ -7878,7 +7892,7 @@ i32.ne i32.eqz if - i32.const 2088 + i32.const 2032 i32.const 1264 i32.const 103 i32.const 8 @@ -7925,7 +7939,22 @@ get_local $2 i32.load offset=12 ) - (func $main_near/__near_JSONHandler_FooBar#pushArray (; 121 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $json/decoder/ThrowingJSONHandler#pushArray (; 121 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + i32.const 0 + i32.eqz + if + i32.const 2192 + get_local $1 + call $~lib/string/String.__concat + i32.const 1264 + i32.const 60 + i32.const 8 + call $~lib/env/abort + unreachable + end + i32.const 1 + ) + (func $main_near/__near_JSONHandler_FooBar#pushArray (; 122 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $1 i32.const 1120 call $~lib/string/String.__eq @@ -7946,7 +7975,7 @@ get_local $1 call $json/decoder/ThrowingJSONHandler#pushArray ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseArray (; 122 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseArray (; 123 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -8027,7 +8056,7 @@ i32.eq i32.eqz if - i32.const 1872 + i32.const 1816 i32.const 1264 i32.const 183 i32.const 12 @@ -8041,7 +8070,7 @@ i32.const 1 return ) - (func $main_near/__near_JSONHandler_FooBar#setString (; 123 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $main_near/__near_JSONHandler_FooBar#setString (; 124 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 i32.const 1104 call $~lib/string/String.__eq @@ -8057,7 +8086,7 @@ get_local $2 call $json/decoder/ThrowingJSONHandler#setString ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseString (; 124 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseString (; 125 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar i32.const 248 @@ -8078,7 +8107,7 @@ call $main_near/__near_JSONHandler_FooBar#setString i32.const 1 ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readAndAssert (; 125 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#readAndAssert (; 126 ;) (type $iiv) (param $0 i32) (param $1 i32) (local $2 i32) block $break|0 i32.const 0 @@ -8098,10 +8127,10 @@ i32.eq i32.eqz if - i32.const 1928 + i32.const 1872 get_local $1 call $~lib/string/String.__concat - i32.const 1952 + i32.const 1896 call $~lib/string/String.__concat i32.const 1264 i32.const 321 @@ -8119,7 +8148,7 @@ unreachable end ) - (func $main_near/__near_JSONHandler_FooBar#setBoolean (; 126 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $main_near/__near_JSONHandler_FooBar#setBoolean (; 127 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 i32.const 1088 call $~lib/string/String.__eq @@ -8137,7 +8166,7 @@ get_local $2 call $json/decoder/ThrowingJSONHandler#setBoolean ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseBoolean (; 127 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseBoolean (; 128 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar get_global $json/decoder/FALSE_STR @@ -8180,7 +8209,7 @@ end i32.const 0 ) - (func $main_near/__near_JSONHandler_FooBar#setInteger (; 128 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $main_near/__near_JSONHandler_FooBar#setInteger (; 129 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 i32.const 136 call $~lib/string/String.__eq @@ -8206,7 +8235,7 @@ get_local $2 call $json/decoder/ThrowingJSONHandler#setInteger ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNumber (; 129 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNumber (; 130 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -8217,7 +8246,7 @@ set_local $2 get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar - i32.const 2024 + i32.const 1968 i32.const 0 call $~lib/string/String#charCodeAt i32.eq @@ -8287,7 +8316,7 @@ end i32.const 0 ) - (func $main_near/__near_JSONHandler_FooBar#setNull (; 130 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $main_near/__near_JSONHandler_FooBar#setNull (; 131 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $1 i32.const 136 call $~lib/string/String.__eq @@ -8342,7 +8371,7 @@ get_local $1 call $json/decoder/ThrowingJSONHandler#setNull ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNull (; 131 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseNull (; 132 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#peekChar get_global $json/decoder/NULL_STR @@ -8364,7 +8393,7 @@ end i32.const 0 ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseValue (; 132 ;) (type $ii) (param $0 i32) (result i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#parseValue (; 133 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace @@ -8410,7 +8439,7 @@ call $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#skipWhitespace get_local $1 ) - (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#deserialize (; 133 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $json/decoder/JSONDecoder<__near_JSONHandler_FooBar>#deserialize (; 134 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) get_local $2 if @@ -8454,7 +8483,7 @@ i32.ne i32.eqz if - i32.const 2088 + i32.const 2032 i32.const 1264 i32.const 103 i32.const 8 @@ -8462,7 +8491,7 @@ unreachable end ) - (func $main_near/__near_decode_FooBar (; 134 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $main_near/__near_decode_FooBar (; 135 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) block (result i32) @@ -8520,7 +8549,7 @@ get_local $2 i32.load offset=12 ) - (func $~lib/string/String#charAt (; 135 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#charAt (; 136 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) get_local $0 i32.const 0 @@ -8555,7 +8584,7 @@ i32.store16 offset=4 get_local $2 ) - (func $test/bin2hex (; 136 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $test/bin2hex (; 137 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -8622,7 +8651,7 @@ end get_local $3 ) - (func $test/runTest (; 137 ;) (type $v) + (func $test/runTest (; 138 ;) (type $v) (local $0 i32) (local $1 i32) (local $2 i32) @@ -8768,7 +8797,7 @@ i32.const 3 call $json/encoder/JSONEncoder#setInteger ) - (func $start (; 138 ;) (type $v) + (func $start (; 139 ;) (type $v) get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -8797,6 +8826,6 @@ set_global $json/decoder/CHAR_A_LOWER call $test/runTest ) - (func $null (; 139 ;) (type $v) + (func $null (; 140 ;) (type $v) ) ) From 31c821e3dff9edef019c7a3699e4c9ba954d38f5 Mon Sep 17 00:00:00 2001 From: Vladimir Grichina Date: Wed, 9 Jan 2019 00:09:25 -0800 Subject: [PATCH 5/6] Add prelude with required imports automatically --- dist/assemblyscript.js | 2 +- dist/assemblyscript.js.map | 2 +- src/definitions.ts | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index 84979dd9c0..a73536ae72 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,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=Z;var J=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 n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=xe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=xe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.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}(j);t.DeclarationStatement=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return n(t,e),t}(J);t.IndexSignatureDeclaration=$;var ee=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(J);t.VariableLikeDeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(j);t.BlockStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(j);t.BreakStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.ClassDeclaration=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(j);t.ContinueStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(j);t.DoStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(j);t.EmptyStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(J);t.EnumDeclaration=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(J);t.EnumValueDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(j);t.ExportStatement=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(j);t.ExpressionStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}(ee);t.FieldDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(j);t.ForStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(j);t.IfStatement=ge;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(J);t.ImportDeclaration=ye;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(j);t.ImportStatement=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(ne);t.InterfaceDeclaration=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(me);t.MethodDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(J);t.NamespaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(j);t.ReturnStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(j);t.SwitchStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(j);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(j);t.TryStatement=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(J);t.TypeDeclaration=Se;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}(ee);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(j);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(j);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(j);function xe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?xe(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?xe(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Fe(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}}}},a=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 s,o=r(0),c=r(1),l=r(6),p=r(3),u=r(5),h=r(11),d=function(){return function(){}}(),_=function(){return function(){}}(),m=function(){return function(){}}();function g(e,t){switch(assert(t.length),e){case p.DecoratorKind.OPERATOR:case p.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 p.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 p.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 y,f,E=new Map,T=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=E,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=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 h.Resolver(r),r.sources=[],r}return n(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(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=s);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var o=0;switch(u.getExpressionType(e)){case 1:o=u.getConstValueI32(e);break;case 2:o=u.getConstValueI64Low(e);break;case 3:o=i32(u.getConstValueF32(e));break;case 4:o=i32(u.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 u.ExpressionId.Load:var c=void 0;switch(u.getLoadBytes(e)){case 1:c=u.isLoadSigned(e)?l.Type.i8:l.Type.u8;break;case 2:c=u.isLoadSigned(e)?l.Type.i16:l.Type.u16;break;default:c=u.isLoadSigned(e)?l.Type.i32:l.Type.u32}return z(c,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var p=assert(u.getBlockChildCount(e)),h=u.getBlockChild(e,p-1);return this.canOverflow(h,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(u.getCallTarget(e))));assert(_.kind==y.FUNCTION);var m=_.signature.returnType;return!_.flow.is(2)||z(m,t);case u.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 z(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=K},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";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||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(1),o=r(3),c=r(2);function l(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function p(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:case i.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"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=l,t.tokenIsAlsoIdentifier=p,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=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=u;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(c.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(c.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 _=null},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(23),c=r(1),l=r(5),p=r(0),u=r(4),h=r(8),d=r(3),_=r(6),m=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var g=function(){function e(){this.target=s.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==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?_.Type.usize64:_.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?_.Type.isize64:_.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?2:1},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"}(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 y,f,E=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=_.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=l.Module.create(),n}return n(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,s=this.program;s.initialize(r);var c=new u.Function(s.startFunction,"start",new _.Signature([],_.Type.void));this.startFunctionInstance=c;var p=new Array;this.startFunctionBody=p,this.currentFunction=c,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var h=s.sources,d=0,m=h.length;d"),!1;e.type=this.currentType,e.set(p.CommonFlags.RESOLVED)}else assert(!1);if(e.is(p.CommonFlags.AMBIENT)&&e.hasDecorator(u.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?T(e,r):(y="env",f=e.simpleName),t.addGlobalImport(e.internalName,y,f,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(c.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)),l.getExpressionId(n)!=l.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),l.getExpressionId(n)!=l.ExpressionId.Const&&(this.warning(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(u.DecoratorFlags.INLINE)&&!o){switch(assert(l.getExpressionId(n)==l.ExpressionId.Const),l.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI64Low(n),l.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var h=e.internalName;return o?(t.addGlobal(h,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(h,n))):t.addGlobal(h,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==u.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null,s=!1;if(e.members)try{for(var o=i(e.members.values()),h=o.next();!h.done;h=o.next()){var d=h.value;if(d.kind==u.ElementKind.ENUMVALUE){var m=!1,g=d,y=g.declaration;g.set(p.CommonFlags.COMPILED);var f=void 0;y.value?(f=this.compileExpression(y.value,_.Type.i32,1,0),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)?(f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),m=!0)):m=!0)):null==a?f=n.createI32(0):(s&&this.error(c.DiagnosticCode.Enum_member_must_have_initializer,y.range),f=n.createBinary(l.BinaryOp.AddI32,n.createGetGlobal(a.internalName,1),n.createI32(1)),f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),m=!0)),m?(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(p.CommonFlags.CONST),f),s=!1),a=g}}}catch(e){t={error:e}}finally{try{h&&!h.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==u.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(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var g=t.createBlock("case0|"+a,p,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),o.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(c.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==d.NodeKind.SOURCE){for(var s=0;s");continue}f=this.currentType}var T=!1;if(g.is(p.CommonFlags.CONST))if(E)if(E=this.module.precomputeExpression(E),l.getExpressionId(E)==l.ExpressionId.Const){var I=new u.Local(r,y,-1,f);switch(l.getExpressionType(E)){case 1:I=I.withConstantIntegerValue(i64_new(l.getConstValueI32(E),0));break;case 2:I=I.withConstantIntegerValue(i64_new(l.getConstValueI64Low(E),l.getConstValueI64High(E)));break;case 3:I=I.withConstantFloatValue(l.getConstValueF32(E));break;case 4:I=I.withConstantFloatValue(l.getConstValueF64(E));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(c.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(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,g.range);else this.error(c.DiagnosticCode._const_declarations_must_be_initialized,g.range);if(!T){I=void 0;I=g.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||h.is(2048)?h.addScopedLocal(f,y,!1,g):n.addLocal(f,y,g),E?(o.push(this.compileAssignmentWithValue(g.name,E)),I.type.is(36)&&h.setLocalWrapped(I.index,!h.canOverflow(E,f))):I.type.is(36)&&h.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,_.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(l.getExpressionId(n)==l.ExpressionId.Const&&1==l.getExpressionType(n)){if(!l.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.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 u="continue|"+a;o.continueLabel=u;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(u,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(u)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.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(_.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(u.DecoratorFlags.BUILTIN)||t!=_.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=_.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(c.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==_.Type.void?_.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(c.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(c.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(l.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(l.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToI64,e):s.createUnary(l.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToU64,e):s.createUnary(l.UnaryOp.TruncF32ToU32,e):r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToI64,e):s.createUnary(l.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToU64,e):s.createUnary(l.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)?l.UnaryOp.ConvertI64ToF32:l.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF32:l.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?l.UnaryOp.ConvertI64ToF64:l.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF64:l.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(l.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?l.UnaryOp.ExtendI32:l.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GtI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtI64:l.BinaryOp.GtI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GtU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtU64:l.BinaryOp.GtU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GtU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GtF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GtF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.LE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.LeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeI64:l.BinaryOp.LeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.LeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeU64:l.BinaryOp.LeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.LeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.LeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.LeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.GE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeI64:l.BinaryOp.GeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeU64:l.BinaryOp.GeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS_EQUALS_EQUALS:case h.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.EQ)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.EqI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.EqI64:l.BinaryOp.EqI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.EqI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.EqF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.EqF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EXCLAMATION_EQUALS_EQUALS:case h.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.NE)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.NeI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.NeI64:l.BinaryOp.NeI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.NeI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.NeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.NeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS:return this.compileAssignment(d,m,t);case h.Token.PLUS_EQUALS:g=!0;case h.Token.PLUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.ADD)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.AddI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AddI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.AddF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.AddF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.MINUS_EQUALS:g=!0;case h.Token.MINUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.SUB)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.SubI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.SubI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.SubF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.SubF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.MUL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.MulI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.MulI64:l.BinaryOp.MulI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.MulI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.MulF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.MulF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.POW)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,_.Type.f64,1,0,d),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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case h.Token.SLASH_EQUALS:g=!0;case h.Token.SLASH:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.DIV)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.DivI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivI64:l.BinaryOp.DivI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.DivU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivU64:l.BinaryOp.DivU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.DivU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.DivF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.DivF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.PERCENT_EQUALS:g=!0;case h.Token.PERCENT:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.REM)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.RemI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemI64:l.BinaryOp.RemI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.RemU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemU64:l.BinaryOp.RemU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,T;if(!(E=this.program.elementsLookup.get("Math"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.LESSTHAN_LESSTHAN_EQUALS:g=!0;case h.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShlI64:l.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.ShrI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.ShrI64,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrI64:l.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_EQUALS:g=!0;case h.Token.AMPERSAND:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.AndI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AndI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AndI64:l.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.BAR_EQUALS:g=!0;case h.Token.BAR:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.OrI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.OrI64:l.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.CARET_EQUALS:g=!0;case h.Token.CARET:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.XorI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,o=p.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=p.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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),i,p.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case h.Token.BAR_BAR:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),p.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return g?this.compileAssignmentWithValue(d,o,t!=_.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(u.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==u.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(u.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=_.Type.void);case u.ElementKind.LOCAL:case u.ElementKind.FIELD:n=s.type;break;case u.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var l=this.resolver.resolveFunction(o,null);if(!l)return this.module.createUnreachable();assert(1==l.signature.parameterTypes.length),n=l.signature.parameterTypes[0];break}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case u.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(4096),h=s.lookupOverload(u.OperatorKind.INDEXED_SET,p);if(!h)return s.lookupOverload(u.OperatorKind.INDEXED_GET,p)?this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=_.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=_.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 u.ElementKind.LOCAL:var a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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(),l=i.internalName;return n.createBlock(null,[n.createSetGlobal(l,t),n.createGetGlobal(l,o)],o)}return n.createSetGlobal(i.internalName,t);case u.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(c.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),m=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:_.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(b=this.currentFunction).flow;var g=b.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(a.byteSize,m,n.createGetLocal(g,o),o,i.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(a.byteSize,m,t,o,i.memoryOffset);case u.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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(f,[m,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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),g=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(f,[n.createTeeLocal(g,m),t]),this.makeCallDirect(T,[n.createGetLocal(g,I)])],I)}return n.createBlock(null,[this.makeCallDirect(f,[t]),this.makeCallDirect(T)],I)}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case u.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(u.OperatorKind.INDEXED_GET,A);if(!C)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(u.OperatorKind.INDEXED_SET,A);if(!N)return this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:_.Type.void,n.createUnreachable();var O=i.type,S=(d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,_.Type.i32,1,0));if(r){var b,L=(b=this.currentFunction).getTempLocal(O,!1),k=b.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(L),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(L.index,m),n.createTeeLocal(k.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(L.index,L.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,S,t])}}return this.error(c.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 u.ElementKind.FUNCTION_PROTOTYPE:var o=s,l=e.typeArguments;if(o.hasDecorator(u.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var h=null;if(l){if(!o.is(p.CommonFlags.GENERIC))return this.error(c.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();h=this.resolver.resolveFunctionInclTypeArguments(o,l,m.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(p.CommonFlags.GENERIC)){for(var g=new Map,y=assert(o.declaration.typeParameters),f=y.length,E=0;Es&&!i)||(this.error(c.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(p.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(c.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var l=n?a+1:a,u=new Array(l),h=0;n&&(u[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(c.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,h=e.is(p.CommonFlags.INSTANCE),d=r.requiredParameters,m=d,g=i.length,y=g;h&&(++m,++y);var f=assert(y-m),E=new Array(m),T=0,I=this.module;h&&(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(p.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(f))return this.module.createUnreachable();var I=f.type;return assert(I!=_.Type.void),f.is(p.CommonFlags.INLINED)?this.compileInlineConstant(f,t,r):(this.currentType=I,this.module.createGetGlobal(f.internalName,I.toNativeType()));case u.ElementKind.ENUMVALUE:return f.is(p.CommonFlags.COMPILED)?(this.currentType=_.Type.i32,f.is(p.CommonFlags.INLINED)?this.module.createI32(f.constantValue):this.module.createGetGlobal(f.internalName,1)):(this.error(c.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=_.Type.i32,this.module.createUnreachable());case u.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(f,null,m.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(c.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=_.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?l.BinaryOp.NeI64:l.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(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==_.Type.f32?n.createF32(a):(this.currentType=_.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=_.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=_.Type.u32,n.createI32(i64_low(s))):(this.currentType=_.Type.i64,n.createI64(i64_low(s),i64_high(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(c.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 c=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*c,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(o.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(c,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(c.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PRIVATE))return this.error(c.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PROTECTED))return this.error(c.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,l=e.values,h=n.members,d=!1,_=new Array(s+2),m=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==l.length);for(var g=0,y=s;g=0);var l=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),l,i.type.toNativeType(),i.memoryOffset);case u.ElementKind.PROPERTY:return this.compileGetter(i,e);case u.ElementKind.FUNCTION_PROTOTYPE:return this.error(c.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(c.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(p.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&u.DecoratorFlags.INLINE);if(n.is(p.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==u.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),l=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,l,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(c.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,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(l.getExpressionId(o)==l.ExpressionId.Const&&1==l.getExpressionType(o))return l.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;u.free();var m=a.fork();i.flow=m;var g=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var f=_.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(c.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==_.Type.void?_.Type.i32:t,0,0);if(l.getExpressionId(i)==l.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=_.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case h.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case h.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var d,m;if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.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=_.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 h.Token.PLUS:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case h.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==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(l.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(l.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=_.Type.bool;break;case h.Token.TILDE:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t.is(8)?_.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.TYPEOF:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=_.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(l.UnaryOp.ExtendI8ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(l.UnaryOp.ExtendI16ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(l.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(l.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(l.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?l.UnaryOp.EqzI64:l.UnaryOp.EqzI32,e);case 11:return r.createBinary(l.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(l.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(l.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(l.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(l.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(l.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,s=this.currentFunction,c=this.options.nativeSizeType,l=s.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(l.index,o.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==u.ElementKind.FIELD){var g=m,y=g.type,f=y.toNativeType(),E=g.prototype.declaration;if(assert(!g.isAny(p.CommonFlags.CONST)),E.initializer)h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),this.compileExpression(E.initializer,y,1,0),f,g.memoryOffset));else{var T=g.prototype.declaration.parameterIndex;h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),T>=0?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n handledRoot: boolean = false;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(json);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n "),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }");var s=t.filter(function(e){return!(e.type.toString()in r.typeMapping)});this.sb.push("\n pushObject(name: string): bool {"),this.sb.push("if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }"),this.generatePushHandler(e,s.filter(function(e){return!r.isArrayType(e.type)})),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,s.filter(function(e){return r.isArrayType(e.type)})),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+".push(value);\n }\n setNull(name: string): void {\n "+e+".push(<"+t+">null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"null","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n handledRoot: boolean = false;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n handledRoot: boolean = false;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(json);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n "),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }");var s=t.filter(function(e){return!(e.type.toString()in r.typeMapping)});this.sb.push("\n pushObject(name: string): bool {"),this.sb.push("if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }"),this.generatePushHandler(e,s.filter(function(e){return!r.isArrayType(e.type)})),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,s.filter(function(e){return r.isArrayType(e.type)})),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+".push(value);\n }\n setNull(name: string): void {\n "+e+".push(<"+t+">null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"null","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n handledRoot: boolean = false;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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--;\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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n handledRoot: boolean = false;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(json);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n `);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping));\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.sb.push(`if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}.push(value);\n }\n setNull(name: string): void {\n ${valuePrefix}.push(<${fieldType}>null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"null\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n handledRoot: boolean = false;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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 +{"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/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/tokenizer.ts","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","CALL","ELEMENTACCESS","PROPERTYACCESS","PARENTHESIZED","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","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","SUPER","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","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","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","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","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","_BinaryenModuleCreate","cachedByValue","memory","allocate","createFrom","cArr","allocU8Array","_BinaryenModuleRead","changetype","addFunctionType","result","paramTypes","cStr","allocString","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","_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","_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","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","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Return","Break","numChildren","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","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","eval","e","window","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","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","numPages","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","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","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","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","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","parentBase","thisLocal","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","scopedThis","_this_cannot_be_referenced_in_current_location","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","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","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","compileAllocate","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","classInstance","compileInstantiate","currentClassInstance","makeAllocate","propertyAccess","resolvePropertyAccess","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","fieldType","nativeFieldType","fieldDeclaration","ReportMode","currentTypeIsPlaceholder","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","contextualFunction","targetExpression","propertyName","elementAccess","explicitLocal","functionTarget","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClass","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","NEARBindingsBuilder","typeMapping","nonNullableTypes","generatedEncodeFunctions","generatedDecodeFunctions","build","generateArgsParser","generateWrapperFunction","fields","paramName","forEach","generateDecodeFunction","generateHandlerMethods","generateEncodeFunction","generateFieldEncoder","valuePrefix","setterType","this_1","matchingFields","filter","nonBasicFields","generatePushHandler","isArrayType","encodeType","generateArrayHandlerMethods","getFields","sourceExpr","generateHandler","fieldExpr","indexOf","pushType","__spread","visitInterface","mainSource","IDLBuilder","indentLevel","indent","typeToString","members_1","members_1_1","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","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","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","PREFIX","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","POSITIVE_INFINITY","Infinity","NEGATIVE_INFINITY","NaN","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","copy","dest","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","gte","lte","minSafeF64","maxSafeF64","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","tempLocal0","tempLocal1","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","allocateInstance","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","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","buildNEAR"],"mappings":"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EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKC,GACrBvhB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKC,GAAE,KAKX,IAAK,MAOH,OANI9Y,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKE,IACrBxhB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKE,IAAG,KAKZ,IAAK,MAOH,OANI/Y,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKG,IACrBzhB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKG,IAAG,KAKZ,IAAK,MAOH,OANIhZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKI,IACrB1hB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKI,IA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AAM,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,OAEtCE,GACJ,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,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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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n handledRoot: boolean = false;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(json);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n `);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping));\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.sb.push(`if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}.push(value);\n }\n setNull(name: string): void {\n ${valuePrefix}.push(<${fieldType}>null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"null\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n handledRoot: boolean = false;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n this.sb.push(`\n import { near } from \"./near\";\n import { JSONEncoder} from \"./json/encoder\"\n import { JSONDecoder, ThrowingJSONHandler, DecoderState } from \"./json/decoder\"\n `);\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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/src/definitions.ts b/src/definitions.ts index b9a3b99026..17e7d64c75 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -457,6 +457,11 @@ export class NEARBindingsBuilder extends ExportsWalker { } build(): string { + this.sb.push(` + import { near } from "./near"; + import { JSONEncoder} from "./json/encoder" + import { JSONDecoder, ThrowingJSONHandler, DecoderState } from "./json/decoder" + `); let mainSource = this.program.sources .filter(s => s.normalizedPath.indexOf("~lib") != 0)[0]; this.sb.push(mainSource.text); From d83e96b6b581a59d1179b3eb47ff51cb8ea2f7cb Mon Sep 17 00:00:00 2001 From: Vladimir Grichina Date: Wed, 9 Jan 2019 00:38:09 -0800 Subject: [PATCH 6/6] Include necessary runtime function declarations in generated code --- dist/assemblyscript.js | 2 +- dist/assemblyscript.js.map | 2 +- src/definitions.ts | 8 +++++ tests/near-bindgen/main.ts | 8 ----- tests/near-bindgen/main_near.ts.expected | 14 ++++++--- tests/near-bindgen/test.wat.expected | 40 ++++++++++++------------ 6 files changed, 39 insertions(+), 35 deletions(-) diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index a73536ae72..d79f6b3c97 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,o.statements=new Array,o.range=new a.Range(o,0,r.length),o.text=r,o}return n(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==q.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==q.LIBRARY},enumerable:!0,configurable:!0}),t}(c);t.Source=Z;var J=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 n(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=xe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=xe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==s.VARIABLE&&!(e=e.parent))&&e.kind==s.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==s.VARIABLE&&!(e=e.parent))&&(e.kind==s.NAMESPACEDECLARATION?this.is(i.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==s.CLASSDECLARATION?this.is(i.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==s.SOURCE&&this.is(i.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}(j);t.DeclarationStatement=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return n(t,e),t}(J);t.IndexSignatureDeclaration=$;var ee=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(J);t.VariableLikeDeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return n(t,e),t}(j);t.BlockStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return n(t,e),t}(j);t.BreakStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.ClassDeclaration=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return n(t,e),t}(j);t.ContinueStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return n(t,e),t}(j);t.DoStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return n(t,e),t}(j);t.EmptyStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return n(t,e),t}(J);t.EnumDeclaration=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return n(t,e),t}(J);t.EnumValueDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return n(t,e),t}(c);t.ExportImportStatement=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return n(t,e),t}(c);t.ExportMember=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return n(t,e),t}(j);t.ExportStatement=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return n(t,e),t}(j);t.ExpressionStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return n(t,e),t}(ee);t.FieldDeclaration=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return n(t,e),t}(j);t.ForStatement=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return n(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(J);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return n(t,e),t}(j);t.IfStatement=ge;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return n(t,e),t}(J);t.ImportDeclaration=ye;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return n(t,e),t}(j);t.ImportStatement=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return n(t,e),t}(ne);t.InterfaceDeclaration=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return n(t,e),t}(me);t.MethodDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return n(t,e),t}(J);t.NamespaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return n(t,e),t}(j);t.ReturnStatement=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return n(t,e),t}(c);t.SwitchCase=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return n(t,e),t}(j);t.SwitchStatement=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return n(t,e),t}(j);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return n(t,e),t}(j);t.TryStatement=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return n(t,e),t}(J);t.TypeDeclaration=Se;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return n(t,e),t}(ee);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return n(t,e),t}(j);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return n(t,e),t}(j);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return n(t,e),t}(j);function xe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=s.VARIABLEDECLARATION||n.kind!=s.VARIABLE||(n=n.parent))?n.kind==s.CLASSDECLARATION?xe(n,t)+(e.is(i.CommonFlags.STATIC)?i.STATIC_DELIMITER:i.INSTANCE_DELIMITER)+r:n.kind==s.NAMESPACEDECLARATION||n.kind==s.ENUMDECLARATION?xe(n,t)+i.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+i.PATH_DELIMITER+r:r}function Fe(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}}}},a=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 s,o=r(0),c=r(1),l=r(6),p=r(3),u=r(5),h=r(11),d=function(){return function(){}}(),_=function(){return function(){}}(),m=function(){return function(){}}();function g(e,t){switch(assert(t.length),e){case p.DecoratorKind.OPERATOR:case p.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 p.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 p.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 y,f,E=new Map,T=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=E,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=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 h.Resolver(r),r.sources=[],r}return n(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(u.getBinaryLeft(e),t)&&!(u.getExpressionId(r=u.getBinaryRight(e))==u.ExpressionId.Const&&u.getConstValueI32(r)>=s);case u.BinaryOp.DivU32:case u.BinaryOp.RemI32:case u.BinaryOp.RemU32:return this.canOverflow(u.getBinaryLeft(e),t)||this.canOverflow(u.getBinaryRight(e),t)}break;case u.ExpressionId.Unary:switch(u.getUnaryOp(e)){case u.UnaryOp.EqzI32:case u.UnaryOp.EqzI64:return!1;case u.UnaryOp.ClzI32:case u.UnaryOp.CtzI32:case u.UnaryOp.PopcntI32:return t.size<7}break;case u.ExpressionId.Const:var o=0;switch(u.getExpressionType(e)){case 1:o=u.getConstValueI32(e);break;case 2:o=u.getConstValueI64Low(e);break;case 3:o=i32(u.getConstValueF32(e));break;case 4:o=i32(u.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 u.ExpressionId.Load:var c=void 0;switch(u.getLoadBytes(e)){case 1:c=u.isLoadSigned(e)?l.Type.i8:l.Type.u8;break;case 2:c=u.isLoadSigned(e)?l.Type.i16:l.Type.u16;break;default:c=u.isLoadSigned(e)?l.Type.i32:l.Type.u32}return z(c,t);case u.ExpressionId.Block:if(!u.getBlockName(e)){var p=assert(u.getBlockChildCount(e)),h=u.getBlockChild(e,p-1);return this.canOverflow(h,t)}break;case u.ExpressionId.If:return this.canOverflow(u.getIfTrue(e),t)||this.canOverflow(assert(u.getIfFalse(e)),t);case u.ExpressionId.Select:return this.canOverflow(u.getSelectThen(e),t)||this.canOverflow(u.getSelectElse(e),t);case u.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(u.getCallTarget(e))));assert(_.kind==y.FUNCTION);var m=_.signature.returnType;return!_.flow.is(2)||z(m,t);case u.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 z(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=K},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";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||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(1),o=r(3),c=r(2);function l(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return i.ABSTRACT;case"as":return i.AS;case"async":return i.ASYNC;case"await":return i.AWAIT}break;case 98:switch(e){case"break":return i.BREAK}break;case 99:switch(e){case"case":return i.CASE;case"catch":return i.CATCH;case"class":return i.CLASS;case"continue":return i.CONTINUE;case"const":return i.CONST;case"constructor":return i.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return i.DEBUGGER;case"declare":return i.DECLARE;case"default":return i.DEFAULT;case"delete":return i.DELETE;case"do":return i.DO}break;case 101:switch(e){case"else":return i.ELSE;case"enum":return i.ENUM;case"export":return i.EXPORT;case"extends":return i.EXTENDS}break;case 102:switch(e){case"false":return i.FALSE;case"finally":return i.FINALLY;case"for":return i.FOR;case"from":return i.FROM;case"function":return i.FUNCTION}break;case 103:switch(e){case"get":return i.GET}break;case 105:switch(e){case"if":return i.IF;case"implements":return i.IMPLEMENTS;case"import":return i.IMPORT;case"in":return i.IN;case"instanceof":return i.INSTANCEOF;case"interface":return i.INTERFACE;case"is":return i.IS}break;case 107:switch(e){case"keyof":return i.KEYOF}break;case 108:switch(e){case"let":return i.LET}break;case 109:switch(e){case"module":return i.MODULE}break;case 110:switch(e){case"namespace":return i.NAMESPACE;case"new":return i.NEW;case"null":return i.NULL}break;case 111:switch(e){case"of":return i.OF}break;case 112:switch(e){case"package":return i.PACKAGE;case"private":return i.PRIVATE;case"protected":return i.PROTECTED;case"public":return i.PUBLIC}break;case 114:switch(e){case"readonly":return i.READONLY;case"return":return i.RETURN}break;case 115:switch(e){case"set":return i.SET;case"static":return i.STATIC;case"super":return i.SUPER;case"switch":return i.SWITCH}break;case 116:switch(e){case"this":return i.THIS;case"throw":return i.THROW;case"true":return i.TRUE;case"try":return i.TRY;case"type":return i.TYPE;case"typeof":return i.TYPEOF}break;case 118:switch(e){case"var":return i.VAR;case"void":return i.VOID}break;case 119:switch(e){case"while":return i.WHILE;case"with":return i.WITH}break;case 121:switch(e){case"yield":return i.YIELD}}return i.INVALID}function p(e){switch(e){case i.ABSTRACT:case i.AS:case i.CONSTRUCTOR:case i.DECLARE:case i.DELETE:case i.FROM:case i.FOR:case i.GET:case i.IS:case i.KEYOF:case i.MODULE:case i.NAMESPACE:case i.READONLY:case i.SET:case i.TYPE:case i.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"}(i=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(a=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=l,t.tokenIsAlsoIdentifier=p,t.operatorTokenToString=function(e){switch(e){case i.DELETE:return"delete";case i.IN:return"in";case i.INSTANCEOF:return"instanceof";case i.NEW:return"new";case i.TYPEOF:return"typeof";case i.VOID:return"void";case i.YIELD:return"yield";case i.DOT_DOT_DOT:return"...";case i.COMMA:return",";case i.LESSTHAN:return"<";case i.GREATERTHAN:return">";case i.LESSTHAN_EQUALS:return"<=";case i.GREATERTHAN_EQUALS:return">=";case i.EQUALS_EQUALS:return"==";case i.EXCLAMATION_EQUALS:return"!=";case i.EQUALS_EQUALS_EQUALS:return"===";case i.EXCLAMATION_EQUALS_EQUALS:return"!==";case i.PLUS:return"+";case i.MINUS:return"-";case i.ASTERISK_ASTERISK:return"**";case i.ASTERISK:return"*";case i.SLASH:return"/";case i.PERCENT:return"%";case i.PLUS_PLUS:return"++";case i.MINUS_MINUS:return"--";case i.LESSTHAN_LESSTHAN:return"<<";case i.GREATERTHAN_GREATERTHAN:return">>";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case i.AMPERSAND:return"&";case i.BAR:return"|";case i.CARET:return"^";case i.EXCLAMATION:return"!";case i.TILDE:return"~";case i.AMPERSAND_AMPERSAND:return"&&";case i.BAR_BAR:return"||";case i.EQUALS:return"=";case i.PLUS_EQUALS:return"+=";case i.MINUS_EQUALS:return"-=";case i.ASTERISK_EQUALS:return"*=";case i.ASTERISK_ASTERISK_EQUALS:return"**=";case i.SLASH_EQUALS:return"/=";case i.PERCENT_EQUALS:return"%=";case i.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case i.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case i.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case i.AMPERSAND_EQUALS:return"&=";case i.BAR_EQUALS:return"|=";case i.CARET_EQUALS:return"^=";default:return assert(!1),""}};var u=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=u;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(c.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(c.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 _=null},function(e,t,r){"use strict";var n=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(23),c=r(1),l=r(5),p=r(0),u=r(4),h=r(8),d=r(3),_=r(6),m=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var g=function(){function e(){this.target=s.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==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?_.Type.usize64:_.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?_.Type.isize64:_.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?2:1},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"}(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 y,f,E=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=_.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=l.Module.create(),n}return n(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,s=this.program;s.initialize(r);var c=new u.Function(s.startFunction,"start",new _.Signature([],_.Type.void));this.startFunctionInstance=c;var p=new Array;this.startFunctionBody=p,this.currentFunction=c,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var h=s.sources,d=0,m=h.length;d"),!1;e.type=this.currentType,e.set(p.CommonFlags.RESOLVED)}else assert(!1);if(e.is(p.CommonFlags.AMBIENT)&&e.hasDecorator(u.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(p.CommonFlags.CONST)||e.is(p.CommonFlags.STATIC|p.CommonFlags.READONLY);if(e.is(p.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(p.CommonFlags.MODULE_IMPORT),r?T(e,r):(y="env",f=e.simpleName),t.addGlobalImport(e.internalName,y,f,a),e.set(p.CommonFlags.COMPILED),!0):(this.error(c.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)),l.getExpressionId(n)!=l.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),l.getExpressionId(n)!=l.ExpressionId.Const&&(this.warning(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(u.DecoratorFlags.INLINE)&&!o){switch(assert(l.getExpressionId(n)==l.ExpressionId.Const),l.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(l.getConstValueI64Low(n),l.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=l.getConstValueF64(n);break;default:return assert(!1),!1}e.set(p.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var h=e.internalName;return o?(t.addGlobal(h,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(h,n))):t.addGlobal(h,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==u.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(p.CommonFlags.COMPILED))return!0;e.set(p.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var a=null,s=!1;if(e.members)try{for(var o=i(e.members.values()),h=o.next();!h.done;h=o.next()){var d=h.value;if(d.kind==u.ElementKind.ENUMVALUE){var m=!1,g=d,y=g.declaration;g.set(p.CommonFlags.COMPILED);var f=void 0;y.value?(f=this.compileExpression(y.value,_.Type.i32,1,0),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)?(f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),m=!0)):m=!0)):null==a?f=n.createI32(0):(s&&this.error(c.DiagnosticCode.Enum_member_must_have_initializer,y.range),f=n.createBinary(l.BinaryOp.AddI32,n.createGetGlobal(a.internalName,1),n.createI32(1)),f=n.precomputeExpression(f),l.getExpressionId(f)!=l.ExpressionId.Const&&(e.is(p.CommonFlags.CONST)&&this.error(c.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),m=!0)),m?(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(p.CommonFlags.CONST),f),s=!1),a=g}}}catch(e){t={error:e}}finally{try{h&&!h.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==u.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(p.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var g=t.createBlock("case0|"+a,p,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),o.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(c.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==d.NodeKind.SOURCE){for(var s=0;s");continue}f=this.currentType}var T=!1;if(g.is(p.CommonFlags.CONST))if(E)if(E=this.module.precomputeExpression(E),l.getExpressionId(E)==l.ExpressionId.Const){var I=new u.Local(r,y,-1,f);switch(l.getExpressionType(E)){case 1:I=I.withConstantIntegerValue(i64_new(l.getConstValueI32(E),0));break;case 2:I=I.withConstantIntegerValue(i64_new(l.getConstValueI64Low(E),l.getConstValueI64High(E)));break;case 3:I=I.withConstantFloatValue(l.getConstValueF32(E));break;case 4:I=I.withConstantFloatValue(l.getConstValueF64(E));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(c.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(c.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,g.range);else this.error(c.DiagnosticCode._const_declarations_must_be_initialized,g.range);if(!T){I=void 0;I=g.isAny(p.CommonFlags.LET|p.CommonFlags.CONST)||h.is(2048)?h.addScopedLocal(f,y,!1,g):n.addLocal(f,y,g),E?(o.push(this.compileAssignmentWithValue(g.name,E)),I.type.is(36)&&h.setLocalWrapped(I.index,!h.canOverflow(E,f))):I.type.is(36)&&h.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,_.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(l.getExpressionId(n)==l.ExpressionId.Const&&1==l.getExpressionType(n)){if(!l.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.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 u="continue|"+a;o.continueLabel=u;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(u,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(u)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(p.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(_.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(u.DecoratorFlags.BUILTIN)||t!=_.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=_.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(c.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==_.Type.void?_.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(c.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(c.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(l.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(l.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToI64,e):s.createUnary(l.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF32ToU64,e):s.createUnary(l.UnaryOp.TruncF32ToU32,e):r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToI64,e):s.createUnary(l.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(l.UnaryOp.TruncF64ToU64,e):s.createUnary(l.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)?l.UnaryOp.ConvertI64ToF32:l.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF32:l.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?l.UnaryOp.ConvertI64ToF64:l.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?l.UnaryOp.ConvertI32ToF64:l.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==_.Type.bool?(e=s.createBinary(l.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(l.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?l.UnaryOp.ExtendI32:l.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GtI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtI64:l.BinaryOp.GtI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GtU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GtU64:l.BinaryOp.GtU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GtU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GtF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GtF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.LE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.LeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeI64:l.BinaryOp.LeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.LeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.LeU64:l.BinaryOp.LeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.LeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.LeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.LeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.GE)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!0)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.GeI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeI64:l.BinaryOp.GeI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.GeU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.GeU64:l.BinaryOp.GeU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.GeU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.GeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.GeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS_EQUALS_EQUALS:case h.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.EQ)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.EqI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.EqI64:l.BinaryOp.EqI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.EqI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.EqF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.EqF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EXCLAMATION_EQUALS_EQUALS:case h.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,y==h.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.NE)){o=this.compileBinaryOverload(v,d,r,m,e);break}if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,h.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,p.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=p.createBinary(l.BinaryOp.NeI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.NeI64:l.BinaryOp.NeI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.NeI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.NeF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.NeF64,r,i);break;default:assert(!1),o=p.createUnreachable()}this.currentType=_.Type.bool;break;case h.Token.EQUALS:return this.compileAssignment(d,m,t);case h.Token.PLUS_EQUALS:g=!0;case h.Token.PLUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.ADD)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.AddI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AddI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.AddF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.AddF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.MINUS_EQUALS:g=!0;case h.Token.MINUS:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.SUB)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.SubI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.SubI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.SubF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.SubF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.MUL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1);else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.MulI32,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.MulI64:l.BinaryOp.MulI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.MulI64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.MulF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.MulF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.ASTERISK_ASTERISK_EQUALS:g=!0;case h.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.POW)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,_.Type.f64,1,0,d),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(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case h.Token.SLASH_EQUALS:g=!0;case h.Token.SLASH:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.DIV)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.DivI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivI64:l.BinaryOp.DivI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.DivU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.DivU64:l.BinaryOp.DivU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.DivU64,r,i);break;case 11:o=p.createBinary(l.BinaryOp.DivF32,r,i);break;case 12:o=p.createBinary(l.BinaryOp.DivF64,r,i);break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.PERCENT_EQUALS:g=!0;case h.Token.PERCENT:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.REM)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,d),i=this.convertExpression(i,a,a=s,1,1,m)}switch(this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.RemI32,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemI64:l.BinaryOp.RemI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.RemU32,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.RemU64:l.BinaryOp.RemU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,T;if(!(E=this.program.elementsLookup.get("Math"))){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=p.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(c.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=p.createUnreachable();break}assert(T.kind==u.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):p.createUnreachable();break;default:assert(!1),o=p.createUnreachable()}break;case h.Token.LESSTHAN_LESSTHAN_EQUALS:g=!0;case h.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=p.createBinary(l.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShlI64:l.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=p.createBinary(l.BinaryOp.ShrI32,r,i);break;case 3:o=p.createBinary(l.BinaryOp.ShrI64,r,i);break;case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrI64:l.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case h.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(m,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=p.createBinary(l.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.ShrU64:l.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_EQUALS:g=!0;case h.Token.AMPERSAND:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=p.createBinary(l.BinaryOp.AndI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.AndI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.AndI64:l.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.BAR_EQUALS:g=!0;case h.Token.BAR:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.OrI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.OrI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.OrI64:l.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.CARET_EQUALS:g=!0;case h.Token.CARET:if(r=this.compileExpressionRetainType(d,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(u.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,d,r,m,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(m,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(m,n,0),a=this.currentType,!(s=_.Type.commonCompatible(n,a,!1)))return this.error(c.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,p.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,d),i=this.convertExpression(i,a,a=s,1,0,m)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 2:case 7:o=p.createBinary(l.BinaryOp.XorI32,r,i);break;case 3:case 8:o=p.createBinary(l.BinaryOp.XorI64,r,i);break;case 9:case 4:o=p.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(c.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,h.operatorTokenToString(e.operator),this.currentType.toString()),p.createUnreachable();default:assert(!1),o=p.createUnreachable()}break;case h.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,n,1,0),a=this.currentType,o=p.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=p.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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),i,p.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case h.Token.BAR_BAR:if(r=this.compileExpressionRetainType(d,t,0),n=this.currentType,i=this.compileExpression(m,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=p.createIf(this.makeIsTrueish(p.createTeeLocal(C.index,r),this.currentType),p.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return g?this.compileAssignmentWithValue(d,o,t!=_.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(p.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(u.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(p.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==u.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(u.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=_.Type.void);case u.ElementKind.LOCAL:case u.ElementKind.FIELD:n=s.type;break;case u.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var l=this.resolver.resolveFunction(o,null);if(!l)return this.module.createUnreachable();assert(1==l.signature.parameterTypes.length),n=l.signature.parameterTypes[0];break}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case u.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(4096),h=s.lookupOverload(u.OperatorKind.INDEXED_SET,p);if(!h)return s.lookupOverload(u.OperatorKind.INDEXED_GET,p)?this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==h.signature.parameterTypes.length),n=h.signature.parameterTypes[1];break}default:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=_.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=_.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 u.ElementKind.LOCAL:var a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=_.Type.void),this.currentType=r?a:_.Type.void,i.is(p.CommonFlags.CONST))return this.error(c.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(),l=i.internalName;return n.createBlock(null,[n.createSetGlobal(l,t),n.createGetGlobal(l,o)],o)}return n.createSetGlobal(i.internalName,t);case u.ElementKind.FIELD:var h=i.declaration;if(i.is(p.CommonFlags.READONLY)&&!this.currentFunction.is(p.CommonFlags.CONSTRUCTOR)&&null!=h&&null==h.initializer)return this.error(c.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),m=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:_.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(b=this.currentFunction).flow;var g=b.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(a.byteSize,m,n.createGetLocal(g,o),o,i.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(a.byteSize,m,t,o,i.memoryOffset);case u.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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(f,[m,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(p.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),g=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(f,[n.createTeeLocal(g,m),t]),this.makeCallDirect(T,[n.createGetLocal(g,I)])],I)}return n.createBlock(null,[this.makeCallDirect(f,[t]),this.makeCallDirect(T)],I)}return this.error(c.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case u.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(u.OperatorKind.INDEXED_GET,A);if(!C)return this.error(c.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(u.OperatorKind.INDEXED_SET,A);if(!N)return this.error(c.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:_.Type.void,n.createUnreachable();var O=i.type,S=(d=assert(this.resolver.currentThisExpression),m=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,_.Type.i32,1,0));if(r){var b,L=(b=this.currentFunction).getTempLocal(O,!1),k=b.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(L),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(L.index,m),n.createTeeLocal(k.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(L.index,L.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[m,S,t])}}return this.error(c.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 u.ElementKind.FUNCTION_PROTOTYPE:var o=s,l=e.typeArguments;if(o.hasDecorator(u.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var h=null;if(l){if(!o.is(p.CommonFlags.GENERIC))return this.error(c.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();h=this.resolver.resolveFunctionInclTypeArguments(o,l,m.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(p.CommonFlags.GENERIC)){for(var g=new Map,y=assert(o.declaration.typeParameters),f=y.length,E=0;Es&&!i)||(this.error(c.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(p.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(c.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var l=n?a+1:a,u=new Array(l),h=0;n&&(u[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(c.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,h=e.is(p.CommonFlags.INSTANCE),d=r.requiredParameters,m=d,g=i.length,y=g;h&&(++m,++y);var f=assert(y-m),E=new Array(m),T=0,I=this.module;h&&(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(p.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 u.ElementKind.GLOBAL:if(!this.compileGlobal(f))return this.module.createUnreachable();var I=f.type;return assert(I!=_.Type.void),f.is(p.CommonFlags.INLINED)?this.compileInlineConstant(f,t,r):(this.currentType=I,this.module.createGetGlobal(f.internalName,I.toNativeType()));case u.ElementKind.ENUMVALUE:return f.is(p.CommonFlags.COMPILED)?(this.currentType=_.Type.i32,f.is(p.CommonFlags.INLINED)?this.module.createI32(f.constantValue):this.module.createGetGlobal(f.internalName,1)):(this.error(c.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=_.Type.i32,this.module.createUnreachable());case u.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(f,null,m.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(c.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=_.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?l.BinaryOp.NeI64:l.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(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==_.Type.f32?n.createF32(a):(this.currentType=_.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;switch(r&&(s=i64_sub(i64_new(0),s)),t.kind){case 0:if(i64_is_i8(s))return n.createI32(i64_low(s));break;case 5:if(i64_is_u8(s))return n.createI32(i64_low(s));break;case 1:if(i64_is_i16(s))return n.createI32(i64_low(s));break;case 6:if(i64_is_u16(s))return n.createI32(i64_low(s));break;case 2:if(i64_is_i32(s))return n.createI32(i64_low(s));break;case 7:if(i64_is_u32(s))return n.createI32(i64_low(s));break;case 10:if(i64_is_bool(s))return n.createI32(i64_low(s));break;case 4:if(!this.options.isWasm64){if(i64_is_i32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64){if(i64_is_u32(s))return n.createI32(i64_low(s));break}return n.createI64(i64_low(s),i64_high(s));case 3:case 8:return n.createI64(i64_low(s),i64_high(s));case 11:if(i64_is_f32(s))return n.createF32(i64_to_f32(s));break;case 12:if(i64_is_f64(s))return n.createF64(i64_to_f64(s));break;case 13:break;default:return assert(!1),n.createUnreachable()}return i64_is_i32(s)?(this.currentType=_.Type.i32,n.createI32(i64_low(s))):i64_is_u32(s)?(this.currentType=_.Type.u32,n.createI32(i64_low(s))):(this.currentType=_.Type.i64,n.createI64(i64_low(s),i64_high(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(c.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 c=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*c,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(o.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(c,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(c.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PRIVATE))return this.error(c.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(p.CommonFlags.PROTECTED))return this.error(c.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,l=e.values,h=n.members,d=!1,_=new Array(s+2),m=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==l.length);for(var g=0,y=s;g=0);var l=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),l,i.type.toNativeType(),i.memoryOffset);case u.ElementKind.PROPERTY:return this.compileGetter(i,e);case u.ElementKind.FUNCTION_PROTOTYPE:return this.error(c.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(c.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(p.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&u.DecoratorFlags.INLINE);if(n.is(p.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==u.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),l=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,l,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(c.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,_.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(p.CommonFlags.GENERIC|p.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(l.getExpressionId(o)==l.ExpressionId.Const&&1==l.getExpressionType(o))return l.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,_.Type.bool,0),this.currentType)}var u=a.fork();i.flow=u;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;u.free();var m=a.fork();i.flow=m;var g=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=m.free(),a.inheritMutual(u,m);var f=_.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(c.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==_.Type.void?_.Type.i32:t,0,0);if(l.getExpressionId(i)==l.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=_.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case h.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case h.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(l.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var d,m;if(d=this.currentType.classReference)if(m=d.lookupOverload(u.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(m,e.operand,i,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:p=this.options;a=r.createBinary(p.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(l.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(l.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(l.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=_.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 h.Token.PLUS:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case h.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==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(l.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(l.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.AddI64:l.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.SubI64:l.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(l.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(l.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=_.Type.bool;break;case h.Token.TILDE:if(r=this.compileExpression(e.operand,t==_.Type.void?_.Type.i32:t.is(8)?_.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(u.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(c.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(l.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?l.BinaryOp.XorI64:l.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(l.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case h.Token.TYPEOF:return this.error(c.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=_.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(l.UnaryOp.ExtendI8ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(l.UnaryOp.ExtendI16ToI32,e):r.createBinary(l.BinaryOp.ShrI32,r.createBinary(l.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(l.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(l.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(l.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(l.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?l.UnaryOp.EqzI64:l.UnaryOp.EqzI32,e);case 11:return r.createBinary(l.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(l.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(l.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(l.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(l.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(l.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,a=this.module,s=this.currentFunction,c=this.options.nativeSizeType,l=s.getTempLocal(e.type,!1),h=new Array;if(h.push(a.createSetLocal(l.index,o.compileAllocate(this,e,t))),e.members)try{for(var d=i(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==u.ElementKind.FIELD){var g=m,y=g.type,f=y.toNativeType(),E=g.prototype.declaration;if(assert(!g.isAny(p.CommonFlags.CONST)),E.initializer)h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),this.compileExpression(E.initializer,y,1,0),f,g.memoryOffset));else{var T=g.prototype.declaration.parameterIndex;h.push(a.createStore(y.byteSize,a.createGetLocal(l.index,c),T>=0?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n handledRoot: boolean = false;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(json);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n "),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }");var s=t.filter(function(e){return!(e.type.toString()in r.typeMapping)});this.sb.push("\n pushObject(name: string): bool {"),this.sb.push("if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }"),this.generatePushHandler(e,s.filter(function(e){return!r.isArrayType(e.type)})),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,s.filter(function(e){return r.isArrayType(e.type)})),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+".push(value);\n }\n setNull(name: string): void {\n "+e+".push(<"+t+">null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"null","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n handledRoot: boolean = false;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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?a.createGetLocal(1+T,f):y.toNativeZero(a),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return h.push(a.createGetLocal(l.index,c)),s.freeTempLocal(l),this.currentType=e.type,a.createBlock(null,h,c)},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(l.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}(c.DiagnosticEmitter);function T(e,t){if(y=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(u.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?(f=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(y=f,f=a.value,i.length>2&&r.error(c.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(c.DiagnosticCode.String_literal_expected,a.range))):r.error(c.DiagnosticCode.String_literal_expected,a.range)}else r.error(c.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=E},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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 s,o=r(1),c=r(4),l=r(3),p=r(6),u=r(0),h=r(2);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var d=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.currentTypeIsPlaceholder=!1,r.program=t,r}return n(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=s.REPORT),e.kind==l.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==l.NodeKind.TYPE);var i=e,a=i.name.text,d=a,_=i.range.source.internalPath+u.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(d)))switch(g.kind){case c.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):p.Type.i32;case c.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,h.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",d+="<"+C+">")}else if(t){var N=t.get(d);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(d)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==s.REPORT&&this.error(o.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 p.Type.i32;case 4:if(!this.program.options.isWasm64)return p.Type.i32;case 3:return p.Type.i64;case 5:case 6:case 7:case 10:return p.Type.u32;case 9:if(!this.program.options.isWasm64)return p.Type.u32;case 8:return p.Type.u64;case 11:return p.Type.f32;case 12:return p.Type.f64;case 13:return p.Type.void;default:assert(!1)}}return r==s.REPORT&&this.error(o.DiagnosticCode.Cannot_find_name_0,i.name.range,d),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=s.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,o=a.length,c=new Array(o),u=new Array(o),h=0,d=!1,_=0;_c)return this.error(o.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?l.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var U=new c.Function(e,B,D,v||y,r);return d||e.instances.set(a,d=new Map),d.set(o,U),this.program.instancesLookup.set(B,U),U},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=s.REPORT),assert(e.is(u.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=p.typesToString(t),o=new c.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+u.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return o.flags=e.flags,o.operatorKind=e.operatorKind,o.classTypeArguments=t,o.instances=e.instances,o},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=s.REPORT);var a=null;if(e.is(u.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==s.REPORT&&this.error(o.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 d,_,m,g,y,f;void 0===r&&(r=h.makeMap()),void 0===n&&(n=s.REPORT);var E=t?p.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",L+="<"+E+">"),(T=new c.Class(e,b,L,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(L,T);var k=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=i(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){d={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(d)throw d.error}}}k=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,h.makeMap(),n)}if(e.instanceMembers)try{for(var U=i(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case c.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(u.CommonFlags.PRIVATE)&&(assert(K.kind==c.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(o.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new c.Field(w,L+u.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 c.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var H=this.resolveFunctionPartially(w,t,n);if(!H)return null;H.internalName=L+u.INSTANCE_DELIMITER+H.simpleName,T.members.set(w.simpleName,H);break;case c.ElementKind.PROPERTY:T.members||(T.members=new Map);var V=assert(w.getterPrototype),X=w.setterPrototype,W=new c.Property(this.program,w.simpleName,L+u.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(V,t,n);if(!Y)return null;if(Y.internalName=L+u.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=L+u.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=k;try{for(var q=i(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=a(j.value,2),J=Z[0],$=Z[1];assert(J!=c.OperatorKind.INVALID);var ee=void 0;if($.is(u.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,h.makeMap(),n)}else ee=this.resolveFunction($,null,h.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=s.REPORT);var a=null;if(e.is(u.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==s.REPORT&&this.error(o.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(o.DiagnosticEmitter);t.Resolver=d},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=this&&this.__extends||function(){var e=function(t,r){return(e=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])})(t,r)};return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}}(),i=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}}}},a=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},s=this&&this.__spread||function(){for(var e=[],t=0;t;\n handledRoot: boolean = false;\n "),r.parameterNames?(n.forEach(function(e){t.sb.push("__near_param_"+e.simpleName+": "+e.type+";")}),this.generateHandlerMethods("this.__near_param_",n)):this.generateHandlerMethods("this.__near_param_",[]),this.sb.push("}")},t.prototype.generateWrapperFunction=function(e){var t=e.signature,r=t.returnType;this.generateEncodeFunction(r),this.sb.push("export function near_func_"+e.simpleName+"(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_"+e.simpleName+"();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_"+e.simpleName+">(handler);\n handler.decoder.deserialize(json);"),"void"!=r.toString()?this.sb.push("let result = "+e.simpleName+"("):this.sb.push(e.simpleName+"("),t.parameterNames&&this.sb.push(t.parameterNames.map(function(e){return"handler.__near_param_"+e}).join(",")),this.sb.push(");"),"void"!=r.toString()&&(this.sb.push("\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n "),this.generateFieldEncoder(r,'"result"',"result"),this.sb.push("\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n ")),this.sb.push("}")},t.prototype.generateHandlerMethods=function(e,t){var r=this,n=function(n){var a=i.typeMapping[n],s=t.filter(function(e){return e.type.toString()==n});s.length>0&&(i.sb.push("set"+a+"(name: string, value: "+n+"): void {"),s.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = value;\n return;\n }")}),i.sb.push("\n super.set"+a+"(name, value);\n }"))},i=this;for(var a in this.typeMapping)n(a);this.sb.push("setNull(name: string): void {"),t.forEach(function(t){r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = <"+t.type.toString()+">null;\n return;\n }")}),this.sb.push("\n super.setNull(name);\n }");var s=t.filter(function(e){return!(e.type.toString()in r.typeMapping)});this.sb.push("\n pushObject(name: string): bool {"),this.sb.push("if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }"),this.generatePushHandler(e,s.filter(function(e){return!r.isArrayType(e.type)})),this.sb.push("\n return super.pushObject(name);\n }"),this.sb.push("\n pushArray(name: string): bool {"),this.generatePushHandler(e,s.filter(function(e){return r.isArrayType(e.type)})),this.sb.push("\n return super.pushArray(name);\n }")},t.prototype.generatePushHandler=function(e,t){var r=this;t.forEach(function(t){t.type.toString()in r.typeMapping||r.sb.push('if (name == "'+t.simpleName+'") {\n '+e+t.simpleName+" = __near_decode_"+r.encodeType(t.type)+"(this.buffer, this.decoder.state);\n return false;\n }")})},t.prototype.generateArrayHandlerMethods=function(e,t){var r=this.typeMapping[t.toString()];r?this.sb.push("set"+r+"(name: string, value: "+t+"): void {\n "+e+".push(value);\n }\n setNull(name: string): void {\n "+e+".push(<"+t+">null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }"):this.sb.push("pushObject(name: string): bool {\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n "+e+".push(__near_decode_"+this.encodeType(t)+"(this.buffer, this.decoder.state));\n return false;\n }")},t.prototype.generateEncodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedEncodeFunctions.has(r)||r in this.typeMapping||(this.generatedEncodeFunctions.add(r),this.isArrayType(e)?(this.generateEncodeFunction(e.classReference.typeArguments[0]),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.sb.push("for (let i = 0; i < value.length; i++) {"),this.generateFieldEncoder(e.classReference.typeArguments[0],"null","value[i]"),this.sb.push("}")):(this.getFields(e.classReference).forEach(function(e){t.generateEncodeFunction(e.type)}),this.sb.push("export function __near_encode_"+r+"(\n value: "+e.toString()+",\n encoder: JSONEncoder): void {"),this.getFields(e.classReference).forEach(function(e){var r=e.type,n=e.simpleName,i="value."+n;t.generateFieldEncoder(r,'"'+n+'"',i)})),this.sb.push("}"))}},t.prototype.generateHandler=function(e){var t=this.encodeType(e);this.sb.push("export class __near_JSONHandler_"+t+" extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_"+t+">;\n handledRoot: boolean = false;\n value: "+e+" = new "+e+"();"),this.isArrayType(e)?this.generateArrayHandlerMethods("this.value",e.classReference.typeArguments[0]):this.generateHandlerMethods("this.value.",this.getFields(e.classReference)),this.sb.push("}\n")},t.prototype.generateDecodeFunction=function(e){var t=this;if(e.classReference){var r=this.encodeType(e);this.generatedDecodeFunctions.has(r)||r in this.typeMapping||(this.generatedDecodeFunctions.add(r),this.generateHandler(e),this.isArrayType(e)?this.generateDecodeFunction(e.classReference.typeArguments[0]):this.getFields(e.classReference).forEach(function(e){t.generateDecodeFunction(e.type)}),this.sb.push("export function __near_decode_"+r+"(\n buffer: Uint8Array, state: DecoderState): "+e+" {\n let handler = new __near_JSONHandler_"+r+"();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_"+r+">(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\n"))}},t.prototype.generateFieldEncoder=function(e,t,r){var n=this.typeMapping[e.toString()];if(n)-1!=this.nonNullableTypes.indexOf(e.toString())?this.sb.push("encoder.set"+n+"("+t+", "+r+");"):this.sb.push("if ("+r+" != null) {\n encoder.set"+n+"("+t+", "+r+");\n } else {\n encoder.setNull("+t+");\n }");else{var i=this.isArrayType(e)?"Array":"Object";this.sb.push("if ("+r+" != null) {\n encoder.push"+i+"("+t+");\n __near_encode_"+this.encodeType(e)+"("+r+", encoder);\n encoder.pop"+i+"();\n } else {\n encoder.setNull("+t+");\n }")}},t.prototype.encodeType=function(e){return e.toString().replace(/_/g,"__").replace(/>/g,"").replace(/"),null}if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=l.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(o.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=l.Node.createType(l.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,c=!1;if(e.skip(s.Token.CLOSEPAREN))c=!0,e.discard(r),i=[];else{c=!1;do{var p=l.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(c=!0,e.discard(r),p=l.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;c=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return c?this.error(o.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=c,null;var h=l.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(c=!0,e.discard(r),p==l.ParameterKind.REST?this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):p=l.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){c=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=c,null;var _=new l.ParameterNode;_.parameterKind=p,_.name=h,_.type=d,i?i.push(_):i=[_]}else c&&this.error(o.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return c?this.error(o.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=c,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(c=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,l.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=c,null)):(c?this.error(o.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=c,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=l.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=l.Node.createPropertyAccessExpression(n,l.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return l.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return l.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(o.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=l.Node.createVariableStatement(i,r,t,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var n=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),a=t;e.skip(s.Token.EXCLAMATION)&&(a|=i.CommonFlags.DEFINITE_ASSIGNMENT);var c=null;e.skip(s.Token.COLON)&&(c=this.parseType(e));var p=null;if(e.skip(s.Token.EQUALS)){if(a&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(p=this.parseExpression(e,2)))return null}else a&i.CommonFlags.CONST?a&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode._const_declarations_must_be_initialized,n.range):c||this.error(o.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return a&i.CommonFlags.DEFINITE_ASSIGNMENT&&p&&this.error(o.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),l.Node.createVariableDeclaration(n,c,p,r,a,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;for(var c=new Array;!e.skip(s.Token.CLOSEBRACE);){var p=this.parseEnumValue(e,i.CommonFlags.NONE);if(!p)return null;if(c.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(o.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=l.Node.createEnumDeclaration(a,c,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(o.DiagnosticCode.Identifier_expected,e.range()),null;var r=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:l.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=l.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(o.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(o.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(o.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=l.NodeKind.TYPE)return this.error(o.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!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return l.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(o.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,c=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;if(!(c=this.parseType(e)))return null;if(c.kind==l.NodeKind.TYPE?this.parseParametersThis=c:this.error(o.DiagnosticCode.Operation_not_supported,c.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(o.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var p=this.parseParameter(e,t);if(!p)return null;switch(n&&!a&&(this.error(o.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),p.parameterKind){default:i&&this.error(o.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,p.name.range);break;case l.ParameterKind.OPTIONAL:i=!0;break;case l.ParameterKind.REST:n=p}if(r.push(p),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(o.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,a=null,c=i.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(a=e.range(),c|=i.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(a=e.range(),c|=i.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(a=e.range(),c|=i.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var p=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(p),a||(a=e.range()),c|=i.CommonFlags.READONLY):e.reset(p)}if(e.skip(s.Token.DOT_DOT_DOT)&&(c?this.error(o.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):a=e.range(),r=!0),e.skipIdentifier()){r||(a=e.range());var u=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=l.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(o.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(o.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=l.Node.createParameter(u,h,d,r?l.ParameterKind.REST:n?l.ParameterKind.OPTIONAL:l.ParameterKind.DEFAULT,s.Range.join(a,e.range()));return _.flags|=c,_}return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var a=l.Node.createIdentifierExpression(e.readIdentifier(),e.range()),c=-1,p=null;if(e.skip(s.Token.LESSTHAN)){if(c=e.tokenPos,!(p=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null;c<0&&(c=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&i.CommonFlags.SET);d&&(1!=u.length&&this.error(o.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,a.range),u.length&&u[0].initializer&&this.error(o.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,a.range)),t&i.CommonFlags.GET&&u.length&&this.error(o.DiagnosticCode.A_get_accessor_cannot_have_parameters,a.range);var _=null;if(e.skip(s.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=l.Node.createOmittedType(e.range(e.pos)),d||this.error(o.DiagnosticCode.Type_expected,_.range));var m=l.Node.createSignature(u,_,h,!1,e.range(c,e.pos)),g=null;if(e.skip(s.Token.OPENBRACE)){if(t&i.CommonFlags.AMBIENT&&this.error(o.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&i.CommonFlags.AMBIENT||this.error(o.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=l.Node.createFunctionDeclaration(a,p,m,g,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=l.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,a,c){void 0===a&&(a=-1),void 0===c&&(c=-1),a<0&&(a=t.range.start),c<0&&(c=a);var p=null;if(e.skip(s.Token.COLON)){if(!(p=this.parseType(e)))return null}else p=l.Node.createOmittedType(e.range(e.pos)),this.error(o.DiagnosticCode.Type_expected,p.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=l.Node.createSignature(r,p,null,!1,e.range(c,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=l.Node.createFunctionDeclaration(t,null,h,u,null,n?i.CommonFlags.ARROW:i.CommonFlags.NONE,e.range(a,e.pos));return l.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var a=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;var c,p=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(s.Token.LESSTHAN)){if(!(c=this.parseTypeParameters(e)))return null;t|=i.CommonFlags.GENERIC}else c=[];var u=null;if(e.skip(s.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=l.NodeKind.TYPE)return this.error(o.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(s.Token.IMPLEMENTS)){a&&this.error(o.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;a||(d||(d=[]),d.push(_))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(a?(assert(!d),m=l.Node.createInterfaceDeclaration(p,c,u,g,r,t,e.range(n,e.pos))):m=l.Node.createClassDeclaration(p,c,u,d,g,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(s.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?l.Node.createIdentifierExpression(e.readIdentifier(),e.range()):l.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(o.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,a=l.Node.createClassDeclaration(t,[],null,null,n,null,i.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var c=this.parseClassMember(e,a);if(!c)return null;c.parent=a,n.push(c)}while(!e.skip(s.Token.CLOSEBRACE));return l.Node.createClassExpression(a)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==l.NodeKind.INTERFACEDECLARATION,a=new Array;if(e.skip(s.Token.AT)){do{var c=this.parseDecorator(e);if(!c)break;a.push(c)}while(e.skip(s.Token.AT));n&&this.error(o.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(a[0].range,a[a.length-1].range))}var p=t.flags&i.CommonFlags.AMBIENT;n&&(p|=i.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(s.Token.PUBLIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),p|=i.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),p|=i.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),p|=i.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(s.Token.STATIC)?(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),p|=i.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(p|=i.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),p|=i.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&i.CommonFlags.GENERIC&&(p|=i.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(s.Token.READONLY)&&(p|=i.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(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(p|=i.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(p|=i.CommonFlags.CONSTRUCTOR)&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=l.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(s.Token.OPENBRACKET)){p&i.CommonFlags.PUBLIC?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):p&i.CommonFlags.PROTECTED?this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):p&i.CommonFlags.PRIVATE&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),p&i.CommonFlags.STATIC&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),p&i.CommonFlags.ABSTRACT&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),p&i.CommonFlags.READONLY&&this.error(o.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,a);return O?(e.skip(s.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(o.DiagnosticCode.Identifier_expected,e.range()),null;E=l.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(s.Token.LESSTHAN)){var b=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(o.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(b,e.pos)):v||A?this.error(o.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(b,e.pos)):p|=i.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var L=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 s.Token.IDENTIFIER:return l.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return l.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return l.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return l.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return l.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return l.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return l.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var E=e.readRegexpPattern();return e.skip(s.Token.SLASH)?l.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(o.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(o.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(o.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(o.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,c=null;(i=u(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var p=this.parseType(e);if(!p)return null;r=l.Node.createAssertionExpression(l.AssertionKind.AS,r,p,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var d=this.parseType(e);if(!d)return null;r=l.Node.createInstanceOfExpression(r,d,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(c=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(o.DiagnosticCode._0_expected,e.range(),"]"),null;r=l.Node.createElementAccessExpression(r,c,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=l.NodeKind.IDENTIFIER&&r.kind!=l.NodeKind.ELEMENTACCESS&&r.kind!=l.NodeKind.PROPERTYACCESS&&this.error(o.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=l.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(s.Token.COLON))return this.error(o.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=l.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case s.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(s.Token.COMMA));r=l.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())c=l.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;if(c.kind==l.NodeKind.IDENTIFIER)r=l.Node.createPropertyAccessExpression(r,c,e.range(a,e.pos));else{if(c.kind!=l.NodeKind.CALL)return this.error(o.DiagnosticCode.Identifier_expected,c.range),null;if(!(r=this.joinPropertyCall(e,a,r,c)))return null}}else{if(!(c=this.parseExpression(e,h(n)?i:i+1)))return null;r=l.Node.createBinaryExpression(n,r,c,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 l.NodeKind.IDENTIFIER:n.expression=l.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case l.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(o.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(l.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||l.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=l.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(o.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}(o.DiagnosticEmitter);function u(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: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=p,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(7))},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:0,writable:!1},MAX_VALUE:{value:1,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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},POSITIVE_INFINITY:{value:1/0,writable:!1},NEGATIVE_INFINITY:{value:-1/0,writable:!1},NaN:{value:NaN,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.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},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)}}})(),t.store=t.__store||function(e,t,r){HEAP[e+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[e+(0|t)]}}).call(this,r(7))},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(7))},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(7))},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)));else 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(6),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(R=I.classReference){var v=e.program.stringInstance;if(v&&R.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!==(R=I.classReference)&&null!==R.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,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===(R=I.classReference)||R.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=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI32,T.createI32(0),T.createGetLocal(N.index,1)),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(N.index,1),T.createI32(0)));break;case 4:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(e.options.isWasm64?o.BinaryOp.SubI64:o.BinaryOp.SubI32,e.options.usizeType.toNativeZero(T),T.createGetLocal(N.index,e.options.nativeSizeType)),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(N.index,e.options.nativeSizeType),e.options.usizeType.toNativeZero(T)));break;case 3:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createSelect(T.createTeeLocal(N.index,g),T.createBinary(o.BinaryOp.SubI64,T.createI64(0,0),T.createGetLocal(N.index,2)),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(N.index,2),T.createI64(0,0)));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 O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 5:case 6:case 7:case 10:O=e.currentFunction.flow,S=e.currentFunction.getTempLocal(e.currentType,!O.canOverflow(g,e.currentType)),b=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(S.index,1),T.createGetLocal(b.index,1)));break;case 3:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 8:S=e.currentFunction.getTempLocal(s.Type.i64,!1),b=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(S.index,2),T.createGetLocal(b.index,2)));break;case 4:S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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}S=e.currentFunction.getTempLocal(e.options.usizeType,!1),b=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(S),E=T.createSelect(T.createTeeLocal(S.index,g),T.createTeeLocal(b.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(S.index,e.options.nativeSizeType),T.createGetLocal(b.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),(x=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(),x))):(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 R;if(!(R=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var x=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 F=n[0].value,D=R.members?R.members.get(F):null;if(!D||D.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,R.internalName,F),T.createUnreachable();x=D.memoryOffset}else x=R.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(x)):T.createI64(x):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(x)):T.createI32(x);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 B=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),B);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),B);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),B);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),B);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),B);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:O=e.currentFunction.flow,N=e.currentFunction.getAndFreeTempLocal(e.currentType,!O.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 2:case 7:default:N=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(N.index,g),T.createGetLocal(N.index,1),B);break;case 3:case 8:N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,2));break;case 4:case 9:N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(N.index,g)),B,T.createGetLocal(N.index,e.options.nativeSizeType));break;case 11:N=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(N.index,g),T.createF32(0)),B,T.createGetLocal(N.index,3));break;case 12:N=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(N.index,g),T.createF64(0)),B,T.createGetLocal(N.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=B}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()):((O=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),O.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 U=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();U=r[0]}else U=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 P=n.length-1,w=new Array(P),M=new Array(P+1),G=U.toNativeType(),K=new Array(P),z=0;z void"),T.createUnreachable())}var q=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 q?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),q):(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 b=t.internalName+"~gc";return m.addFunction(b,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=b,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&&function(e){return!(e<0||e>65535)&&a(e,n)}(e)},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&&function(e){return!(e<0||e>65535)&&a(e,i)}(e)};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--;\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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n handledRoot: boolean = false;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(json);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n `);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping));\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.sb.push(`if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}.push(value);\n }\n setNull(name: string): void {\n ${valuePrefix}.push(<${fieldType}>null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"null\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n handledRoot: boolean = false;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n this.sb.push(`\n import { near } from \"./near\";\n import { JSONEncoder} from \"./json/encoder\"\n import { JSONDecoder, ThrowingJSONHandler, DecoderState } from \"./json/decoder\"\n `);\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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 +{"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/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/tokenizer.ts","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","CALL","ELEMENTACCESS","PROPERTYACCESS","PARENTHESIZED","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","ASSERTION","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","SUPER","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","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","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","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","cachedTemporaryName","hasTemporaryFunction","cachedPrecomputeName","cachedPrecomputeNames","_BinaryenModuleCreate","cachedByValue","memory","allocate","createFrom","cArr","allocU8Array","_BinaryenModuleRead","changetype","addFunctionType","result","paramTypes","cStr","allocString","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","_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","_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","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","str","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Return","Break","numChildren","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","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","eval","e","window","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","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","numPages","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","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","isConstructor","stmts","compileStatements","unshift","makeConditionalAllocate","A_function_whose_declared_type_is_not_void_must_return_a_value","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","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","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","parentBase","thisLocal","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","scopedThis","_this_cannot_be_referenced_in_current_location","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","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","i64_is_f32","i64_to_f32","i64_is_f64","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","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","compileAllocate","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","classInstance","compileInstantiate","currentClassInstance","makeAllocate","propertyAccess","resolvePropertyAccess","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","fieldType","nativeFieldType","fieldDeclaration","ReportMode","currentTypeIsPlaceholder","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","contextualFunction","targetExpression","propertyName","elementAccess","explicitLocal","functionTarget","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClass","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","NEARBindingsBuilder","typeMapping","nonNullableTypes","generatedEncodeFunctions","generatedDecodeFunctions","build","generateArgsParser","generateWrapperFunction","fields","paramName","forEach","generateDecodeFunction","generateHandlerMethods","generateEncodeFunction","generateFieldEncoder","valuePrefix","setterType","this_1","matchingFields","filter","nonBasicFields","generatePushHandler","isArrayType","encodeType","generateArrayHandlerMethods","getFields","sourceExpr","generateHandler","fieldExpr","indexOf","pushType","__spread","visitInterface","mainSource","IDLBuilder","indentLevel","indent","typeToString","members_1","members_1_1","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","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","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","PREFIX","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","POSITIVE_INFINITY","Infinity","NEGATIVE_INFINITY","NaN","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","copy","dest","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","gte","lte","minSafeF64","maxSafeF64","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","tempLocal0","tempLocal1","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","allocateInstance","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","isUnicodeIdentifierStart","unicodeIdentifierPart","isUnicodeIdentifierPart","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","buildNEAR"],"mappings":"CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,EAAAG,QAAA,aACA,mBAAAC,eAAAC,IACAD,QAAA,YAAAJ,GACA,iBAAAC,QACAA,QAAA,eAAAD,EAAAG,QAAA,aAEAJ,EAAA,eAAAC,EAAAD,EAAA,UARA,CASC,oBAAAO,UAAAC,KAAA,SAAAC,GACD,mBCTA,IAAAC,KAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAV,QAGA,IAAAC,EAAAO,EAAAE,IACAC,EAAAD,EACAE,GAAA,EACAZ,YAUA,OANAa,EAAAH,GAAAI,KAAAb,EAAAD,QAAAC,IAAAD,QAAAS,GAGAR,EAAAW,GAAA,EAGAX,EAAAD,QA0DA,OArDAS,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAjB,EAAAkB,EAAAC,GACAV,EAAAW,EAAApB,EAAAkB,IACAG,OAAAC,eAAAtB,EAAAkB,GAA0CK,YAAA,EAAAC,IAAAL,KAK1CV,EAAAgB,EAAA,SAAAzB,GACA,oBAAA0B,eAAAC,aACAN,OAAAC,eAAAtB,EAAA0B,OAAAC,aAAwDC,MAAA,WAExDP,OAAAC,eAAAtB,EAAA,cAAiD4B,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,SAAAnC,GACA,IAAAkB,EAAAlB,KAAA8B,WACA,WAA2B,OAAA9B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAQ,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD7B,EAAAgC,EAAA,GAIAhC,IAAAiC,EAAA,oFC5EA,SAAYC,GAEVA,IAAA,eAKAA,IAAA,mBAEAA,IAAA,mBAEAA,IAAA,qBAEAA,IAAA,iBAEAA,IAAA,cAEAA,IAAA,oBAEAA,IAAA,wBAEAA,IAAA,yBAEAA,IAAA,qBAEAA,IAAA,uBAEAA,IAAA,4BAEAA,IAAA,gBAEAA,IAAA,gBAEAA,IAAA,gDAKAA,IAAA,yBAEAA,IAAA,yBAEAA,IAAA,yCAEAA,IAAA,4BAEAA,IAAA,kCAEAA,IAAA,sBAEAA,IAAA,uCAEAA,IAAA,uCAKAA,IAAA,6BAEAA,IAAA,6BAEAA,IAAA,4BAEAA,IAAA,0BAEAA,IAAA,kCAEAA,IAAA,6BAEAA,IAAA,uBAIAA,IAAA,2BAzEF,CAAY3C,EAAA2C,cAAA3C,EAAA2C,iBA6EC3C,EAAA4C,eAAiB,IAEjB5C,EAAA6C,aAAe,KAEf7C,EAAA8C,cAAgB,OAEhB9C,EAAA+C,cAAgB,OAEhB/C,EAAAgD,mBAAqB,IAErBhD,EAAAiD,iBAAmB,IAEnBjD,EAAAkD,gBAAkB,IAElBlD,EAAAmD,cAAgB,OAEhBnD,EAAAoD,eAAiBpD,EAAAmD,cAAgBnD,EAAA4C,eAEjC5C,EAAAqD,iBAAmB,uFC3FhC,IAeYC,EAfZC,EAAA9C,EAAA,IAKA+C,EAAA/C,EAAA,GAIAgD,EAAAhD,EAAA,IAgBA,SAAgBiD,EAA2BC,GACzC,OAAQA,GACN,KAAKL,EAAmBM,KAAM,MAAO,OACrC,KAAKN,EAAmBO,QAAS,MAAO,UACxC,KAAKP,EAAmBQ,MAAO,MAAO,QACtC,QAEE,OADAC,QAAO,GACA,IAeb,SAAgBC,EAA0BL,GACxC,OAAQA,GACN,KAAKL,EAAmBM,KAAM,OAAO5D,EAAAiE,WACrC,KAAKX,EAAmBO,QAAS,OAAO7D,EAAAkE,aACxC,KAAKZ,EAAmBQ,MAAO,OAAO9D,EAAAmE,UACtC,QAEE,OADAJ,QAAO,GACA,IA5CX/D,EAAAoE,eAAAX,EAAAW,eACApE,EAAAqE,uBAAAZ,EAAAY,uBAIF,SAAYf,GAEVA,IAAA,eAEAA,IAAA,qBAEAA,IAAA,iBANF,CAAYA,EAAAtD,EAAAsD,qBAAAtD,EAAAsD,wBAUZtD,EAAA0D,6BAaa1D,EAAAiE,WAAqB,QAErBjE,EAAAkE,aAAuB,QAEvBlE,EAAAmE,UAAoB,QAEpBnE,EAAAsE,YAAsB,OAGnCtE,EAAAgE,4BAaA,IAAAO,EAAA,WAYE,SAAAA,EAAoBC,EAAWb,EAA8Bc,GAH7DnE,KAAAoE,MAAsB,KAIpBpE,KAAKkE,KAAOA,EACZlE,KAAKqD,SAAWA,EAChBrD,KAAKmE,QAAUA,EA4EnB,OAxESF,EAAAtC,OAAP,SACEuC,EACAb,EACAgB,EACAC,EACAC,QAFA,IAAAF,MAAA,WACA,IAAAC,MAAA,WACA,IAAAC,MAAA,MAEA,IAAIJ,EAAUlB,EAAAc,uBAAuBG,GAIrC,OAHY,MAARG,IAAcF,EAAUA,EAAQK,QAAQ,MAAOH,IACvC,MAARC,IAAcH,EAAUA,EAAQK,QAAQ,MAAOF,IACvC,MAARC,IAAcJ,EAAUA,EAAQK,QAAQ,MAAOD,IAC5C,IAAIN,EAAkBC,EAAMb,EAAUc,IAIxCF,EAAAQ,WAAP,SACEP,EACAG,EACAC,GAEA,YAHA,IAAAD,MAAA,WACA,IAAAC,MAAA,MAEOL,EAAkBtC,OAAOuC,EAAMlB,EAAmBM,KAAMe,EAAMC,IAIhEL,EAAAS,cAAP,SACER,EACAG,EACAC,GAEA,YAHA,IAAAD,MAAA,WACA,IAAAC,MAAA,MAEOL,EAAkBtC,OAAOuC,EAAMlB,EAAmBO,QAASc,EAAMC,IAInEL,EAAAU,YAAP,SACET,EACAG,EACAC,GAEA,YAHA,IAAAD,MAAA,WACA,IAAAC,MAAA,MAEOL,EAAkBtC,OAAOuC,EAAMlB,EAAmBQ,MAAOa,EAAMC,IAIxEL,EAAAhC,UAAA2C,UAAA,SAAUR,GAER,OADApE,KAAKoE,MAAQA,EACNpE,MAITiE,EAAAhC,UAAA4C,SAAA,WACE,OAAI7E,KAAKoE,MAELhB,EAA2BpD,KAAKqD,UAChC,IACArD,KAAKkE,KAAKW,SAAS,IACnB,MACA7E,KAAKmE,QACL,QACAnE,KAAKoE,MAAMU,OAAOC,eAClB,IACA/E,KAAKoE,MAAMY,KAAKH,SAAS,IACzB,IACA7E,KAAKoE,MAAMa,OAAOJ,SAAS,IAI7BzB,EAA2BpD,KAAKqD,UAChC,IACArD,KAAKkE,KAAKW,SAAS,IACnB,KACA7E,KAAKmE,SAGXF,EA3FA,GAqIA,SAAgBiB,EAAwBd,EAAce,QAAA,IAAAA,OAAA,GAKpD,IAJA,IAAIC,EAAOhB,EAAMU,OAAOM,KACpBC,EAAMD,EAAKE,OACXC,EAAQnB,EAAMmB,MACdC,EAAMpB,EAAMoB,IACTD,EAAQ,IAAMrC,EAAAuC,YAAYL,EAAKM,WAAWH,EAAQ,KAAKA,IAC9D,KAAOC,EAAMH,IAAQnC,EAAAuC,YAAYL,EAAKM,WAAWF,KAAOA,IAMxD,IALA,IAAIG,GACF,MACAP,EAAKQ,UAAUL,EAAOC,GACtB,OAEKD,EAAQnB,EAAMmB,OACnBI,EAAGE,KAAK,KACRN,IAGF,GADIJ,GAAWQ,EAAGE,KAAKnG,EAAAmE,WACnBO,EAAMmB,OAASnB,EAAMoB,IACvBG,EAAGE,KAAK,UAER,KAAON,IAAUnB,EAAMoB,KAAKG,EAAGE,KAAK,KAGtC,OADIV,GAAWQ,EAAGE,KAAKnG,EAAAsE,aAChB2B,EAAGG,KAAK,IA5JJpG,EAAAuE,oBA8FbvE,EAAAqG,wBAAA,SACE5B,EACAgB,EACAa,QADA,IAAAb,OAAA,QACA,IAAAa,OAAA,GAIA,IAAIL,KAUJ,GATIR,GAAWQ,EAAGE,KAAKnC,EAA0BS,EAAQd,WACzDsC,EAAGE,KAAKzC,EAA2Be,EAAQd,WACvC8B,GAAWQ,EAAGE,KAAKnG,EAAAsE,aACvB2B,EAAGE,KAAK1B,EAAQD,KAAO,IAAO,MAAQ,OACtCyB,EAAGE,KAAK1B,EAAQD,KAAKW,SAAS,KAC9Bc,EAAGE,KAAK,MACRF,EAAGE,KAAK1B,EAAQA,SAGZA,EAAQC,MAAO,CAGjB,IAAIA,EAAQD,EAAQC,MAChB4B,IACFL,EAAGE,KAAK,MACRF,EAAGE,KAAKX,EAAwBf,EAAQC,MAAOe,KAGjDQ,EAAGE,KAAK,MACRF,EAAGE,KAAK,QACRF,EAAGE,KAAKzB,EAAMU,OAAOC,gBACrBY,EAAGE,KAAK,KACRF,EAAGE,KAAKzB,EAAMY,KAAKH,SAAS,KAC5Bc,EAAGE,KAAK,KACRF,EAAGE,KAAKzB,EAAMa,OAAOJ,SAAS,KAC9Bc,EAAGE,KAAK,KAEV,OAAOF,EAAGG,KAAK,KAIjBpG,EAAAwF,0BA2BA,IAAAe,EAAA,WAME,SAAAA,EAAsBC,QAAA,IAAAA,MAAA,MACpBlG,KAAKkG,YAAcA,GAAiD,IAAIC,MAkD5E,OA9CEF,EAAAhE,UAAAmE,eAAA,SACElC,EACAb,EACAe,EACAC,EACAC,EACAC,QAFA,IAAAF,MAAA,WACA,IAAAC,MAAA,WACA,IAAAC,MAAA,MAEA,IAAIJ,EAAUF,EAAkBtC,OAAOuC,EAAMb,EAAUgB,EAAMC,EAAMC,GAAMK,UAAUR,GACnFpE,KAAKkG,YAAYL,KAAK1B,IAMxB8B,EAAAhE,UAAAoE,KAAA,SACEnC,EACAE,EACAC,EACAC,EACAC,QAFA,IAAAF,MAAA,WACA,IAAAC,MAAA,WACA,IAAAC,MAAA,MAEAvE,KAAKoG,eAAelC,EAAMlB,EAAmBM,KAAMc,EAAOC,EAAMC,EAAMC,IAIxE0B,EAAAhE,UAAAqE,QAAA,SACEpC,EACAE,EACAC,EACAC,EACAC,QAFA,IAAAF,MAAA,WACA,IAAAC,MAAA,WACA,IAAAC,MAAA,MAEAvE,KAAKoG,eAAelC,EAAMlB,EAAmBO,QAASa,EAAOC,EAAMC,EAAMC,IAI3E0B,EAAAhE,UAAAsE,MAAA,SACErC,EACAE,EACAC,EACAC,EACAC,QAFA,IAAAF,MAAA,WACA,IAAAC,MAAA,WACA,IAAAC,MAAA,MAEAvE,KAAKoG,eAAelC,EAAMlB,EAAmBQ,MAAOY,EAAOC,EAAMC,EAAMC,IAE3E0B,EAzDA,GAAsBvG,EAAAuG,iKChOtBO,EAAArG,EAAA,KACAqG,EAAArG,EAAA,KACAqG,EAAArG,EAAA,KACAqG,EAAArG,EAAA,KACAqG,EAAArG,EAAA,ybCLA,IAAAsG,EAAAtG,EAAA,GAQAuG,EAAAvG,EAAA,GAYST,EAAAiH,MAXPD,EAAAC,MAWcjH,EAAAkH,MATdF,EAAAE,MAGF,IASYC,EATZ3D,EAAA/C,EAAA,IASA,SAAY0G,GAEVA,IAAA,mBAGAA,IAAA,eACAA,IAAA,iCACAA,IAAA,yBACAA,IAAA,yBAGAA,IAAA,2BACAA,IAAA,yBACAA,IAAA,mBACAA,IAAA,eACAA,IAAA,iBACAA,IAAA,kBACAA,IAAA,kCACAA,IAAA,kBACAA,IAAA,wBACAA,IAAA,4BACAA,IAAA,sBACAA,IAAA,cACAA,IAAA,gBACAA,IAAA,kCACAA,IAAA,oCACAA,IAAA,sBACAA,IAAA,kBACAA,IAAA,gBACAA,IAAA,gBACAA,IAAA,8BACAA,IAAA,gCACAA,IAAA,8BAGAA,IAAA,kBACAA,IAAA,kBACAA,IAAA,wBACAA,IAAA,YACAA,IAAA,kBACAA,IAAA,oBACAA,IAAA,gCACAA,IAAA,4BACAA,IAAA,cACAA,IAAA,YACAA,IAAA,oBACAA,IAAA,oBACAA,IAAA,oBACAA,IAAA,kBACAA,IAAA,cACAA,IAAA,wBACAA,IAAA,gBACAA,IAAA,kBAGAA,IAAA,wCACAA,IAAA,sCACAA,IAAA,gDACAA,IAAA,wCACAA,IAAA,8CACAA,IAAA,0CACAA,IAAA,0DACAA,IAAA,gDACAA,IAAA,0CACAA,IAAA,gDACAA,IAAA,sCACAA,IAAA,8CAGAA,IAAA,0BACAA,IAAA,gCACAA,IAAA,4BACAA,IAAA,sBAxEF,CAAYA,EAAAnH,EAAAmH,WAAAnH,EAAAmH,cA4EZnH,EAAAoH,oBAAA,SAAoCC,GAClC,OAAQA,GACN,KAAKF,EAASG,QACd,KAAKH,EAASI,KACd,KAAKJ,EAASK,KACd,KAAKL,EAASM,MAAO,OAAO,EAE9B,OAAO,GAITzH,EAAA0H,eAAA,SAA+BL,GAC7B,OAAQA,GACN,KAAKF,EAASQ,WACd,KAAKR,EAASS,KACd,KAAKT,EAASU,cACd,KAAKV,EAASW,eACd,KAAKX,EAASY,cAAe,OAAO,EAEtC,OAAO,GAIT/H,EAAAgI,sBAAA,SAAsCX,GACpC,OAAQA,GACN,KAAKF,EAASQ,WACd,KAAKR,EAASW,eAAgB,OAAO,EAEvC,OAAO,GAIT,IAAAG,EAAA,oBAAAA,IAOE3H,KAAA4H,OAAsB,KAEtB5H,KAAA6H,MAAqBpB,EAAApE,YAAYyF,KAi5BnC,OA94BEH,EAAA1F,UAAA8F,GAAA,SAAGC,GAA2B,OAAQhI,KAAK6H,MAAQG,IAASA,GAE5DL,EAAA1F,UAAAgG,MAAA,SAAMD,GAA2B,OAA8B,IAAtBhI,KAAK6H,MAAQG,IAEtDL,EAAA1F,UAAAiG,IAAA,SAAIF,GAA2BhI,KAAK6H,OAASG,GAItCL,EAAAQ,WAAP,SACEvH,EACAwH,EACAC,EACAjE,GAEA,IAAIkE,EAAO,IAAIC,EAKf,OAJAD,EAAKlE,MAAQA,EACbkE,EAAK1H,KAAOA,EAAMA,EAAKgH,OAASU,EAChCA,EAAKF,cAAgBA,EAAmBA,GAAeI,GAAUJ,EAAeE,GAChFA,EAAKD,WAAaA,EACXC,GAGFX,EAAAc,kBAAP,SACErE,GAEA,OAAOuD,EAAKQ,WACVR,EAAKe,2BAA2B,GAAItE,GACpC,MACA,EACAA,IAIGuD,EAAAgB,oBAAP,SACE/H,EACAgI,EACAC,EACAzE,GAEA,IAAI0E,EAAO,IAAIC,EAKf,OAJAD,EAAK1E,MAAQA,EACb0E,EAAKlI,KAAOA,EAAMA,EAAKgH,OAASkB,EAChCA,EAAKF,YAAcA,EAAiBA,IAAaA,EAAYhB,OAASkB,GACtEA,EAAKD,YAAcA,EAAiBA,IAAaA,EAAYjB,OAASkB,GAC/DA,GAGFnB,EAAAqB,gBAAP,SACEpI,EACA0H,EACAW,EACAlC,EACA3C,GAEA,IAAI0E,EAAO,IAAII,EAMf,OALAJ,EAAK1E,MAAQA,EACb0E,EAAKlI,KAAOA,EAAMA,EAAKgH,OAASkB,EAChCA,EAAKR,KAAOA,EAAUA,IAAMA,EAAKV,OAASkB,GAC1CA,EAAKG,YAAcA,EAAiBA,IAAaA,EAAYrB,OAASkB,GACtEA,EAAKK,cAAgBpC,EACd+B,GAGFnB,EAAAyB,gBAAP,SACEC,EACAC,EACAC,EACAlB,EACAjE,GAEA,IAAIoF,EAAM,IAAIC,EAMd,OALAD,EAAIpF,MAAQA,EACZoF,EAAIH,WAAaA,EAAYb,GAAUa,EAAYG,GACnDA,EAAIF,WAAaA,EAAYA,EAAW1B,OAAS4B,EACjDA,EAAID,iBAAmBA,EAAsBA,IAAkBA,EAAiB3B,OAAS4B,GACzFA,EAAInB,WAAaA,EACVmB,GAKF7B,EAAA+B,gBAAP,SACE9I,EACA+I,EACAvF,GAEA,IAAIwF,EAAO,IAAIC,EAKf,OAJAD,EAAKxF,MAAQA,EACbwF,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKE,UAAYH,EAAUA,GAAMnB,GAAUmB,EAAMC,GACjDA,EAAKG,cAAgBC,EAAoBpJ,GAClCgJ,GAGFjC,EAAAsC,cAAP,SACE7E,EACA2B,EACA3C,GAEA,IAAI8F,EAAO,IAAIC,EAIf,OAHAD,EAAK9F,MAAQA,EACb8F,EAAKE,YAAcrD,EACnBmD,EAAK9E,KAAOA,EACL8E,GAKFvC,EAAAe,2BAAP,SACE9H,EACAwD,GAEA,IAAIiG,EAAO,IAAIC,EAGf,OAFAD,EAAKjG,MAAQA,EACbiG,EAAKjF,KAAOxE,EACLyJ,GAGF1C,EAAA4C,gCAAP,SACEnG,GAEA,IAAIiG,EAAO,IAAIC,EAGf,OAFAD,EAAKjG,MAAQA,EACbiG,EAAKjF,KAAO,GACLiF,GAGF1C,EAAA6C,6BAAP,SACEC,EACArG,GAEA,IAAIiG,EAAO,IAAIK,EAGf,OAFAL,EAAKjG,MAAQA,EACbiG,EAAKM,mBAAqBF,EA8sD9B,SAA4BG,EAAwBhD,GAClD,IAAK,IAAIvH,EAAI,EAAGwK,EAAID,EAAMtF,OAAQjF,EAAIwK,IAAKxK,EAAG,CAC5C,IAAI6J,EAAOU,EAAMvK,GACb6J,IAAMA,EAAKtC,OAASA,IAjtDYkD,CAAmBL,EAAUJ,GAC1DA,GAGF1C,EAAAoD,0BAAP,SACEC,EACAC,EACAC,EACA9G,GAEA,IAAIiG,EAAO,IAAIc,EAKf,OAJAd,EAAKjG,MAAQA,EACbiG,EAAKW,cAAgBA,EACrBX,EAAKY,WAAaA,EAAYA,EAAWrD,OAASyC,EAClDA,EAAKa,OAASA,EAAQA,EAAOtD,OAASyC,EAC/BA,GAGF1C,EAAAyD,uBAAP,SACEC,EACAC,EACAC,EACAnH,GAEA,IAAIiG,EAAO,IAAImB,EAKf,OAJAnB,EAAKjG,MAAQA,EACbiG,EAAKgB,SAAWA,EAChBhB,EAAKiB,KAAOA,EAAMA,EAAK1D,OAASyC,EAChCA,EAAKkB,MAAQA,EAAOA,EAAM3D,OAASyC,EAC5BA,GAGF1C,EAAA8D,qBAAP,SACER,EACAS,EACA/B,EACAvF,GAEA,IAAIiG,EAAO,IAAIsB,EAKf,OAJAtB,EAAKjG,MAAQA,EACbiG,EAAKY,WAAaA,EAAYA,EAAWrD,OAASyC,EAClDA,EAAKjC,cAAgBsD,EAAcA,GAAUlD,GAAUkD,EAAUrB,GACjEA,EAAKP,UAAYH,EAAMnB,GAAUmB,EAAMU,GAChCA,GAGF1C,EAAAiE,sBAAP,SACEC,GAEA,IAAIxB,EAAO,IAAIyB,EAGf,OAFAzB,EAAKjG,MAAQyH,EAAYzH,MACzBiG,EAAKwB,YAAcA,EACZxB,GAGF1C,EAAAoE,sBAAP,SACEC,EACA5H,GAEA,IAAIiG,EAAO,IAAI4B,EAGf,OAFA5B,EAAKjG,MAAQA,EACbiG,EAAK2B,YAAcA,EAAaxD,GAAUwD,EAAa3B,GAChDA,GAGF1C,EAAAuE,4BAAP,SACE9H,GAEA,IAAIiG,EAAO,IAAI8B,EAEf,OADA9B,EAAKjG,MAAQA,EACNiG,GAGF1C,EAAAyE,8BAAP,SACEnB,EACAoB,EACAjI,GAEA,IAAIiG,EAAO,IAAIiC,EAIf,OAHAjC,EAAKjG,MAAQA,EACbiG,EAAKY,WAAaA,EAAYA,EAAWrD,OAASyC,EAClDA,EAAKkC,kBAAoBF,EAASA,EAAQzE,OAASyC,EAC5CA,GAGF1C,EAAA6E,sBAAP,SACEpI,GAEA,IAAIiG,EAAO,IAAIoC,EAEf,OADApC,EAAKjG,MAAQA,EACNiG,GAGF1C,EAAA+E,6BAAP,SACEpL,EACA8C,GAEA,IAAIiG,EAAO,IAAIsC,EAGf,OAFAtC,EAAKjG,MAAQA,EACbiG,EAAK/I,MAAQA,EACN+I,GAGF1C,EAAAiF,yBAAP,SACEf,GAEA,IAAIxB,EAAO,IAAIwC,EAIf,OAHAxC,EAAKxC,MAAQgE,EAAYhE,MAAQpB,EAAApE,YAAYyK,MAC7CzC,EAAKjG,MAAQyH,EAAYzH,MACzBiG,EAAKwB,YAAcA,EACZxB,GAGF1C,EAAAoF,2BAAP,SACE9B,EACA+B,EACA5I,GAEA,IAAIiG,EAAO,IAAI4C,EAIf,OAHA5C,EAAKjG,MAAQA,EACbiG,EAAKY,WAAaA,EAAYA,EAAWrD,OAASyC,EAClDA,EAAK2C,OAASA,EAAQA,EAAOpF,OAASyC,EAC/BA,GAGF1C,EAAAuF,+BAAP,SACE5L,EACA8C,GAEA,IAAIiG,EAAO,IAAI8C,EAGf,OAFA9C,EAAKjG,MAAQA,EACbiG,EAAK/I,MAAQA,EACN+I,GAGF1C,EAAAyF,oBAAP,SACEnC,EACAS,EACA/B,EACAvF,GAEA,IAAIiG,EAAO,IAAIgD,EAKf,OAJAhD,EAAKjG,MAAQA,EACbiG,EAAKY,WAAaA,EAAYA,EAAWrD,OAASyC,EAClDA,EAAKjC,cAAgBsD,EAAcA,GAAUlD,GAAUkD,EAAUrB,GACjEA,EAAKP,UAAYH,EAAMnB,GAAUmB,EAAMU,GAChCA,GAGF1C,EAAA2F,qBAAP,SACElJ,GAEA,IAAIiG,EAAO,IAAIkD,EAEf,OADAlD,EAAKjG,MAAQA,EACNiG,GAGF1C,EAAA6F,8BAAP,SACEC,EACAC,EACAtJ,GAEA,IAAIiG,EAAO,IAAIsD,EAIf,OAHAtD,EAAKjG,MAAQA,EACbiG,EAAKoD,MAAQA,EACbpD,EAAKqD,OAASA,EACPrD,GAGF1C,EAAAiG,8BAAP,SACE3C,EACA7G,GAEA,IAAIiG,EAAO,IAAIwD,EAGf,OAFAxD,EAAKjG,MAAQA,EACbiG,EAAKY,WAAaA,EAAYA,EAAWrD,OAASyC,EAC3CA,GAGF1C,EAAAmG,+BAAP,SACE7C,EACAjJ,EACAoC,GAEA,IAAIiG,EAAO,IAAI0D,EAIf,OAHA1D,EAAKjG,MAAQA,EACbiG,EAAKY,WAAaA,EAAYA,EAAWrD,OAASyC,EAClDA,EAAKrI,SAAWA,EAAUA,EAAS4F,OAASyC,EACrCA,GAGF1C,EAAAqG,8BAAP,SACEC,EACApG,EACAzD,GAEA,IAAIiG,EAAO,IAAI6D,EAIf,OAHA7D,EAAKjG,MAAQA,EACbiG,EAAK4D,QAAUA,EACf5D,EAAK8D,aAAetG,EACbwC,GAGF1C,EAAAyG,wBAAP,SACEC,EACAC,EACAC,EACAnK,GAEA,IAAIiG,EAAO,IAAImE,EAKf,OAJAnE,EAAKjG,MAAQA,EACbiG,EAAKgE,UAAYA,EAAWA,EAAUzG,OAASyC,EAC/CA,EAAKiE,OAASA,EAAQA,EAAO1G,OAASyC,EACtCA,EAAKkE,OAASA,EAAQA,EAAO3G,OAASyC,EAC/BA,GAGF1C,EAAA8G,8BAAP,SACEnN,EACA8C,GAEA,IAAIiG,EAAO,IAAIqE,EAGf,OAFArE,EAAKjG,MAAQA,EACbiG,EAAK/I,MAAQA,EACN+I,GAGF1C,EAAAgH,sBAAP,SACEvK,GAEA,IAAIiG,EAAO,IAAIuE,EAEf,OADAvE,EAAKjG,MAAQA,EACNiG,GAGF1C,EAAAkH,qBAAP,SACEzK,GAEA,IAAIiG,EAAO,IAAIyE,EAEf,OADAzE,EAAKjG,MAAQA,EACNiG,GAGF1C,EAAAoH,qBAAP,SACE3K,GAEA,IAAIiG,EAAO,IAAI2E,EAEf,OADA3E,EAAKjG,MAAQA,EACNiG,GAGF1C,EAAAsH,6BAAP,SACE5D,EACA6D,EACA9K,GAEA,IAAIiG,EAAO,IAAI8E,EAIf,OAHA9E,EAAKjG,MAAQA,EACbiG,EAAKgB,SAAWA,EAChBhB,EAAK6E,QAAUA,EAASA,EAAQtH,OAASyC,EAClCA,GAGF1C,EAAAyH,4BAAP,SACE/D,EACA6D,EACA9K,GAEA,IAAIiG,EAAO,IAAIgF,EAIf,OAHAhF,EAAKjG,MAAQA,EACbiG,EAAKgB,SAAWA,EAChBhB,EAAK6E,QAAUA,EAASA,EAAQtH,OAASyC,EAClCA,GAKF1C,EAAA2H,qBAAP,SACEC,EACAnL,GAEA,IAAIwF,EAAO,IAAI4F,GAGf,OAFA5F,EAAKxF,MAAQA,EACbwF,EAAK2F,WAAaA,EAAY/G,GAAU+G,EAAY3F,GAC7CA,GAGFjC,EAAA8H,qBAAP,SACEC,EACAtL,GAEA,IAAIwF,EAAO,IAAI+F,GAGf,OAFA/F,EAAKxF,MAAQA,EACbwF,EAAK8F,MAAQA,EAAWA,IAAOA,EAAM9H,OAASgC,GACvCA,GAGFjC,EAAAiI,uBAAP,SACEC,EACAC,EACAlH,EACAmH,EACAC,EACAC,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAIsG,GASf,OARAtG,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOiP,EAAYA,EAAWjI,OAASgC,EAC5CA,EAAKkG,eAAiBA,EAAgBtH,GAAUsH,EAAgBlG,GAChEA,EAAKhB,YAAcA,EAAiBA,IAAaA,EAAYhB,OAASgC,GACtEA,EAAKmG,gBAAkBA,EAAqBA,GAAiBvH,GAAUuH,EAAiBnG,GACxFA,EAAKoG,QAAUA,EAASxH,GAAUwH,EAASpG,GAC3CA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAwI,wBAAP,SACET,EACAtL,GAEA,IAAIwF,EAAO,IAAIwG,GAGf,OAFAxG,EAAKxF,MAAQA,EACbwF,EAAK8F,MAAQA,EAAWA,IAAOA,EAAM9H,OAASgC,GACvCA,GAGFjC,EAAA0I,kBAAP,SACEC,EACAjC,EACAjK,GAEA,IAAIwF,EAAO,IAAI2G,GAIf,OAHA3G,EAAKxF,MAAQA,EACbwF,EAAK0G,UAAYA,EAAWA,EAAU1I,OAASgC,EAC/CA,EAAKyE,UAAYA,EAAWA,EAAUzG,OAASgC,EACxCA,GAGFjC,EAAA6I,qBAAP,SACEpM,GAEA,IAAIwF,EAAO,IAAI6G,GAEf,OADA7G,EAAKxF,MAAQA,EACNwF,GAGFjC,EAAA+I,sBAAP,SACE9P,EACAoP,EACAC,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAI+G,GAMf,OALA/G,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAK8D,OAASsC,EAASxH,GAAUwH,EAASpG,GAC1CA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAiJ,2BAAP,SACEhQ,EACAU,EACAuG,EACAzD,GAEA,IAAIwF,EAAO,IAAIiH,GAKf,OAJAjH,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKtI,MAAQA,EAAWA,IAAOA,EAAMsG,OAASgC,GACvCA,GAGFjC,EAAAmJ,sBAAP,SACEd,EACAe,EACAlJ,EACAzD,GAEA,IAAIwF,EAAO,IAAIoH,GAKf,GAJApH,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKoG,QAAUA,EAAaA,GAASxH,GAAUwH,EAASpG,GACxDA,EAAKmH,KAAOA,EACRA,EAAM,CACR,IAAIhM,EAAiB7B,EAAA+N,cAAcF,EAAKzP,OACpCyP,EAAKzP,MAAM4P,WAAW,KACxBtH,EAAK7E,eAAiB7B,EAAAiO,YACpBpM,EACAX,EAAMU,OAAOC,gBAGf6E,EAAK7E,eAAiBA,EAExB6E,EAAKwH,aAAeC,GAAmBzH,EAAK7E,qBAE5C6E,EAAK7E,eAAiB,KACtB6E,EAAKwH,aAAe,KAEtB,OAAOxH,GAGFjC,EAAA2J,4BAAP,SACE1Q,EACA2Q,EACAnN,GAEA,IAAIwF,EAAO,IAAI4H,GAIf,OAHA5H,EAAKxF,MAAQA,EACbwF,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAK2H,aAAeA,EAAcA,EAAa3J,OAASgC,EACjDA,GAGFjC,EAAA8J,mBAAP,SACE7Q,EACA2Q,EACAnN,GAEA,IAAI0E,EAAO,IAAI4I,GASf,OARA5I,EAAK1E,MAAQA,EACb0E,EAAKlI,KAAOA,EAAMA,EAAKgH,OAASkB,EAC3ByI,EAGHA,EAAa3J,OAASkB,EAFtByI,EAAe3Q,EAIjBkI,EAAKyI,aAAeA,EACbzI,GAGFnB,EAAAgK,0BAAP,SACE1G,GAEA,IAAIrB,EAAO,IAAIgI,GAGf,OAFAhI,EAAKxF,MAAQ6G,EAAW7G,MACxBwF,EAAKqB,WAAaA,EAAYA,EAAWrD,OAASgC,EAC3CA,GAGFjC,EAAAkK,kBAAP,SACExD,EACAyD,EACAC,EACA3N,GAEA,IAAIwF,EAAO,IAAIoI,GAKf,OAJApI,EAAKxF,MAAQA,EACbwF,EAAKyE,UAAYA,EAAWA,EAAUzG,OAASgC,EAC/CA,EAAKkI,OAASA,EAAQA,EAAOlK,OAASgC,EACtCA,EAAKmI,QAAUA,EAAaA,IAASA,EAAQnK,OAASgC,GAC/CA,GAGFjC,EAAAsK,sBAAP,SACEC,EACAnB,EACA3M,GAEA,IAAIwF,EAAO,IAAIuI,GACfvI,EAAKxF,MAAQA,EACbwF,EAAKwI,aAAeF,EAAWA,GAAO1J,GAAU0J,EAAOtI,GACvDA,EAAKyI,cAAgB,KACrBzI,EAAKmH,KAAOA,EACZ,IAAIhM,EAAiB7B,EAAA+N,cAAcF,EAAKzP,OAaxC,OAZIyP,EAAKzP,MAAM4P,WAAW,KACxBtH,EAAK7E,eAAiB7B,EAAAiO,YACpBpM,EACAX,EAAMU,OAAOC,iBAGVA,EAAemM,WAAWzK,EAAA3D,kBAC7BiC,EAAiB0B,EAAA3D,eAAiBiC,GAEpC6E,EAAK7E,eAAiBA,GAExB6E,EAAKwH,aAAeC,GAAmBzH,EAAK7E,gBACrC6E,GAGFjC,EAAA2K,kCAAP,SACEzC,EACAkB,EACA3M,GAEA,IAAIwF,EAAO,IAAIuI,GAUf,OATAvI,EAAKxF,MAAQA,EACbwF,EAAKwI,aAAe,KACpBxI,EAAKyI,cAAgBxC,EACrBjG,EAAKmH,KAAOA,EACZnH,EAAK7E,eAAiB7B,EAAAiO,YACpBjO,EAAA+N,cAAcF,EAAKzP,OACnB8C,EAAMU,OAAOC,gBAEf6E,EAAKwH,aAAeC,GAAmBzH,EAAK7E,gBACrC6E,GAGFjC,EAAA4K,wBAAP,SACEhB,EACA3Q,EACAwD,GAEA,IAAI0E,EAAO,IAAI0J,GASf,OARA1J,EAAK1E,MAAQA,EACb0E,EAAKyI,aAAeA,EAAcA,EAAa3J,OAASkB,EACnDlI,EAGHA,EAAKgH,OAASkB,EAFdlI,EAAO2Q,EAITzI,EAAKlI,KAAOA,EACLkI,GAGFnB,EAAA8K,2BAAP,SACE7R,EACAkP,EACAlH,EACAoH,EACAC,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAI8I,GAQf,OAPA9I,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKkG,eAAiBA,EAAoBA,GAAgBtH,GAAUsH,EAAgBlG,GACpFA,EAAKhB,YAAcA,EAAiBA,IAAaA,EAAYhB,OAASgC,GACtEA,EAAKoG,QAAUA,EAASxH,GAAUwH,EAASpG,GAC3CA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAgL,uBAAP,SACE/R,EACA0H,EACAW,EACAgH,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAIgJ,GAOf,OANAhJ,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKtB,KAAOA,EAAUA,IAAMA,EAAKV,OAASgC,GAC1CA,EAAKX,YAAcA,EAAiBA,IAAaA,EAAYrB,OAASgC,GACtEA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAkL,mBAAP,SACE5J,EACAoF,EACAyE,EACAxC,EACAlM,GAEA,IAAIwF,EAAO,IAAImJ,GAMf,OALAnJ,EAAKxF,MAAQA,EACbwF,EAAKX,YAAcA,EAAiBA,IAAaA,EAAYrB,OAASgC,GACtEA,EAAKyE,UAAYA,EAAeA,IAAWA,EAAUzG,OAASgC,GAC9DA,EAAKkJ,YAAcA,EAAiBA,IAAaA,EAAYlL,OAASgC,GACtEA,EAAK0G,UAAYA,EAAWA,EAAU1I,OAASgC,EACxCA,GAGFjC,EAAAqL,0BAAP,SACEpS,EACAkP,EACAmD,EACAC,EACAjD,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAIuJ,GAQf,OAPAvJ,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKkG,eAAiBA,EAAoBA,GAAgBtH,GAAUsH,EAAgBlG,GACpFA,EAAKqJ,UAAYA,EAAWA,EAAUrL,OAASgC,EAC/CA,EAAKsJ,KAAOA,EAAUA,IAAMA,EAAKtL,OAASgC,GAC1CA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAyL,gCAAP,SACEC,EACAC,EACAlP,GAEA,IAAI0E,EAAO,IAAIyK,EAIf,OAHAzK,EAAK1E,MAAQA,EACb0E,EAAKuK,QAAUA,EAASA,EAAQzL,OAASkB,EACzCA,EAAKwK,UAAYA,EAAWA,EAAU1L,OAASkB,EACxCA,GAGFnB,EAAA6L,wBAAP,SACE5S,EACAkP,EACAmD,EACAC,EACAjD,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAI6J,GAQf,OAPA7J,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKkG,eAAiBA,EAAoBA,GAAgBtH,GAAUsH,EAAgBlG,GACpFA,EAAKqJ,UAAYA,EAAWA,EAAUrL,OAASgC,EAC/CA,EAAKsJ,KAAOA,EAAUA,IAAMA,EAAKtL,OAASgC,GAC1CA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAA+L,2BAAP,SACE9S,EACAoP,EACAC,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAI+J,GAMf,OALA/J,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKoG,QAAUA,EAASxH,GAAUwH,EAASpG,GAC3CA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAiM,sBAAP,SACEtS,EACA8C,GAEA,IAAIwF,EAAO,IAAIiK,GAGf,OAFAjK,EAAKxF,MAAQA,EACbwF,EAAKtI,MAAQA,EAAWA,IAAOA,EAAMsG,OAASgC,GACvCA,GAGFjC,EAAAmM,sBAAP,SACEzF,EACA0F,EACA3P,GAEA,IAAIwF,EAAO,IAAIoK,GAIf,OAHApK,EAAKxF,MAAQA,EACbwF,EAAKyE,UAAYA,EAAWA,EAAUzG,OAASgC,EAC/CA,EAAKmK,MAAQA,EAAOvL,GAAUuL,EAAOnK,GAC9BA,GAGFjC,EAAAsM,iBAAP,SACEvE,EACAH,EACAnL,GAEA,IAAI0E,EAAO,IAAIoL,GAIf,OAHApL,EAAK1E,MAAQA,EACb0E,EAAK4G,MAAQA,EAAWA,IAAOA,EAAM9H,OAASkB,GAC9CA,EAAKyG,WAAaA,EAAY/G,GAAU+G,EAAYzG,GAC7CA,GAGFnB,EAAAwM,qBAAP,SACE7S,EACA8C,GAEA,IAAIwF,EAAO,IAAIwK,GAGf,OAFAxK,EAAKxF,MAAQA,EACbwF,EAAKtI,MAAQA,EAAOA,EAAMsG,OAASgC,EAC5BA,GAGFjC,EAAA0M,mBAAP,SACE9E,EACA+E,EACAC,EACAC,EACApQ,GAEA,IAAIwF,EAAO,IAAI6K,GASf,OARA7K,EAAKxF,MAAQA,EACbwF,EAAK2F,WAAaA,EAAY/G,GAAU+G,EAAY3F,GACpDA,EAAK0K,cAAgBA,EACjBA,IAAeA,EAAc1M,OAASgC,GAC1CA,EAAK2K,gBAAkBA,EACnBA,GAAiB/L,GAAU+L,EAAiB3K,GAChDA,EAAK4K,kBAAoBA,EACrBA,GAAmBhM,GAAUgM,EAAmB5K,GAC7CA,GAGFjC,EAAA+M,sBAAP,SACE9T,EACAkP,EACA6E,EACA1E,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAIgL,GAOf,OANAhL,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKhJ,KAAOA,EAAMA,EAAKgH,OAASgC,EAChCA,EAAKkG,eAAiBA,EAAoBA,GAAgBtH,GAAUsH,EAAgBlG,GACpFA,EAAKtB,KAAOqM,EAAOA,EAAM/M,OAASgC,EAClCA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAkN,wBAAP,SACEzC,EACAnC,EACApI,EACAzD,GAEA,IAAIwF,EAAO,IAAIkL,GAKf,OAJAlL,EAAKxF,MAAQA,EACbwF,EAAK/B,MAAQA,EACb+B,EAAKwI,aAAeA,EAAc5J,GAAU4J,EAAcxI,GAC1DA,EAAKqG,WAAaA,EAAgBA,GAAYzH,GAAUyH,EAAYrG,GAC7DA,GAGFjC,EAAAoN,0BAAP,SACEnU,EACA0H,EACAW,EACAgH,EACApI,EACAzD,GAEA,IAAI0E,EAAO,IAAIkM,GAOf,OANAlM,EAAK1E,MAAQA,EACb0E,EAAKjB,MAAQA,EACbiB,EAAKlI,KAAOA,EAAMA,EAAKgH,OAASkB,EAChCA,EAAKR,KAAOA,EAAUA,IAAMA,EAAKV,OAASkB,GAC1CA,EAAKG,YAAcA,EAAiBA,IAAaA,EAAYrB,OAASkB,GACtEA,EAAKmH,WAAaA,EACXnH,GAGFnB,EAAAsN,oBAAP,SACEhK,EACA7G,GAEA,IAAIwF,EAAO,IAAIsL,GAGf,OAFAtL,EAAKxF,MAAQA,EACbwF,EAAKqB,WAAaA,EACXrB,GAGFjC,EAAAwN,qBAAP,SACE9G,EACAiC,EACAlM,GAEA,IAAIwF,EAAO,IAAIwL,GAIf,OAHAxL,EAAKxF,MAAQA,EACbwF,EAAKyE,UAAYA,EAAWA,EAAUzG,OAASgC,EAC/CA,EAAK0G,UAAYA,EAAWA,EAAU1I,OAASgC,EACxCA,GAEXjC,EA15BA,GAAsBjI,EAAAiI,OA85BtB,IAAA0N,EAAA,SAAAC,GAAA,SAAAD,mDAKA,OAL6CE,EAAAF,EAAAC,GAK7CD,EALA,CAA6C1N,GAAvBjI,EAAA2V,iBAQtB,IAAA9M,EAAA,SAAA+M,GAAA,SAAA/M,IAAA,IAAAiN,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS6O,OAMlB,OAP8BH,EAAAhN,EAAA+M,GAO9B/M,EAPA,CAA8B8M,GAAjB3V,EAAA6I,WAUb,IAAAQ,EAAA,SAAAuM,GAAA,SAAAvM,IAAA,IAAAyM,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS8O,gBAQlB,OATuCJ,EAAAxM,EAAAuM,GASvCvM,EATA,CAAuCpB,GAA1BjI,EAAAqJ,oBAYb,SAAY6M,GAEVA,IAAA,qBAEAA,IAAA,uBAEAA,IAAA,eANF,CAAYlW,EAAAkW,gBAAAlW,EAAAkW,mBAUZ,IAAA1M,EAAA,SAAAoM,GAAA,SAAApM,IAAA,IAAAsM,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASgP,UAWhBL,EAAAM,yBAAoD,OACtD,OAbmCP,EAAArM,EAAAoM,GAanCpM,EAbA,CAAmCvB,GAAtBjI,EAAAwJ,gBAgBb,IAcY6M,EAdZtM,EAAA,SAAA6L,GAAA,SAAA7L,IAAA,IAAA+L,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASmP,YAQlB,OATmCT,EAAA9L,EAAA6L,GASnC7L,EATA,CAAmC4L,GA6BnC,SAAgBrL,EAAoBpJ,GAElC,GAAIA,EAAKmG,MAAQF,EAASQ,WAAY,CACpC,IAAI4O,EAAiCrV,EAAMwE,KAE3C,OADA3B,OAAOwS,EAAQ3Q,QACP2Q,EAAQvQ,WAAW,IACzB,QACE,GAAe,WAAXuQ,EAAsB,OAAOF,EAAcG,QAC/C,MAEF,SACE,GAAe,YAAXD,EAAuB,OAAOF,EAAcI,SAChD,MAEF,SACE,GAAe,UAAXF,EAAqB,OAAOF,EAAcK,OAC9C,MAEF,SACE,GAAe,UAAXH,EAAqB,OAAOF,EAAcM,OAC9C,MAEF,SACE,GAAe,YAAXJ,EAAuB,OAAOF,EAAcO,SAChD,MAEF,SACE,GAAe,UAAXL,EAAqB,OAAOF,EAAcQ,OAC9C,MAEF,SACE,GAAe,aAAXN,EAAwB,OAAOF,EAAcS,gBAIhD,GACL5V,EAAKmG,MAAQF,EAASW,gBACK5G,EAAMqK,WAAWlE,MAAQF,EAASQ,WAC7D,CACI4O,EAA4DrV,EAAMqK,WAAY7F,KAClF3B,OAAOwS,EAAQ3Q,QACf,IAAImR,EAAqC7V,EAAMoB,SAASoD,KAGxD,GAFA3B,OAAOgT,EAAQnR,QAEA,YAAX2Q,EACF,OAAQQ,EAAQ/Q,WAAW,IACzB,QACE,GAAe,UAAX+Q,EAAqB,OAAOV,EAAcW,gBAC9C,MAEF,SACE,OAAQD,GACN,IAAK,SAAU,OAAOV,EAAcY,gBACpC,IAAK,UAAW,OAAOZ,EAAca,mBAO/C,OAAOb,EAAcc,OAzFVnX,EAAA+J,gBAcb,SAAYsM,GACVA,IAAA,mBACAA,IAAA,mBACAA,IAAA,uBACAA,IAAA,qCACAA,IAAA,qCACAA,IAAA,uCACAA,IAAA,yBACAA,IAAA,mBACAA,IAAA,mBACAA,IAAA,uBACAA,IAAA,sBAXF,CAAYA,EAAArW,EAAAqW,gBAAArW,EAAAqW,mBAeZrW,EAAAsK,sBAgEA,IAAAH,EAAA,SAAAyL,GAAA,SAAAzL,IAAA,IAAA2L,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASiQ,YAQlB,OATmCvB,EAAA1L,EAAAyL,GASnCzL,EATA,CAAmClC,GAAtBjI,EAAAmK,gBAYb,SAAYkN,GAEVA,IAAA,eAEAA,IAAA,mBAEAA,IAAA,iBANF,CAAYrX,EAAAqX,cAAArX,EAAAqX,iBAUZ,IAAA5M,EAAA,SAAAmL,GAAA,SAAAnL,IAAA,IAAAqL,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASmQ,UAMlB,OAPiCzB,EAAApL,EAAAmL,GAOjCnL,EAPA,CAAiCxC,GAApBjI,EAAAyK,cAYb,IAAA8M,EAAA,SAAA3B,GAAA,SAAA2B,mDAAgD,OAAP1B,EAAA0B,EAAA3B,GAAO2B,EAAhD,CAAyCtP,GAAnBjI,EAAAuX,aAGtB,IAQYC,EARZ5M,EAAA,SAAAgL,GAAA,SAAAhL,IAAA,IAAAkL,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASQ,aAIlB,OAL0CkO,EAAAjL,EAAAgL,GAK1ChL,EALA,CAA0C2M,GAA7BvX,EAAA4K,uBAQb,SAAY4M,GACVA,IAAA,iBACAA,IAAA,qBACAA,IAAA,mBACAA,IAAA,mBACAA,IAAA,iBACAA,IAAA,mBANF,CAAYA,EAAAxX,EAAAwX,cAAAxX,EAAAwX,iBAUZ,IAAAC,EAAA,SAAA7B,GAAA,SAAA6B,IAAA,IAAA3B,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASG,UAIlB,OALgDuO,EAAA4B,EAAA7B,GAKhD6B,EALA,CAAgDF,GAA1BvX,EAAAyX,oBAQtB,IAAAzM,EAAA,SAAA4K,GAAA,SAAA5K,IAAA,IAAA8K,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAA4B,YAAcF,EAAYG,QAI5B,OAL4C9B,EAAA7K,EAAA4K,GAK5C5K,EALA,CAA4CyM,GAA/BzX,EAAAgL,yBAQb,SAAY4M,GACVA,IAAA,mBACAA,IAAA,WAFF,CAAY5X,EAAA4X,gBAAA5X,EAAA4X,mBAMZ,IAAAnM,EAAA,SAAAmK,GAAA,SAAAnK,IAAA,IAAAqK,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS0Q,YAQlB,OATyChC,EAAApK,EAAAmK,GASzCnK,EATA,CAAyC8L,GAA5BvX,EAAAyL,sBAYb,IAAAK,EAAA,SAAA8J,GAAA,SAAA9J,IAAA,IAAAgK,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS2Q,SAQlB,OATsCjC,EAAA/J,EAAA8J,GAStC9J,EATA,CAAsCyL,GAAzBvX,EAAA8L,mBAYb,IAAAG,EAAA,SAAA2J,GAAA,SAAA3J,IAAA,IAAA6J,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASS,OAQlB,OAToCiO,EAAA5J,EAAA2J,GASpC3J,EATA,CAAoCsL,GAAvBvX,EAAAiM,iBAYb,IAAAG,EAAA,SAAAwJ,GAAA,SAAAxJ,IAAA,IAAA0J,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS4Q,QAIlB,OALqClC,EAAAzJ,EAAAwJ,GAKrCxJ,EALA,CAAqCmL,GAAxBvX,EAAAoM,kBAQb,IAAAG,EAAA,SAAAqJ,GAAA,SAAArJ,IAAA,IAAAuJ,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS6Q,QAIlB,OALqCnC,EAAAtJ,EAAAqJ,GAKrCrJ,EALA,CAAqCgL,GAAxBvX,EAAAuM,kBAQb,IAAAE,EAAA,SAAAmJ,GAAA,SAAAnJ,IAAA,IAAAqJ,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS8Q,YAChBnC,EAAApQ,KAAO,gBACT,OAH2CmQ,EAAApJ,EAAAmJ,GAG3CnJ,EAHA,CAA2C7B,GAA9B5K,EAAAyM,wBAMb,IAAAG,EAAA,SAAAgJ,GAAA,SAAAhJ,IAAA,IAAAkJ,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASU,gBAMlB,OAP6CgO,EAAAjJ,EAAAgJ,GAO7ChJ,EAPA,CAA6C2K,GAAhCvX,EAAA4M,0BAUb,IAAAK,EAAA,SAAA2I,GAAA,SAAA3I,IAAA,IAAA6I,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAA4B,YAAcF,EAAYU,QAI5B,OAL4CrC,EAAA5I,EAAA2I,GAK5C3I,EALA,CAA4CwK,GAA/BzX,EAAAiN,yBAQb,IAAAE,EAAA,SAAAyI,GAAA,SAAAzI,IAAA,IAAA2I,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASgR,WAIlB,OALwCtC,EAAA1I,EAAAyI,GAKxCzI,EALA,CAAwCoK,GAA3BvX,EAAAmN,qBAQb,IAAAI,EAAA,SAAAqI,GAAA,SAAArI,IAAA,IAAAuI,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASiR,aAMlB,OAP0CvC,EAAAtI,EAAAqI,GAO1CrI,EAPA,CAA0CgK,GAA7BvX,EAAAuN,uBAUb,IAAAE,EAAA,SAAAmI,GAAA,SAAAnI,IAAA,IAAAqI,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAA4B,YAAcF,EAAYa,UAI5B,OAL8CxC,EAAApI,EAAAmI,GAK9CnI,EALA,CAA8CgK,GAAjCzX,EAAAyN,2BAQb,IAAAE,EAAA,SAAAiI,GAAA,SAAAjI,IAAA,IAAAmI,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASmR,MAClB,OAFmCzC,EAAAlI,EAAAiI,GAEnCjI,EAFA,CAAmC1B,GAAtBjM,EAAA2N,gBAKb,IAAAE,EAAA,SAAA+H,GAAA,SAAA/H,IAAA,IAAAiI,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASI,KAChBuO,EAAApQ,KAAO,SACT,OAHoCmQ,EAAAhI,EAAA+H,GAGpC/H,EAHA,CAAoCjD,GAAvB5K,EAAA6N,iBAMb,IAAAI,EAAA,SAAA2H,GAAA,SAAA3H,IAAA,IAAA6H,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAA4B,YAAcF,EAAYe,SAM5B,OAP6C1C,EAAA5H,EAAA2H,GAO7C3H,EAPA,CAA6CwJ,GAAhCzX,EAAAiO,0BAUb,IAAAE,EAAA,SAAAyH,GAAA,SAAAzH,IAAA,IAAA2H,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASY,gBAIlB,OAL6C8N,EAAA1H,EAAAyH,GAK7CzH,EALA,CAA6CoJ,GAAhCvX,EAAAmO,0BAQb,IAAAE,EAAA,SAAAuH,GAAA,SAAAvH,IAAA,IAAAyH,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASW,iBAMlB,OAP8C+N,EAAAxH,EAAAuH,GAO9CvH,EAPA,CAA8CkJ,GAAjCvX,EAAAqO,2BAUb,IAAAG,EAAA,SAAAoH,GAAA,SAAApH,IAAA,IAAAsH,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAA4B,YAAcF,EAAYgB,SAM5B,OAP6C3C,EAAArH,EAAAoH,GAO7CpH,EAPA,CAA6CiJ,GAAhCzX,EAAAwO,0BAUb,IAAAM,EAAA,SAAA8G,GAAA,SAAA9G,IAAA,IAAAgH,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASsR,UAQlB,OATuC5C,EAAA/G,EAAA8G,GASvC9G,EATA,CAAuCyI,GAA1BvX,EAAA8O,oBAYb,IAAAE,EAAA,SAAA4G,GAAA,SAAA5G,IAAA,IAAA8G,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAA4B,YAAcF,EAAYkB,SAI5B,OAL6C7C,EAAA7G,EAAA4G,GAK7C5G,EALA,CAA6CyI,GAAhCzX,EAAAgP,0BAQb,IAAAE,EAAA,SAAA0G,GAAA,SAAA1G,IAAA,IAAA4G,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASwR,MAChB7C,EAAApQ,KAAO,UACT,OAHqCmQ,EAAA3G,EAAA0G,GAGrC1G,EAHA,CAAqCtE,GAAxB5K,EAAAkP,kBAMb,IAAAE,EAAA,SAAAwG,GAAA,SAAAxG,IAAA,IAAA0G,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASyR,KAChB9C,EAAApQ,KAAO,SACT,OAHoCmQ,EAAAzG,EAAAwG,GAGpCxG,EAHA,CAAoCxE,GAAvB5K,EAAAoP,iBAMb,IAAAE,EAAA,SAAAsG,GAAA,SAAAtG,IAAA,IAAAwG,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASK,KAChBsO,EAAApQ,KAAO,SACT,OAHoCmQ,EAAAvG,EAAAsG,GAGpCtG,EAHA,CAAoC1E,GAAvB5K,EAAAsP,iBAMb,IAAAvC,EAAA,SAAA6I,GAAA,SAAA7I,IAAA,IAAA+I,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASM,MAChBqO,EAAApQ,KAAO,UACT,OAHqCmQ,EAAA9I,EAAA6I,GAGrC7I,EAHA,CAAqCnC,GAAxB5K,EAAA+M,kBAMb,IAAA8L,EAAA,SAAAjD,GAAA,SAAAiD,mDAMA,OAN8ChD,EAAAgD,EAAAjD,GAM9CiD,EANA,CAA8CtB,GAAxBvX,EAAA6Y,kBAStB,IAAApJ,EAAA,SAAAmG,GAAA,SAAAnG,IAAA,IAAAqG,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS2R,eAClB,OAF4CjD,EAAApG,EAAAmG,GAE5CnG,EAFA,CAA4CoJ,GAA/B7Y,EAAAyP,yBAKb,IAAAE,EAAA,SAAAiG,GAAA,SAAAjG,IAAA,IAAAmG,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS4R,cAClB,OAF2ClD,EAAAlG,EAAAiG,GAE3CjG,EAFA,CAA2CkJ,GAA9B7Y,EAAA2P,wBAMb3P,EAAAgZ,gBAAA,SAAgCpI,GAC9B,IAAI1I,EAASnE,OAAO6M,EAAU1I,QAC9B,GAAIA,EAAOb,MAAQF,EAAS8R,MAAO,CACjC,IAAIpJ,EAA8B3H,EAAQ2H,WAC1C,GAAIA,EAAWA,EAAWjK,OAAS,KAAOgL,EACxC,OAAQ7M,OAAOmE,EAAOA,QAAQb,MAC5B,KAAKF,EAAS+R,oBACd,KAAK/R,EAASgS,kBAAmB,OAAO,GAI9C,OAAO,GAIT,IAGYC,EAHZC,EAAA,SAAAzD,GAAA,SAAAyD,mDAA+C,OAAPxD,EAAAwD,EAAAzD,GAAOyD,EAA/C,CAAwCpR,GAAlBjI,EAAAqZ,YAGtB,SAAYD,GAEVA,IAAA,qBAEAA,IAAA,iBAEAA,IAAA,qBANF,CAAYA,EAAApZ,EAAAoZ,aAAApZ,EAAAoZ,gBAUZ,IAAAE,EAAA,SAAA1D,GAwBE,SAAA0D,EAAYjU,EAAwBK,EAAc2B,GAAlD,IAAAyO,EACEF,EAAA9U,KAAAR,OAAOA,KAxBTwV,EAAAzO,KAAOF,EAASoS,OAChBzD,EAAA5N,OAAS,KAeT4N,EAAA0D,UAA8B,KAE9B1D,EAAA2D,gBAAuB,EAEvB3D,EAAA4D,YAAkC,KAKhC5D,EAAK6D,WAAatS,EAClByO,EAAKzQ,eAAiBA,EACtB,IAAIqM,EAAeC,GAAmBmE,EAAKzQ,gBAC3CyQ,EAAKpE,aAAeA,EACpB,IAAIkI,EAAMlI,EAAamI,YAAY9S,EAAAnE,uBACnCkT,EAAKgE,WAAaF,GAAO,EAAIlI,EAAaxL,UAAU0T,EAAM,GAAKlI,EAC/DoE,EAAKjG,WAAa,IAAIpJ,MACtBqP,EAAKpR,MAAQ,IAAIsC,EAAAE,MAAM4O,EAAM,EAAGpQ,EAAKE,QACrCkQ,EAAKpQ,KAAOA,IAOhB,OAzC4BmQ,EAAAyD,EAAA1D,GAsC1BvU,OAAAC,eAAIgY,EAAA/W,UAAA,eAAJ,WAAsB,OAAOjC,KAAKqZ,YAAcP,EAAWW,uCAE3D1Y,OAAAC,eAAIgY,EAAA/W,UAAA,iBAAJ,WAAwB,OAAOjC,KAAKqZ,YAAcP,EAAWY,yCAC/DV,EAzCA,CAA4BrR,GAAfjI,EAAAsZ,SA4Cb,IAAAW,EAAA,SAAArE,GAAA,SAAAqE,IAAA,IAAAnE,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YAKEwV,EAAAvF,WAAqC,KAE3BuF,EAAAoE,+BAAgD,KAChDpE,EAAAqE,4BAA6C,OAwDzD,OAhEmDtE,EAAAoE,EAAArE,GAWjDvU,OAAAC,eAAI2Y,EAAA1X,UAAA,gCAAJ,WAIE,OAHKjC,KAAK4Z,iCACR5Z,KAAK4Z,+BAAiCE,GAAmB9Z,MAAM,IAE1DA,KAAK4Z,gEAId7Y,OAAAC,eAAI2Y,EAAA1X,UAAA,6BAAJ,WAIE,OAHKjC,KAAK6Z,8BACR7Z,KAAK6Z,4BAA8BC,GAAmB9Z,MAAM,IAEvDA,KAAK6Z,6DAId9Y,OAAAC,eAAI2Y,EAAA1X,UAAA,kBAAJ,WACE,IAAI2F,EAAS5H,KAAK4H,OAClB,QAAKA,MAGDA,EAAOb,MAAQF,EAASkT,YAAcnS,EAASA,EAAOA,UAGnDA,EAAOb,MAAQF,EAASoS,yCAIjClY,OAAAC,eAAI2Y,EAAA1X,UAAA,wBAAJ,WACE,IAAI2F,EAAS5H,KAAK4H,OAClB,SAAKA,GAAWA,EAAOb,MAAQF,EAASkT,YAAcnS,EAASA,EAAOA,WAGlEA,EAAOb,MAAQF,EAASmT,qBACnBha,KAAK+H,GAAGtB,EAAApE,YAAY4X,SAAkCrS,EAAQsS,iBAEnEtS,EAAOb,MAAQF,EAASsT,iBACnBna,KAAK+H,GAAGtB,EAAApE,YAAY+X,SAA8BxS,EAAQsS,iBAE5DtS,EAAOb,MAAQF,EAASoS,QAAUjZ,KAAK+H,GAAGtB,EAAApE,YAAY4X,0CAI/DN,EAAA1X,UAAAoY,oBAAA,SAAoBC,GAIlB,OACEA,EAAO1Z,KAAKwE,MAAQkV,EAAO/I,aAAanM,MACxCpF,KAAKoE,MAAMU,QAAUwV,EAAOlW,MAAMU,SACjC9E,KAAKka,kBAGZP,EAhEA,CAAmDZ,GAA7BrZ,EAAAia,uBAmEtB,IAAApG,EAAA,SAAA+B,GAAA,SAAA/B,IAAA,IAAAiC,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS0T,4BAMlB,OAP+ChF,EAAAhC,EAAA+B,GAO/C/B,EAPA,CAA+CoG,GAAlCja,EAAA6T,4BAUb,IAAAiH,GAAA,SAAAlF,GAAA,SAAAkF,mDAMA,OAN+DjF,EAAAiF,EAAAlF,GAM/DkF,EANA,CAA+Db,GAAzCja,EAAA8a,oCAStB,IAAAhL,GAAA,SAAA8F,GAAA,SAAA9F,IAAA,IAAAgG,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS8R,QAIlB,OALoCpD,EAAA/F,EAAA8F,GAKpC9F,EALA,CAAoCuJ,GAAvBrZ,EAAA8P,kBAQb,IAAAG,GAAA,SAAA2F,GAAA,SAAA3F,IAAA,IAAA6F,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS4T,QAIlB,OALoClF,EAAA5F,EAAA2F,GAKpC3F,EALA,CAAoCoJ,GAAvBrZ,EAAAiQ,kBAQb,IAAAO,GAAA,SAAAoF,GAAA,SAAApF,IAAA,IAAAsF,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASsT,mBAelB,OAhBsC5E,EAAArF,EAAAoF,GAYpCvU,OAAAC,eAAIkP,EAAAjO,UAAA,iBAAJ,WACE,IAAI6N,EAAiB9P,KAAK8P,eAC1B,OAAyB,MAAlBA,GAA0BA,EAAexK,OAAS,mCAE7D4K,EAhBA,CAAsCyJ,GAAzBja,EAAAwQ,oBAmBb,IAAAE,GAAA,SAAAkF,GAAA,SAAAlF,IAAA,IAAAoF,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS6T,WAIlB,OALuCnF,EAAAnF,EAAAkF,GAKvClF,EALA,CAAuC2I,GAA1BrZ,EAAA0Q,qBAQb,IAAAG,GAAA,SAAA+E,GAAA,SAAA/E,IAAA,IAAAiF,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS8T,KAMlB,OAPiCpF,EAAAhF,EAAA+E,GAOjC/E,EAPA,CAAiCwI,GAApBrZ,EAAA6Q,eAUb,IAAAE,GAAA,SAAA6E,GAAA,SAAA7E,IAAA,IAAA+E,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS+T,QAClB,OAFoCrF,EAAA9E,EAAA6E,GAEpC7E,EAFA,CAAoCsI,GAAvBrZ,EAAA+Q,kBAKb,IAAAE,GAAA,SAAA2E,GAAA,SAAA3E,IAAA,IAAA6E,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASgU,kBAIlB,OALqCtF,EAAA5E,EAAA2E,GAKrC3E,EALA,CAAqCgJ,GAAxBja,EAAAiR,mBAQb,IAAAE,GAAA,SAAAyE,GAAA,SAAAzE,IAAA,IAAA2E,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASiU,uBAKlB,OAN0CvF,EAAA1E,EAAAyE,GAM1CzE,EANA,CAA0C8I,GAA7Bja,EAAAmR,wBASb,IAAAW,GAAA,SAAA8D,GAAA,SAAA9D,IAAA,IAAAgE,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASkU,eAMlB,OAP2CxF,EAAA/D,EAAA8D,GAO3C9D,EAPA,CAA2C7J,GAA9BjI,EAAA8R,yBAUb,IAAAE,GAAA,SAAA4D,GAAA,SAAA5D,IAAA,IAAA8D,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASmU,eAMlB,OAPkCzF,EAAA7D,EAAA4D,GAOlC5D,EAPA,CAAkC/J,GAArBjI,EAAAgS,gBAUb,IAAAV,GAAA,SAAAsE,GAAA,SAAAtE,IAAA,IAAAwE,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASoT,SAUlB,OAXqC1E,EAAAvE,EAAAsE,GAWrCtE,EAXA,CAAqC+H,GAAxBrZ,EAAAsR,mBAcb,IAAAY,GAAA,SAAA0D,GAAA,SAAA1D,IAAA,IAAA4D,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASoU,aAIlB,OALyC1F,EAAA3D,EAAA0D,GAKzC1D,EALA,CAAyCmH,GAA5BrZ,EAAAkS,uBAQb,IAAAgB,GAAA,SAAA0C,GAAA,SAAA1C,IAAA,IAAA4C,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASqU,iBAGhB1F,EAAA2F,gBAAuB,IACzB,OALsC5F,EAAA3C,EAAA0C,GAKtC1C,EALA,CAAsC4H,IAAzB9a,EAAAkT,oBAQb,IAAAG,GAAA,SAAAuC,GAAA,SAAAvC,IAAA,IAAAyC,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASuU,MAalB,OAdkC7F,EAAAxC,EAAAuC,GAclCvC,EAdA,CAAkCgG,GAArBrZ,EAAAqT,gBAiBb,IAAAI,GAAA,SAAAmC,GAAA,SAAAnC,IAAA,IAAAqC,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS+R,sBAalB,OAdyCrD,EAAApC,EAAAmC,GAUvCvU,OAAAC,eAAImS,EAAAlR,UAAA,iBAAJ,WACE,IAAI6N,EAAiB9P,KAAK8P,eAC1B,OAAyB,MAAlBA,GAA0BA,EAAexK,OAAS,mCAE7D6N,EAdA,CAAyCwG,GAA5Bja,EAAAyT,uBAiBb,IAAAnB,GAAA,SAAAsD,GAAA,SAAAtD,IAAA,IAAAwD,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASwU,KAQlB,OATiC9F,EAAAvD,EAAAsD,GASjCtD,EATA,CAAiC+G,GAApBrZ,EAAAsS,eAYb,IAAAQ,GAAA,SAAA8C,GAAA,SAAA9C,IAAA,IAAAgD,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASyU,oBAIlB,OALuC/F,EAAA/C,EAAA8C,GAKvC9C,EALA,CAAuCmH,GAA1Bja,EAAA8S,qBAQb,IAAAL,GAAA,SAAAmD,GAAA,SAAAnD,IAAA,IAAAqD,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS0U,SAYlB,OAbqChG,EAAApD,EAAAmD,GAarCnD,EAbA,CAAqC4G,GAAxBrZ,EAAAyS,mBAgBb,IAAAO,GAAA,SAAA4C,GAAA,SAAA5C,IAAA,IAAA8C,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS2U,uBAClB,OAF0CjG,EAAA7C,EAAA4C,GAE1C5C,EAFA,CAA0CxC,IAA7BxQ,EAAAgT,wBAKb,IAAAe,GAAA,SAAA6B,GAAA,SAAA7B,IAAA,IAAA+B,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASgS,oBAClB,OAFuCtD,EAAA9B,EAAA6B,GAEvC7B,EAFA,CAAuCN,IAA1BzT,EAAA+T,qBAKb,IAAAE,GAAA,SAAA2B,GAAA,SAAA3B,IAAA,IAAA6B,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASmT,uBAIlB,OAL0CzE,EAAA5B,EAAA2B,GAK1C3B,EALA,CAA0CgG,GAA7Bja,EAAAiU,wBAQb,IAAAE,GAAA,SAAAyB,GAAA,SAAAzB,IAAA,IAAA2B,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS4U,SAIlB,OALqClG,EAAA1B,EAAAyB,GAKrCzB,EALA,CAAqCkF,GAAxBrZ,EAAAmU,mBAQb,IAAAK,GAAA,SAAAoB,GAAA,SAAApB,IAAA,IAAAsB,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS6U,aAMlB,OAPgCnG,EAAArB,EAAAoB,GAOhCpB,EAPA,CAAgCvM,GAAnBjI,EAAAwU,cAUb,IAAAF,GAAA,SAAAsB,GAAA,SAAAtB,IAAA,IAAAwB,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS8U,SAMlB,OAPqCpG,EAAAvB,EAAAsB,GAOrCtB,EAPA,CAAqC+E,GAAxBrZ,EAAAsU,mBAUb,IAAAI,GAAA,SAAAkB,GAAA,SAAAlB,IAAA,IAAAoB,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAAS+U,QAIlB,OALoCrG,EAAAnB,EAAAkB,GAKpClB,EALA,CAAoC2E,GAAvBrZ,EAAA0U,kBAQb,IAAAK,GAAA,SAAAa,GAAA,SAAAb,IAAA,IAAAe,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASgV,MAUlB,OAXkCtG,EAAAd,EAAAa,GAWlCb,EAXA,CAAkCsE,GAArBrZ,EAAA+U,gBAcb,IAAAG,GAAA,SAAAU,GAAA,SAAAV,IAAA,IAAAY,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASiV,kBAMlB,OAPqCvG,EAAAX,EAAAU,GAOrCV,EAPA,CAAqC+E,GAAxBja,EAAAkV,mBAUb,IAAAI,GAAA,SAAAM,GAAA,SAAAN,IAAA,IAAAQ,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASkV,sBAClB,OAFyCxG,EAAAP,EAAAM,GAEzCN,EAFA,CAAyCwF,IAA5B9a,EAAAsV,uBAKb,IAAAF,GAAA,SAAAQ,GAAA,SAAAR,IAAA,IAAAU,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASkT,WAMlB,OAPuCxE,EAAAT,EAAAQ,GAOvCR,EAPA,CAAuCiE,GAA1BrZ,EAAAoV,qBAUb,IAAAI,GAAA,SAAAI,GAAA,SAAAJ,IAAA,IAAAM,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASmV,OAIlB,OALmCzG,EAAAL,EAAAI,GAKnCJ,EALA,CAAmC6D,GAAtBrZ,EAAAwV,iBAQb,IAAAE,GAAA,SAAAE,GAAA,SAAAF,IAAA,IAAAI,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACEwV,EAAAzO,KAAOF,EAASoV,QAMlB,OAPoC1G,EAAAH,EAAAE,GAOpCF,EAPA,CAAoC2D,GAqBpC,SAAgBe,GAAmBjO,EAAmCqQ,QAAA,IAAAA,OAAA,GACpE,IAAItb,EAAOiL,EAAYjL,KAAKwE,KACxBwC,EAASiE,EAAYjE,OACzB,OAAKA,IAEHiE,EAAY9E,MAAQF,EAASkV,qBAC7BnU,EAAOb,MAAQF,EAASkT,WAElBnS,EAASA,EAAOA,SAEpBA,EAAOb,MAAQF,EAASsT,iBACnBL,GAAqClS,EAAQsU,IAClDrQ,EAAY9D,GAAGtB,EAAApE,YAAY+X,QACvB3T,EAAA9D,iBACA8D,EAAA/D,oBACF9B,EAGJgH,EAAOb,MAAQF,EAASmT,sBACxBpS,EAAOb,MAAQF,EAASgU,gBAEjBf,GAAyClS,EAAQsU,GACjDzV,EAAA9D,iBAAmB/B,EAErBsb,EACHtb,EACAiL,EAAYzH,MAAMU,OAAOsM,aAAe3K,EAAAnE,eAAiB1B,EAvBzCA,EA2BtB,SAAgByQ,GAAmBN,GAEjC,OADIA,EAAKoL,SAAS,SAAQpL,EAAOA,EAAKnL,UAAU,EAAGmL,EAAKzL,OAAS,IAC1DyL,EAMT,SAASvI,GAAUoC,EAAehD,GAChC,IAAK,IAAIvH,EAAI,EAAGwK,EAAID,EAAMtF,OAAQjF,EAAIwK,IAAKxK,EACzCuK,EAAMvK,GAAGuH,OAASA,EA7DTlI,EAAA0V,kBAUb1V,EAAA0c,cAAA,SAA8BrV,EAAqBkJ,GACjD,GAAIA,EACF,IAAK,IAAI5P,EAAI,EAAGwK,EAAIoF,EAAW3K,OAAQjF,EAAIwK,IAAKxK,EAAG,CACjD,IAAIgc,EAAYpM,EAAW5P,GAC3B,GAAIgc,EAAUtS,eAAiBhD,EAAM,OAAOsV,EAGhD,OAAO,MAIT3c,EAAAoa,sBA8BApa,EAAA2R,q7BCn9DA,IA0IYiL,EA1IZ7V,EAAAtG,EAAA,GAgBAoc,EAAApc,EAAA,GAMAqc,EAAArc,EAAA,GAOAsc,EAAAtc,EAAA,GAsCAuc,EAAAvc,EAAA,GAuCAwc,EAAAxc,EAAA,IAKAyc,EAAA,WAKA,OALA,gBAQAC,EAAA,WAIA,OAJA,gBAOAC,EAAA,WAGA,OAHA,gBA4DA,SAASC,EAA0BhT,EAA8BiT,GAE/D,OADAvZ,OAAOuZ,EAAI1X,QACHyE,GACN,KAAK0S,EAAA1G,cAAcO,SACnB,KAAKmG,EAAA1G,cAAcW,gBACjB,OAAQsG,EAAItX,WAAW,IACrB,QACE,GAAW,MAAPsX,EAAa,OAAOV,EAAaW,YACrC,GAAW,OAAPD,EAAc,OAAOV,EAAaY,YACtC,MAEF,SACE,GAAW,MAAPF,EAAa,OAAOV,EAAaa,sBACrC,GAAW,OAAPH,EAAc,OAAOV,EAAac,sBACtC,MAEF,QACE,GAAW,KAAPJ,EAAY,OAAOV,EAAae,IACpC,MAEF,QACE,GAAW,KAAPL,EAAY,OAAOV,EAAagB,IACpC,MAEF,QACE,GAAW,KAAPN,EAAY,OAAOV,EAAaiB,IACpC,GAAW,MAAPP,EAAa,OAAOV,EAAakB,IACrC,MAEF,QACE,GAAW,KAAPR,EAAY,OAAOV,EAAamB,IACpC,MAEF,QACE,GAAW,KAAPT,EAAY,OAAOV,EAAaoB,IACpC,MAEF,QACE,GAAW,KAAPV,EAAY,OAAOV,EAAaqB,YACpC,MAEF,SACE,GAAW,KAAPX,EAAY,OAAOV,EAAasB,WACpC,MAEF,QACE,GAAW,KAAPZ,EAAY,OAAOV,EAAauB,YACpC,MAEF,QACE,GAAW,MAAPb,EAAa,OAAOV,EAAawB,GACrC,MAEF,QACE,GAAW,MAAPd,EAAa,OAAOV,EAAayB,GACrC,MAEF,QACE,GAAW,KAAPf,EAAY,OAAOV,EAAa0B,GACpC,GAAW,MAAPhB,EAAa,OAAOV,EAAa2B,GACrC,GAAW,MAAPjB,EAAa,OAAOV,EAAa4B,YACrC,GAAW,OAAPlB,EAAc,OAAOV,EAAa6B,cACtC,MAEF,QACE,GAAW,KAAPnB,EAAY,OAAOV,EAAa8B,GACpC,GAAW,MAAPpB,EAAa,OAAOV,EAAa+B,GACrC,GAAW,MAAPrB,EAAa,OAAOV,EAAagC,YAIzC,MAEF,KAAK7B,EAAA1G,cAAcY,gBACjB,OAAQqG,EAAItX,WAAW,IACrB,QACE,GAAW,KAAPsX,EAAY,OAAOV,EAAaiC,KACpC,GAAW,MAAPvB,EAAa,OAAOV,EAAakC,WACrC,MAEF,QACE,GAAW,KAAPxB,EAAY,OAAOV,EAAamC,MACpC,GAAW,MAAPzB,EAAa,OAAOV,EAAaoC,WACrC,MAEF,QACE,GAAW,KAAP1B,EAAY,OAAOV,EAAaqC,IACpC,MAEF,SACE,GAAW,KAAP3B,EAAY,OAAOV,EAAasC,YAIxC,MAEF,KAAKnC,EAAA1G,cAAca,iBACjB,OAAQoG,EAAItX,WAAW,IACrB,QACE,GAAW,MAAPsX,EAAa,OAAOV,EAAauC,YACrC,MAEF,QACE,GAAW,MAAP7B,EAAa,OAAOV,EAAawC,aAO7C,OAAOxC,EAAayC,SA9JtB,SAAYzC,GACVA,IAAA,qBAGAA,IAAA,6BACAA,IAAA,6BACAA,IAAA,iDACAA,IAAA,iDAGAA,IAAA,aACAA,IAAA,aACAA,IAAA,aACAA,IAAA,aACAA,IAAA,aACAA,IAAA,cACAA,IAAA,8BACAA,IAAA,4BACAA,IAAA,8BACAA,IAAA,8BACAA,IAAA,8BACAA,IAAA,kCACAA,IAAA,YACAA,IAAA,YACAA,IAAA,YACAA,IAAA,YACAA,IAAA,YACAA,IAAA,YAGAA,IAAA,gBACAA,IAAA,kBACAA,IAAA,cACAA,IAAA,8BACAA,IAAA,4BACAA,IAAA,4BAGAA,IAAA,8BACAA,IAAA,8BAvCF,CAAYA,EAAA5c,EAAA4c,eAAA5c,EAAA4c,kBAiKZ,IA+uDY0C,EAmCAC,EAlxDNC,EAAa,IAAIC,IAGvBC,EAAA,SAAA9J,GAwDE,SAAA8J,EAAYlZ,QAAA,IAAAA,MAAA,MAAZ,IAAAsP,EACEF,EAAA9U,KAAAR,KAAMkG,IAAYlG,YAlDpBwV,EAAA6J,kBAAyB,EAKzB7J,EAAA8J,eAAsC,IAAIH,IAE1C3J,EAAA+J,gBAAuC,IAAIJ,IAE3C3J,EAAAgK,YAAgCN,EAEhC1J,EAAAiK,YAAqC,IAAIN,IAEzC3J,EAAAkK,iBAAwC,IAAIP,IAE5C3J,EAAAmK,mBAA+C,IAAIR,IAGnD3J,EAAAoK,oBAAoC,KAEpCpK,EAAAqK,eAAwC,KAExCrK,EAAAsK,eAA+B,KAI/BtK,EAAAuK,aAAyC,KAEzCvK,EAAAwK,cAAiC,KAEjCxK,EAAAyK,uBAA0C,KAG1CzK,EAAA0K,OAAc,EAEd1K,EAAA2K,mBAAsC,KAEtC3K,EAAA4K,eAAkC,KAElC5K,EAAA6K,eAAkC,KAElC7K,EAAA8K,aAAoB,EAEpB9K,EAAA+K,aAAoB,EAQlB/K,EAAKgL,SAAW,IAAI7D,EAAA8D,SAASjL,GAC7BA,EAAKkL,aA8qDT,OAzuD6BnL,EAAA6J,EAAA9J,GA+D3B8J,EAAAnd,UAAA0e,UAAA,SAAU5b,GAER,IADA,IAAI2b,EAAU1gB,KAAK0gB,QACVrgB,EAAI,EAAGwK,EAAI6V,EAAQpb,OAAQjF,EAAIwK,IAAKxK,EAAG,CAC9C,IAAIyE,EAAS4b,EAAQrgB,GACrB,GAAIyE,EAAOC,gBAAkBA,EAAgB,OAAOD,EAEtD,OAAO,MAITsa,EAAAnd,UAAA2e,mBAAA,SAAmBC,GACjB,IAAIC,EACJ,OACE9gB,KAAK2gB,UAAUE,EAAiC,QAChD7gB,KAAK2gB,UAAUE,EAAiC,cAChD7gB,KAAK2gB,WAAWG,EAAMra,EAAA3D,eAAiB+d,GAAkC,QACzE7gB,KAAK2gB,UAAWG,EAAyD,cAK7E1B,EAAAnd,UAAA8e,WAAA,SAAWC,eACThhB,KAAKghB,QAAUA,EAGfhhB,KAAKwf,YAAc,IAAIL,MACpB,KAAM3C,EAAAyE,KAAKC,KACX,MAAO1E,EAAAyE,KAAKE,MACZ,MAAO3E,EAAAyE,KAAKG,MACZ,MAAO5E,EAAAyE,KAAKI,MACZ,QAASL,EAAQM,YACjB,KAAM9E,EAAAyE,KAAKM,KACX,MAAO/E,EAAAyE,KAAKO,MACZ,MAAOhF,EAAAyE,KAAKQ,MACZ,MAAOjF,EAAAyE,KAAKS,MACZ,QAASV,EAAQW,YACjB,OAAQnF,EAAAyE,KAAKW,OACb,MAAOpF,EAAAyE,KAAKY,MACZ,MAAOrF,EAAAyE,KAAKa,MACZ,OAAQtF,EAAAyE,KAAKc,OACb,SAAUvF,EAAAyE,KAAKa,MACf,UAAWtF,EAAAyE,KAAKW,QAInB5hB,KAAKgiB,mBAAmB,aAAcxF,EAAAyE,KAAKG,IACzCa,QAAQjB,EAAQkB,SAAW,EAAI,IACjCliB,KAAKgiB,mBAAmB,qBAAsBxF,EAAAyE,KAAKW,KACjDK,QAAQjB,EAAQmB,cAAgB,EAAI,EAAG,IACzCniB,KAAKgiB,mBAAmB,gBAAiBxF,EAAAyE,KAAKW,KAC5CK,QAAQjB,EAAQoB,SAAW,EAAI,EAAG,IACpCpiB,KAAKgiB,mBAAmB,kBAAmBxF,EAAAyE,KAAKG,IAC9Ca,QAAQjB,EAAQqB,WAAY,IAC9BriB,KAAKgiB,mBAAmB,qBAAsBxF,EAAAyE,KAAKG,IACjDa,QAAQjB,EAAQsB,kBAAmB,IACrCtiB,KAAKgiB,mBAAmB,mBAAoBxF,EAAAyE,KAAKG,IAC/Ca,QAAQjB,EAAQuB,gBAAiB,IACnCviB,KAAKgiB,mBAAmB,6BAA8BxF,EAAAyE,KAAKW,KACzDK,QAAQjB,EAAQwB,WAAU,GAA2B,EAAI,EAAG,IAC9DxiB,KAAKgiB,mBAAmB,6BAA8BxF,EAAAyE,KAAKW,KACzDK,QAAQjB,EAAQwB,WAAU,GAA2B,EAAI,EAAG,IAS9D,IANA,IAAIC,EAAgB,IAAItc,MACpBuc,EAAgB,IAAIvD,IACpBwD,EAAgB,IAAIxc,MACpByc,EAAmB,IAAIzc,MAGlB9F,EAAI,EAAGwK,EAAI7K,KAAK0gB,QAAQpb,OAAQjF,EAAIwK,IAAKxK,EAAG,CACnD,IAAIyE,EAAS9E,KAAK0gB,QAAQrgB,GAGtBwiB,EAAY,IAAIC,EAAU9iB,KAAM8E,GACpC9E,KAAKsf,eAAepX,IAAI2a,EAAUE,aAAcF,GAChD7iB,KAAKgjB,iBAAmBH,EAIxB,IADA,IAAItT,EAAazK,EAAOyK,WACf0T,EAAI,EAAG3iB,EAAIiP,EAAWjK,OAAQ2d,EAAI3iB,IAAK2iB,EAAG,CACjD,IAAI3S,EAAYf,EAAW0T,GAC3B,OAAQ3S,EAAUvJ,MAChB,KAAK0V,EAAA5V,SAASsT,iBACZna,KAAKkjB,gBAAkC5S,EAAWqS,EAAeC,GACjE,MAEF,KAAKnG,EAAA5V,SAASgU,gBACZ7a,KAAKmjB,eAAgC7S,GACrC,MAEF,KAAKmM,EAAA5V,SAASoT,OACZja,KAAKojB,kBAAmC9S,EAAWoS,GACnD,MAEF,KAAKjG,EAAA5V,SAAS+R,oBACZ5Y,KAAKqjB,mBAAwC/S,GAC7C,MAEF,KAAKmM,EAAA5V,SAAS0U,OACZvb,KAAKsjB,kBAAmChT,EAAWoS,EAAeD,GAClE,MAEF,KAAKhG,EAAA5V,SAAS2U,qBACZxb,KAAKujB,oBAA0CjT,GAC/C,MAEF,KAAKmM,EAAA5V,SAASmT,qBACZha,KAAKwjB,oBAA0ClT,EAAWqS,EAAeC,GACzE,MAEF,KAAKnG,EAAA5V,SAASiV,gBACZ9b,KAAKyjB,oBAAqCnT,GAC1C,MAEF,KAAKmM,EAAA5V,SAASkT,SACZ/Z,KAAK0jB,oBAAuCpT,KAQpD,IAASjQ,EAAI,EAAGA,EAAIoiB,EAAcnd,QAAS,CACzC,IAAIqe,EAAelB,EAAcpiB,GAEjC,GADIwL,EAAc8X,EAAa9X,aAEzBQ,EAAUrM,KAAK4jB,gBAAgBD,EAAapS,aAAcmR,KAE5D1iB,KAAKsf,eAAepX,IAAIyb,EAAaE,UAAWxX,GAChDoW,EAAcqB,OAAOzjB,EAAG,KAEpBgM,EAAUrM,KAAK4jB,gBAAgBD,EAAaI,gBAAiBrB,KAC/D1iB,KAAKsf,eAAepX,IAAIyb,EAAaE,UAAWxX,GAChDoW,EAAcqB,OAAOzjB,EAAG,KAExBL,KAAKuG,MACHgW,EAAAzY,eAAekgB,kCACfnY,EAAYzH,MACMyH,EAAYjE,OAAQmJ,KAAKzP,MAC3CuK,EAAY0F,aAAanM,QAEzB/E,QAIFgM,EAAUrM,KAAKsf,eAAepe,IAAIyiB,EAAapS,gBAEjDvR,KAAKsf,eAAepX,IAAIyb,EAAaE,UAAWxX,GAChDoW,EAAcqB,OAAOzjB,EAAG,KAEpBgM,EAAUrM,KAAKsf,eAAepe,IAAIyiB,EAAaI,mBACjD/jB,KAAKsf,eAAepX,IAAIyb,EAAaE,UAAWxX,GAChDoW,EAAcqB,OAAOzjB,EAAG,KAExBoD,QAAO,KACLpD,OAOV,IAAuC,IAAA4jB,EAAAC,EAAAxB,GAAayB,EAAAF,EAAAG,QAAAD,EAAAE,KAAAF,EAAAF,EAAAG,OAAE,CAA7C,IAAAE,EAAAC,EAAAJ,EAAA7iB,MAAA,GAACkjB,EAAAF,EAAA,GAAYG,EAAAH,EAAA,GAChBI,EAAqCD,EACrCpY,OAAO,EACX,EAAG,CACD,IAAIqY,EAAcC,WAkBX,EAGFtY,EAAUrM,KAAKsf,eAAepe,IAAIwjB,EAAcnT,iBAEhDlF,EAAUrM,KAAKsf,eAAepe,IAAIwjB,EAAcpK,OAAO1Z,KAAKwE,OAE7DpF,KAAK4kB,yBACHJ,EACAnY,EACAoY,EAAanK,OAAO/I,cAGtBvR,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACfJ,EAAanK,OAAOlW,MAAOqgB,EAAanK,OAAO1Z,KAAKwE,MAGxD,MAnCA,GAAIiH,EAAUrM,KAAK0f,iBAAiBxe,IAAIwjB,EAAcnT,cAAe,CACnEvR,KAAK4kB,yBACHJ,EACAnY,EACAoY,EAAanK,OAAO/I,cAEtB,OAEFmT,EAAgBhC,EAAcxhB,IAAIwjB,EAAcnT,gBAE9CvR,KAAKuG,MACHgW,EAAAzY,eAAekgB,kCACfS,EAAanK,OAAO/I,aAAanN,MACWqgB,EAAanK,OAAO1S,OAAQmJ,KAAMzP,MAC9EmjB,EAAanK,OAAO/I,aAAanM,YAuBhCsf,qGAIX,IAAIlE,EAAWxgB,KAAKwgB,SACpB,IAASngB,EAAI,EAAGwK,EAAI8X,EAAcrd,OAAQjF,EAAIwK,IAAKxK,EAAG,CACpD,IAAIykB,EAAmBnC,EAActiB,GACjC0kB,EAAqBD,EAAiBjZ,YACtCmZ,EAAcvhB,OAAOshB,EAAmBnc,aACxCqc,EAAczE,EAAS0E,kBAAkBF,EAAYpkB,KAAM,MAC/D,GAAKqkB,EACL,GAAIA,EAAYle,MAAQiY,EAAYmG,gBAAiB,CACnD,IAAIC,EAAgCH,EACpCH,EAAiBM,cAAgBA,OAEjCplB,KAAKuG,MACHgW,EAAAzY,eAAeuhB,sCACfL,EAAY5gB,OAOhB,IAAIkhB,EAAgBtE,EAAQsE,cAC5B,GAAIA,MACF,IAA0B,IAAAC,EAAArB,EAAAoB,GAAaE,EAAAD,EAAAnB,QAAAoB,EAAAnB,KAAAmB,EAAAD,EAAAnB,OAAE,CAAhC,IAAAqB,EAAAlB,EAAAiB,EAAAlkB,MAAA,GAACqT,EAAA8Q,EAAA,GAAO7kB,EAAA6kB,EAAA,GACf,GAAK7kB,EAAK0E,OAAV,CAEA,KADI+G,EAAUrM,KAAKsf,eAAepe,IAAIN,IAEjC,MAAM,IAAI8kB,MAAM,sBAAwB9kB,GADhCZ,KAAKsf,eAAepX,IAAIyM,EAAOtI,sGAOlD,GAAIrM,KAAKsf,eAAeqG,IAAI,eAAgB,CACtCtZ,EAAU5I,OAAOzD,KAAKsf,eAAepe,IAAI,gBAC7CuC,OAAO4I,EAAQtF,MAAQiY,EAAYmG,iBACnCnlB,KAAK4f,oBAAsBY,EAASoF,aAA6BvZ,EAAS,MAI5E,GAAIrM,KAAKsf,eAAeqG,IAAI,SAAU,CAChCtZ,EAAU5I,OAAOzD,KAAKsf,eAAepe,IAAI,UAC7CuC,OAAO4I,EAAQtF,MAAQiY,EAAYmG,iBACnCnlB,KAAK6f,eAAiCxT,EAIxC,GAAIrM,KAAKsf,eAAeqG,IAAI,UAAW,CACjCtZ,EAAU5I,OAAOzD,KAAKsf,eAAepe,IAAI,WAG7C,GAFAuC,OAAO4I,EAAQtF,MAAQiY,EAAYmG,iBAC/BU,EAAWrF,EAASoF,aAA6BvZ,EAAS,MAE5D,GAAIrM,KAAKwf,YAAYmG,IAAI,UAAW,CAClC,IAAI9Z,EAA+BQ,EAASR,YAC5C7L,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOyH,EAAYka,+BAGtC/lB,KAAK8f,eAAiB+F,EACtB7lB,KAAKwf,YAAYtX,IAAI,SAAU2d,EAASvd,MAOxC+D,EAAU5I,OAAOzD,KAAKsf,eAAepe,IAAI,WAC7CuC,OAAO4I,EAAQtF,MAAQiY,EAAYgH,oBACnChmB,KAAKimB,cAAmC5Z,EAItCrM,KAAK2f,mBAAmBgG,IAAI,YAC1BtZ,EAAyBrM,KAAK2f,mBAAmBze,IAAI,QAASmL,SAExDtF,MAAQiY,EAAYgH,oBACP3Z,EAASpE,MAAMxB,EAAApE,YAAY6jB,QAAUzf,EAAApE,YAAY8jB,WAElD9Z,EAASnE,IAAIzB,EAAApE,YAAY+jB,MAC7CpmB,KAAK+f,aAAkC1T,IAK3C,GAAIrM,KAAKsf,eAAeqG,IAAI,SAAU,CAChCtZ,EAAmBrM,KAAKsf,eAAepe,IAAI,SAC/CuC,OAAO4I,EAAQtF,MAAQiY,EAAYgH,qBAC/BH,EAAW7lB,KAAKwgB,SAAS6F,gBAAmCha,EAAS,SAC3DrM,KAAKggB,cAAgB6F,GAIrC,GAAI7lB,KAAKsf,eAAeqG,IAAI,UAAW,CACrC,IAMQE,EALJ7V,GADA3D,EAAmBrM,KAAKsf,eAAepe,IAAI,WACzB8O,QACtB,GAAIA,EACF,GAAIA,EAAQ2V,IAAI,YACdtZ,EAAU5I,OAAOuM,EAAQ9O,IAAI,aAC7BuC,OAAO4I,EAAQtF,MAAQiY,EAAYgH,qBAC/BH,EAAW7lB,KAAKwgB,SAAS6F,gBAAmCha,EAAS,SAC3DrM,KAAKigB,uBAAyB4F,GAMlD,GACE7lB,KAAKsf,eAAeqG,IAAI,kBACxB3lB,KAAKsf,eAAeqG,IAAI,cACxB3lB,KAAKsf,eAAeqG,IAAI,aACxB,CAEItZ,EAAmBrM,KAAKsf,eAAepe,IAAI,iBAC/CuC,OAAO4I,EAAQtF,MAAQiY,EAAYgH,oBACnC,IAAI7F,EAAqB1c,OAAOzD,KAAKwgB,SAAS6F,gBAAmCha,EAAS,OACtF4G,EAAYkN,EAAmBlN,UACnCxP,OAA0C,GAAnCwP,EAAUqT,eAAehhB,QAChC7B,OAAOwP,EAAUqT,eAAe,IAAMtmB,KAAKghB,QAAQW,WACnDle,OAAOwP,EAAUqT,eAAe,GAAGC,oBACnC9iB,OAAOwP,EAAU3J,YAActJ,KAAKghB,QAAQW,WAG5CtV,EAAmBrM,KAAKsf,eAAepe,IAAI,aAC3CuC,OAAO4I,EAAQtF,MAAQiY,EAAYgH,oBACnC,IAAI5F,EAAiB3c,OAAOzD,KAAKwgB,SAAS6F,gBAAmCha,EAAS,OACtF4G,EAAYmN,EAAenN,UAC3BxP,OAA0C,GAAnCwP,EAAUqT,eAAehhB,QAChC7B,OAAOwP,EAAUqT,eAAe,IAAMtmB,KAAKghB,QAAQW,WACnDle,OAAOwP,EAAUqT,eAAe,IAAMtmB,KAAKghB,QAAQW,WACnDle,OAAOwP,EAAU3J,YAAckT,EAAAyE,KAAKc,MAGpC1V,EAAmBrM,KAAKsf,eAAepe,IAAI,aAC3CuC,OAAO4I,EAAQtF,MAAQiY,EAAYgH,oBACnC,IAAI3F,EAAiB5c,OAAOzD,KAAKwgB,SAAS6F,gBAAmCha,EAAS,OACtF4G,EAAYoN,EAAepN,UAC3BxP,OAA0C,GAAnCwP,EAAUqT,eAAehhB,QAChC7B,OAAOwP,EAAUqT,eAAe,IAAMtmB,KAAKghB,QAAQW,WACnDle,OAAOwP,EAAU3J,YAAckT,EAAAyE,KAAKc,MAEpC/hB,KAAKmgB,mBAAqBA,EAC1BngB,KAAKogB,eAAiBA,EACtBpgB,KAAKqgB,eAAiBA,EACtB,IAAIE,EAAe,EAAIS,EAAQW,UAAU6E,SACzCxmB,KAAKugB,aAAgBA,EACrBvgB,KAAKsgB,aAAgBC,EAAe,EAAI,GAAK,EAC7CvgB,KAAKkgB,OAAQ,IAKjBd,EAAAnd,UAAA+f,mBAAA,SAAmByE,EAAoBne,EAAYhH,GACjDmC,OAAO6E,EAAKP,GAAE,IACd,IAAI2e,EAAS,IAAIC,EAAO3mB,KAAMymB,EAAYA,EAAYne,EAAM,KAAM2W,EAAenX,MAC9E8e,yBAAyBtlB,GAC5BolB,EAAOxe,IAAIzB,EAAApE,YAAYwkB,UACvB7mB,KAAKsf,eAAepX,IAAIue,EAAYC,IAItCtH,EAAAnd,UAAA6kB,iBAAA,SAAiBL,EAAoBne,EAAYhH,GAC/CmC,OAAO6E,EAAKP,GAAE,IACd,IAAI2e,EAAS,IAAIC,EAAO3mB,KAAMymB,EAAYA,EAAYne,EAAM,KAAM2W,EAAenX,MAC9Eif,uBAAuBzlB,GAC1BolB,EAAOxe,IAAIzB,EAAApE,YAAYwkB,UACvB7mB,KAAKsf,eAAepX,IAAIue,EAAYC,IAI9BtH,EAAAnd,UAAA2hB,gBAAR,SACErS,EACAyV,GAIA,IAFA,IAAI3a,EACAqT,EAAmB1f,KAAK0f,mBACzB,CACD,GAAIrT,EAAUqT,EAAiBxe,IAAIqQ,GAAe,OAAOlF,EACzD,IAAIoY,EAAeuC,EAAmB9lB,IAAIqQ,GAC1C,IAAKkT,EAAc,MACnB,IAAIA,EAAaE,WAIjB,OAAO3kB,KAAKsf,eAAepe,IAAIujB,EAAalT,cAH1CA,EAAekT,EAAalT,aAKhC,OAAO,MAID6N,EAAAnd,UAAAglB,gBAAR,SACEhX,EACAiX,GAGA,IADA,IAAIC,EAAelI,EAAenX,KACzBzH,EAAI,EAAGwK,EAAIoF,EAAW3K,OAAQjF,EAAIwK,IAAKxK,EAAG,CACjD,IAAIgc,EAAYpM,EAAW5P,GAEvB2H,EAAOof,EADA3K,EAAAzS,oBAAoBqS,EAAUzb,OAErCoH,IACEA,GAAQiX,EAAe/I,QACrBmG,EAAUjY,MAAMU,OAAOuiB,UACzBF,GAAgBnf,EAEhBhI,KAAKuG,MACHgW,EAAAzY,eAAewjB,8BACfjL,EAAUjY,MAAOiY,EAAUzb,KAAKwD,MAAMS,YAG/BqiB,EAAgBlf,EAKlBmf,EAAenf,EACxBhI,KAAKuG,MACHgW,EAAAzY,eAAeyjB,oBACflL,EAAUjY,MAAOiY,EAAUzb,KAAKwD,MAAMS,YAGxCsiB,GAAgBnf,EAVhBhI,KAAKuG,MACHgW,EAAAzY,eAAewjB,8BACfjL,EAAUjY,MAAOiY,EAAUzb,KAAKwD,MAAMS,aAY9C,OAAOsiB,GAID/H,EAAAnd,UAAAulB,YAAR,SACEnb,EACAR,GAEA,IAAI4b,EAAa5b,EAAYjE,OAE7B,GACGyE,EAAQqb,aAAazI,EAAe7I,SAEnCvK,EAAYzH,MAAMU,OAAOuiB,WACzBhb,EAAQtE,GAAGtB,EAAApE,YAAY4X,UAErBxW,OAAOgkB,GAAY1gB,MAAQ0V,EAAA5V,SAASoS,QAE5BwO,EAAY1gB,MAAQ0V,EAAA5V,SAASkT,UACnCtW,OAAcgkB,EAAY7f,QAAQb,MAAQ0V,EAAA5V,SAASoS,QAGzD,CACA,IAAIwN,EAAa5a,EAAYka,yBACzB/lB,KAAKsf,eAAeqG,IAAIc,GAC1BzmB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOiI,EAAQ0W,cAGlC/iB,KAAKsf,eAAepX,IAAIue,EAAYpa,GAIpCA,EAAQqb,aAAazI,EAAe/I,WACtC7J,EAAQ0W,aAAelX,EAAYka,2BAK/B3G,EAAAnd,UAAAihB,gBAAR,SACErX,EACA8W,EACAC,EACA+E,QAAA,IAAAA,MAAA,MAEA,IAAI5E,EAAelX,EAAY+b,sBAC/B,GAAI5nB,KAAKsf,eAAeqG,IAAI5C,GAC1B/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,OAH5B,CAQA,IAAI9S,EAAapE,EAAYoE,WACzB4X,EAAahc,EAAYjL,KAAKwE,KAC9BnD,EAAY,IAAI6lB,EAClB9nB,KACA6nB,EACA9E,EACAlX,EACAoE,EACIjQ,KAAKinB,gBAAgBhX,EACnBgP,EAAe7I,OACf6I,EAAe1I,OACf0I,EAAezI,WAEjByI,EAAenX,MAErB7F,EAAU2F,OAAS+f,EACnB3nB,KAAKsf,eAAepX,IAAI6a,EAAc9gB,GAEtC,IAAI8N,EAAkBlE,EAAYkE,gBAClC,GAAIA,EAAiB,CACnB,IAAIgY,EAAqBhY,EAAgBzK,OACzC,GAAIrD,EAAUylB,aAAazI,EAAezI,WACpCuR,GACF/nB,KAAKuG,MACHgW,EAAAzY,eAAekkB,8CACfvL,EAAA7V,MAAMd,KACJ+F,EAAYjL,KAAKwD,MACjB2L,EAAgBgY,EAAqB,GAAG3jB,aAMzC,GAAI2jB,EAAoB,CAC7B,IAAK,IAAI1nB,EAAI,EAAGA,EAAI0nB,IAAsB1nB,EACxCL,KAAKsG,QACHiW,EAAAzY,eAAemkB,wBACflY,EAAgB1P,GAAG+D,OAGvBwe,EAAiB/c,KAAK5D,IAQ1B,GAHI4J,EAAYjD,aAAa+Z,EAAc9c,KAAK5D,GAG5C0lB,EAAW,CACb,GAAIA,EAAU3X,SACZ,GAAI2X,EAAU3X,QAAQ2V,IAAIkC,GAKxB,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B4E,EAAU3X,QAAU,IAAImP,IAE1BwI,EAAU3X,QAAQ9H,IAAI2f,EAAY5lB,GAC9B0lB,EAAU5f,GAAGtB,EAAApE,YAAY6lB,gBAAkBjmB,EAAU8F,GAAGtB,EAAApE,YAAY4X,SACtEhY,EAAUiG,IAAIzB,EAAApE,YAAY6lB,oBAIvB,GAAIjmB,EAAU8F,GAAGtB,EAAApE,YAAY4X,QAAS,CAC3C,GAAIja,KAAK0f,iBAAiBiG,IAAI5C,GAK5B,YAJA/iB,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACftc,EAAYjL,KAAKwD,MAAO2e,GAM5B,GAFA/iB,KAAK0f,iBAAiBxX,IAAI6a,EAAc9gB,GACxCjC,KAAKgjB,iBAAiBhT,QAAQ9H,IAAI2f,EAAY5lB,GAC1CA,EAAU8F,GAAGtB,EAAApE,YAAY4X,SAAWpO,EAAYzH,MAAMU,OAAOsjB,QAAS,CACxE,GAAIpoB,KAAK2f,mBAAmBgG,IAAIkC,GAAa,CAC3C,IAAIQ,EAA+BroB,KAAK2f,mBAAmBze,IAAI2mB,GAK/D,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACftc,EAAYjL,KAAKwD,MAAOikB,EAAehc,QAAQ0W,cAInD9gB,EAAUiG,IAAIzB,EAAApE,YAAY6lB,eAC1BloB,KAAK2f,mBAAmBzX,IAAI2f,GAC1Bxb,QAASpK,EACT4N,WAAYhE,EAAYjL,QAO9B,IADA,IAAI0nB,EAAqBzc,EAAYmE,QACrBnF,GAAPxK,EAAI,EAAOioB,EAAmBhjB,QAAQjF,EAAIwK,IAAKxK,EAAG,CACzD,IAAIkoB,EAAoBD,EAAmBjoB,GAC3C,OAAQkoB,EAAkBxhB,MACxB,KAAK0V,EAAA5V,SAASqU,iBACZlb,KAAKwoB,gBAAkCD,EAAmBtmB,GAC1D,MAEF,KAAKwa,EAAA5V,SAASgS,kBACR0P,EAAkBtgB,MAAMxB,EAAApE,YAAYomB,IAAMhiB,EAAApE,YAAYqmB,KACxD1oB,KAAK2oB,mBAAsCJ,EAAmBtmB,GAE9DjC,KAAK4oB,iBAAoCL,EAAmBtmB,GAE9D,MAEF,KAAKwa,EAAA5V,SAAS0T,0BAA2B,MACzC,QAEE,YADA9W,QAAO,IAMbzD,KAAKwnB,YAAYvlB,EAAW4J,KAItBuT,EAAAnd,UAAAumB,gBAAR,SACE3c,EACAgd,GAEA,IAAIjoB,EAAOiL,EAAYjL,KAAKwE,KACxB2d,EAAelX,EAAY+b,sBAC3B3X,EAAapE,EAAYoE,WACzB6Y,EAAcD,EAAe9hB,MAAQiY,EAAY+J,oBAGrD,GAAIld,EAAY9D,GAAGtB,EAAApE,YAAY+X,QAAS,CAKtC,GAJI0O,GAEFrlB,QAAO,GAELzD,KAAKsf,eAAeqG,IAAI5C,GAK1B,YAJA/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,GAI5B,GAAI8F,EAAe7Y,SACjB,GAAI6Y,EAAe7Y,QAAQ2V,IAAI/kB,GAK7B,YAJAZ,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B8F,EAAe7Y,QAAU,IAAImP,IAE/B,IAAI6J,EAAc,IAAIrC,EACpB3mB,KACAY,EACAmiB,EACAvG,EAAAyE,KAAKc,KACLlW,EACAoE,EACIjQ,KAAKinB,gBAAgBhX,EAAYgP,EAAe5I,QAChD4I,EAAenX,MAErBkhB,EAAYphB,OAASihB,EACrBA,EAAe7Y,QAAQ9H,IAAItH,EAAMooB,GACjChpB,KAAKsf,eAAepX,IAAI6a,EAAciG,GAClCH,EAAe9gB,GAAGtB,EAAApE,YAAY6lB,gBAChCc,EAAY9gB,IAAIzB,EAAApE,YAAY6lB,eAG1Bc,EAAYtB,aAAazI,EAAe5I,UAAY2S,EAAYjhB,GAAGtB,EAAApE,YAAY4mB,WACjFjpB,KAAKuG,MACHgW,EAAAzY,eAAewjB,8BACf7jB,OAAOgZ,EAAAL,cAAcK,EAAA1G,cAAcM,OAAQpG,IAAa7L,MAAO,cAK9D,CAKL,GAJI0kB,GAEFrlB,QAAQoI,EAAY5D,MAAMxB,EAAApE,YAAY6mB,SAAWziB,EAAApE,YAAYomB,IAAMhiB,EAAApE,YAAYqmB,MAE7EG,EAAeM,iBACjB,GAAIN,EAAeM,gBAAgBxD,IAAI/kB,GAKrC,YAJAZ,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B8F,EAAeM,gBAAkB,IAAIhK,IAEvC,IAAIiK,EAAgB,IAAIC,EACtBR,EACAjoB,EACAmiB,EACAlX,GAEEoE,GAAYjQ,KAAKinB,gBAAgBhX,EAAYgP,EAAenX,MAChE+gB,EAAeM,gBAAgBjhB,IAAItH,EAAMwoB,KAKrChK,EAAAnd,UAAA2mB,iBAAR,SACE/c,EACAgd,GAEA,IAAIhB,EAAahc,EAAYjL,KAAKwE,KAC9B2d,EAAelX,EAAY+b,sBAC3B3lB,EAAsC,KAEtCgO,EAAapE,EAAYoE,WACzBqZ,EAAiBrK,EAAenX,KAWpC,GAVImI,IACFqZ,EAAiBtpB,KAAKinB,gBAAgBhX,EACpCgP,EAAevI,gBACfuI,EAAetI,gBACfsI,EAAerI,iBACfqI,EAAe5I,SAKfxK,EAAY9D,GAAGtB,EAAApE,YAAY+X,QAAS,CAGtC,GAFA3W,OAAOoI,EAAYjL,KAAKmG,MAAQ0V,EAAA5V,SAAS8Q,aAErC3X,KAAKsf,eAAeqG,IAAI5C,GAK1B,YAJA/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBAAwBja,EAAYjL,KAAKwD,MACxD2e,GAIJ,GAAI8F,EAAe7Y,SACjB,GAAI6Y,EAAe7Y,QAAQ2V,IAAIkC,GAK7B,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B8F,EAAe7Y,QAAU,IAAImP,IAE/Bld,EAAY,IAAIsnB,EACdvpB,KACA6nB,EACA9E,EACAlX,EACAgd,EACAS,GAEFT,EAAe7Y,QAAQ9H,IAAI2f,EAAY5lB,GACvCjC,KAAKsf,eAAepX,IAAI6a,EAAc9gB,GAClC4mB,EAAe9gB,GAAGtB,EAAApE,YAAY6lB,gBAChCjmB,EAAUiG,IAAIzB,EAAApE,YAAY6lB,mBAIvB,CACL,GAAIW,EAAeM,iBACjB,GAAIN,EAAeM,gBAAgBxD,IAAIkC,GAKrC,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B8F,EAAeM,gBAAkB,IAAIhK,IAEvCld,EAAY,IAAIsnB,EACdvpB,KACA6nB,EACA9E,EACAlX,EACAgd,EACAS,GAKEzd,EAAYjL,KAAKmG,MAAQ0V,EAAA5V,SAAS8Q,YAChCkR,EAAeW,qBACjBxpB,KAAKuG,MACHgW,EAAAzY,eAAe2lB,qDACf5d,EAAYjL,KAAKwD,QAGnBnC,EAAUiG,IAAIzB,EAAApE,YAAYsV,aAC1BkR,EAAeW,qBAAuBvnB,GAGxC4mB,EAAeM,gBAAgBjhB,IAAI2f,EAAY5lB,GAE7C4mB,EAAe9gB,GAAGtB,EAAApE,YAAY6lB,gBAChCjmB,EAAUiG,IAAIzB,EAAApE,YAAY6lB,eAI9BloB,KAAK0pB,uBAAuB7d,EAAYoE,WAAYhO,EAAW4mB,IAGzDzJ,EAAAnd,UAAAynB,uBAAR,SACEzZ,EACAhO,EACA4mB,GAEA,GAAI5Y,EACF,IAAK,IAAI5P,EAAI,EAAGwK,EAAIoF,EAAW3K,OAAQjF,EAAIwK,IAAKxK,EAAG,CACjD,IAAIgc,EAAYpM,EAAW5P,GAC3B,OAAQgc,EAAUtS,eAChB,KAAK0S,EAAA1G,cAAcO,SACnB,KAAKmG,EAAA1G,cAAcW,gBACnB,KAAK+F,EAAA1G,cAAcY,gBACnB,KAAK8F,EAAA1G,cAAca,iBACjB,IAAI+S,EAAUtN,EAAUvS,WAAauS,EAAUvS,UAAUxE,QAAU,EACnE,GAAe,GAAXqkB,EAAc,CAChB,IAAIC,EAA0BvN,EAAUvS,UAAW,GACnD,GACE8f,EAAS7iB,MAAQ0V,EAAA5V,SAASG,SACN4iB,EAAUxS,aAAeqF,EAAAvF,YAAYkB,OACzD,CACA,IAAIrR,EAAOgW,EACTV,EAAUtS,cACgB6f,EAAUtoB,OAEtC,GAAIyF,GAAQuV,EAAayC,QACvB/e,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf2B,EAASxlB,WAEN,CACL,IAAIylB,EAAYhB,EAAeiB,mBAC3BD,EAAUlE,IAAI5e,GAChB/G,KAAKuG,MACHgW,EAAAzY,eAAeimB,kCACfH,EAASxlB,QAGXnC,EAAU+nB,aAAejjB,EACzB8iB,EAAU3hB,IAAInB,EAAM9E,UAIxBjC,KAAKuG,MACHgW,EAAAzY,eAAemmB,wBACfL,EAASxlB,YAIbpE,KAAKuG,MACHgW,EAAAzY,eAAeomB,+BACf7N,EAAUjY,MAAO,IAAKulB,EAAQ9kB,SAAS,OAS7Cua,EAAAnd,UAAA0mB,mBAAR,SACE9c,EACAgd,GAEA,IAAIhB,EAAahc,EAAYjL,KAAKwE,KAC9B+kB,EAAuBte,EAAY+b,sBACnCwC,EAAkBpqB,KAAKsf,eAAepe,IAAIipB,GAC1CE,EAAWxe,EAAY9D,GAAGtB,EAAApE,YAAYomB,KACtC6B,GAAQ,EACZ,GAAIF,GACF,GACEA,EAAgBrjB,MAAQiY,EAAYuL,UAI/B,OAHJF,EACcD,EAAiBI,gBACjBJ,EAAiBK,iBAOhC,YAJAzqB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO+lB,QAK5BC,EAAkB,IAAIM,EACpB1qB,KACA6nB,EACAsC,EACAtB,GAEFyB,GAAQ,EAGV,IAAIra,EAAapE,EAAYoE,WACzBqZ,EAAiBrK,EAAenX,KAChCmI,IACFqZ,EAAiBtpB,KAAKinB,gBAAgBhX,EACpCgP,EAAe5I,SAInB,IAAIsU,GAAYN,EAAW5jB,EAAAjE,cAAgBiE,EAAAhE,eAAiBolB,EAG5D,GAAIhc,EAAY9D,GAAGtB,EAAApE,YAAY+X,QAAS,CACtC,IAAIwQ,EAAa/B,EAAe9F,aAAetc,EAAA9D,iBAAmBgoB,EAClE,GAAI3qB,KAAKsf,eAAeqG,IAAIiF,GAK1B,YAJA5qB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOwmB,GAI5B,IAAIC,EAAkB,IAAItB,EACxBvpB,KACA2qB,EACAC,EACA/e,EACA,KACAyd,GAOF,GALIe,EACSD,EAAiBI,gBAAkBK,EAEnCT,EAAiBK,gBAAkBI,EAE5CP,EAAO,CACT,GAAIzB,EAAe7Y,SACjB,GAAI6Y,EAAe7Y,QAAQ2V,IAAIkC,GAK7B,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOwmB,QAK5B/B,EAAe7Y,QAAU,IAAImP,IAE/B0J,EAAe7Y,QAAQ9H,IAAI2f,EAAYuC,QAEvC3mB,OAAOolB,EAAe7Y,SAAW6Y,EAAe7Y,QAAQ2V,IAAIkC,IAE9D7nB,KAAKsf,eAAepX,IAAIiiB,EAAsBC,GAC1CvB,EAAe9gB,GAAGtB,EAAApE,YAAY6lB,gBAChCkC,EAAgBliB,IAAIzB,EAAApE,YAAY6lB,mBAI7B,CACL,IAAI4C,EAAejC,EAAe9F,aAAetc,EAAA/D,mBAAqBioB,EACtE,GAAI9B,EAAeM,iBACjB,GAAIN,EAAeM,gBAAgBxD,IAAIgF,GAKrC,YAJA3qB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO+lB,QAK5BtB,EAAeM,gBAAkB,IAAIhK,IAEvC,IAAI4L,EAAoB,IAAIxB,EAC1BvpB,KACA2qB,EACAG,EACAjf,EACAgd,EACAS,GAEEe,EACSD,EAAiBI,gBAAkBO,EAEnCX,EAAiBK,gBAAkBM,EAEhDlC,EAAeM,gBAAgBjhB,IAAIyiB,EAAUP,GAC7CpqB,KAAKsf,eAAepX,IAAIiiB,EAAsBC,GAC1CvB,EAAe9gB,GAAGtB,EAAApE,YAAY6lB,iBAChCkC,EAAgBliB,IAAIzB,EAAApE,YAAY6lB,eAChC6C,EAAkB7iB,IAAIzB,EAAApE,YAAY6lB,kBAKhC9I,EAAAnd,UAAAkhB,eAAR,SACEtX,EACA8b,QAAA,IAAAA,MAAA,MAEA,IAAI5E,EAAelX,EAAY+b,sBAC/B,GAAI5nB,KAAKsf,eAAeqG,IAAI5C,GAC1B/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,OAH5B,CAOA,IAAI8E,EAAahc,EAAYjL,KAAKwE,KAC9BiH,EAAU,IAAI2e,EAAKhrB,KAAM6nB,EAAY9E,EAAclX,GAIvD,GAHAQ,EAAQzE,OAAS+f,EACjB3nB,KAAKsf,eAAepX,IAAI6a,EAAc1W,GAElCsb,EAAW,CACb,GAAIA,EAAU3X,SACZ,GAAI2X,EAAU3X,QAAQ2V,IAAIkC,GAKxB,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B4E,EAAU3X,QAAU,IAAImP,IAE1BwI,EAAU3X,QAAQ9H,IAAI2f,EAAYxb,GAC9Bsb,EAAU5f,GAAGtB,EAAApE,YAAY6lB,gBAAkB7b,EAAQtE,GAAGtB,EAAApE,YAAY4X,SACpE5N,EAAQnE,IAAIzB,EAAApE,YAAY6lB,oBAErB,GAAI7b,EAAQtE,GAAGtB,EAAApE,YAAY4X,QAAS,CACzC,GAAIja,KAAK0f,iBAAiBiG,IAAI5C,GAK5B,YAJA/iB,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACftc,EAAYjL,KAAKwD,MAAO2e,GAM5B,GAFA/iB,KAAK0f,iBAAiBxX,IAAI6a,EAAc1W,GACxCrM,KAAKgjB,iBAAiBhT,QAAQ9H,IAAI2f,EAAYxb,GAC1CR,EAAYzH,MAAMU,OAAOsjB,QAAS,CACpC,GAAIpoB,KAAK2f,mBAAmBgG,IAAIkC,GAAa,CAC3C,IAAIQ,EAA+BroB,KAAK2f,mBAAmBze,IAAI2mB,GAK/D,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACftc,EAAYjL,KAAKwD,MAAOikB,EAAehc,QAAQ0W,cAInD1W,EAAQnE,IAAIzB,EAAApE,YAAY6lB,eACxBloB,KAAK2f,mBAAmBzX,IAAI2f,GAC1Bxb,QAAOA,EACPwD,WAAYhE,EAAYjL,QAM9B,IADA,IAAI8M,EAAS7B,EAAY6B,OAChBrN,EAAI,EAAGwK,EAAI6C,EAAOpI,OAAQjF,EAAIwK,IAAKxK,EAC1CL,KAAKirB,oBAAoBvd,EAAOrN,GAAIgM,GAGtCrM,KAAKwnB,YAAYnb,EAASR,KAGpBuT,EAAAnd,UAAAgpB,oBAAR,SACEpf,EACAqf,GAEA,IAAItqB,EAAOiL,EAAYjL,KAAKwE,KACxB2d,EAAelX,EAAY+b,sBAC/B,GAAIsD,EAAIlb,SACN,GAAIkb,EAAIlb,QAAQ2V,IAAI/kB,GAKlB,YAJAZ,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5BmI,EAAIlb,QAAU,IAAImP,IAEpB,IAAI7d,EAAQ,IAAI6pB,EAAUD,EAAKlrB,KAAMY,EAAMmiB,EAAclX,GACzDqf,EAAIlb,QAAQ9H,IAAItH,EAAMU,GAClB4pB,EAAInjB,GAAGtB,EAAApE,YAAY6lB,gBACrB5mB,EAAM4G,IAAIzB,EAAApE,YAAY6lB,gBAIlB9I,EAAAnd,UAAAmhB,kBAAR,SACE9S,EACAoS,GAEA,IAAI1S,EAAUM,EAAUN,QACxB,GAAIA,EACF,IAAK,IAAI3P,EAAI,EAAGwK,EAAImF,EAAQ1K,OAAQjF,EAAIwK,IAAKxK,EAC3CL,KAAKorB,iBAAiBpb,EAAQ3P,GAAIiQ,EAAUc,aAAcsR,QAG5D1iB,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf3X,EAAUlM,QAKRgb,EAAAnd,UAAA2iB,yBAAR,SACE7B,EACA1W,EACAgf,GAGArrB,KAAK0f,iBAAiBxX,IAAI6a,EAAc1W,GAGxC,IAAI+E,EAAeia,EAAmBjnB,MAAMU,OAAOsM,aAC/Cka,EAAS7kB,EAAA1D,iBAAmBqO,EAC5ByR,EAAY7iB,KAAKsf,eAAepe,IAAIoqB,GACnCzI,IAAWA,EAAYpf,OAAOzD,KAAKsf,eAAepe,IAAIoqB,EAAS7kB,EAAAnE,eAAiB,WACrFmB,OAAOof,EAAU9b,MAAQiY,EAAYuM,WACrC,IAAI1D,EAAawD,EAAmBjmB,KACxByd,EAAW7S,QAAQ9H,IAAI2f,EAAYxb,GAG/C,IAAIvH,EAASumB,EAAmBjnB,MAAMU,OAClCA,EAAOuiB,UACLrnB,KAAKsf,eAAeqG,IAAIkC,GAC1B7nB,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACfkD,EAAmBjnB,MAAOyjB,IAG5Bxb,EAAQ0W,aAAe8E,EACvB7nB,KAAKsf,eAAepX,IAAI2f,EAAYxb,IAI7BvH,EAAOsjB,SAChBpoB,KAAK2f,mBAAmBzX,IAAImjB,EAAmBjmB,MAC7CiH,QAAOA,EACPwD,WAAYwb,KAKVjM,EAAAnd,UAAAmpB,iBAAR,SACE9Q,EACAlJ,EACAsR,GAEA,IAQI8I,EACAC,EACAhH,EAVAlT,EAAe+I,EAAOlW,MAAMU,OAAOsM,aAAe3K,EAAAnE,eAAiBgY,EAAO/I,aAAanM,KAC3F,GAAIpF,KAAK0f,iBAAiBiG,IAAIpU,GAC5BvR,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACf7N,EAAO/I,aAAanN,MAAOmN,QAS/B,GAAoB,MAAhBH,EAAsB,CAIxB,GAHAoa,EAAiBlR,EAAOlW,MAAMU,OAAOsM,aAAe3K,EAAAnE,eAAiBgY,EAAO1Z,KAAKwE,KAG7EpF,KAAKsf,eAAeqG,IAAI6F,GAM1B,YALAxrB,KAAK4kB,yBACHrT,EACSvR,KAAKsf,eAAepe,IAAIsqB,GACjClR,EAAO/I,cAMX,GAAImR,EAAciD,IAAIpU,GAKpB,YAJAvR,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACf7N,EAAO/I,aAAanN,MAAOmN,IAI/BkT,EAAe,IAAI5H,GACN8H,YAAa,EAC1BF,EAAalT,aAAeia,EAC5B/G,EAAanK,OAASA,EACtBoI,EAAcxa,IAAIqJ,EAAckT,OAG3B,CAKL,GAJA+G,EAAiBpa,EAAe3K,EAAAnE,eAAiBgY,EAAO1Z,KAAKwE,KAG7DqmB,EAAoBzrB,KAAKsf,eAAepe,IAAIsqB,GAO1C,YALAxrB,KAAK4kB,yBACHrT,EACAka,EACAnR,EAAO/I,cAOX,IADA,IAAIma,EAAO,IAAIC,IACRlH,EAAe/B,EAAcxhB,IAAIsqB,IAAiB,CACvD,IAAI/G,EAAaE,WAaV,CAEL,GADA8G,EAAoBzrB,KAAKsf,eAAepe,IAAIujB,EAAalT,cAOvD,YALAvR,KAAK4kB,yBACHrT,EACAka,EACAnR,EAAO/I,cAIX,MArBA,GADAka,EAAoBzrB,KAAK0f,iBAAiBxe,IAAIujB,EAAalT,cAOzD,YALAvR,KAAK4kB,yBACHrT,EACAka,EACAnR,EAAO/I,cAKX,GADAia,EAAiB/G,EAAalT,aAC1Bma,EAAK/F,IAAIlB,GAAe,MAC5BiH,EAAKE,IAAInH,GAgBb,GAAI/B,EAAciD,IAAIpU,GAKpB,YAJAvR,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACf7N,EAAO/I,aAAanN,MAAOmN,IAI/BkT,EAAe,IAAI5H,GACN8H,YAAa,EAC1BF,EAAalT,aAAeia,EAC5B/G,EAAanK,OAASA,EACtBoI,EAAcxa,IAAIqJ,EAAckT,KAI5BrF,EAAAnd,UAAAohB,mBAAR,SACExX,EACA8b,QAAA,IAAAA,MAAA,MAEA,IAAI5E,EAAelX,EAAY+b,sBAC/B,GAAI5nB,KAAKsf,eAAeqG,IAAI5C,GAC1B/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,OAH5B,CAOA,IAAI8E,EAAahc,EAAYjL,KAAKwE,KAC9B6K,EAAapE,EAAYoE,WACzBhO,EAAY,IAAIsnB,EAClBvpB,KACA6nB,EACA9E,EACAlX,EACA,KACAoE,EACIjQ,KAAKinB,gBAAgBhX,EACnBgP,EAAe7I,OACf6I,EAAe5I,OACf4I,EAAe9I,UAEjB8I,EAAenX,MAKrB,GAHA7F,EAAU2F,OAAS+f,EACnB3nB,KAAKsf,eAAepX,IAAI6a,EAAc9gB,GAElC0lB,EAAW,CACb,GAAIA,EAAU3X,SACZ,GAAI2X,EAAU3X,QAAQ2V,IAAIkC,GAKxB,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B4E,EAAU3X,QAAU,IAAImP,IAE1BwI,EAAU3X,QAAQ9H,IAAI2f,EAAY5lB,GAC9B0lB,EAAU5f,GAAGtB,EAAApE,YAAY6lB,gBAAkBjmB,EAAU8F,GAAGtB,EAAApE,YAAY4X,UACtEhY,EAAU2F,OAAS+f,EACnB1lB,EAAUiG,IAAIzB,EAAApE,YAAY6lB,qBAEvB,GAAIjmB,EAAU8F,GAAGtB,EAAApE,YAAY4X,QAAS,CAC3C,GAAIja,KAAK0f,iBAAiBiG,IAAI5C,GAK5B,YAJA/iB,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACftc,EAAYjL,KAAKwD,MAAO2e,GAM5B,GAFA/iB,KAAK0f,iBAAiBxX,IAAI6a,EAAc9gB,GACxCjC,KAAKgjB,iBAAiBhT,QAAQ9H,IAAI2f,EAAY5lB,GAC1C4J,EAAYzH,MAAMU,OAAOsjB,QAAS,CACpC,GAAIpoB,KAAK2f,mBAAmBgG,IAAIkC,GAAa,CAC3C,IAAIQ,EAA+BroB,KAAK2f,mBAAmBze,IAAI2mB,GAK/D,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOikB,EAAehc,QAAQ0W,cAInD9gB,EAAUiG,IAAIzB,EAAApE,YAAY6lB,eAC1BloB,KAAK2f,mBAAmBzX,IAAI2f,GAC1Bxb,QAASpK,EACT4N,WAAYhE,EAAYjL,QAK9BZ,KAAKwnB,YAAYvlB,EAAW4J,KAGtBuT,EAAAnd,UAAAqhB,kBAAR,SACEhT,EACAoS,EACAD,GAEA,IAAIrQ,EAAe9B,EAAU8B,aAC7B,GAAIA,EACF,IAAK,IAAI/R,EAAI,EAAGwK,EAAIuH,EAAa9M,OAAQjF,EAAIwK,IAAKxK,EAChDL,KAAK6rB,iBACHzZ,EAAa/R,GACbiQ,EAAUc,aACVsR,EAAeD,QAGd,GAAInS,EAAU+B,cAAe,CAClC,IAAIwV,EAAavX,EAAU+B,cAAcjN,KACrC2d,EACFzS,EAAUlM,MAAMU,OAAOsM,aACvB3K,EAAAnE,eACAulB,EAEF,GAAI7nB,KAAKsf,eAAeqG,IAAI5C,GAM1B,YALA/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfxV,EAAU+B,cAAcjO,MACxB2e,GAMJ,IAAIF,EAAY7iB,KAAKsf,eAAepe,IAAIoP,EAAUc,cAClD,GAAIyR,EAEF,YADA7iB,KAAKsf,eAAepX,IAAI6a,EAAcF,GAKxC,IAAIc,EAAe,IAAI/G,EACvB+G,EAAaE,UAAYd,EACzB,IAAIxR,EAAe9K,EAAA1D,iBAAmBuN,EAAUc,aAChDuS,EAAapS,aAAeA,EAC5BoS,EAAaI,gBAAkBxS,EAAe9K,EAAAnE,eAAiB,QAC/DqhB,EAAa9X,YAAc,KAC3B4W,EAAc5c,KAAK8d,KAIfvE,EAAAnd,UAAA4pB,iBAAR,SACEhgB,EACAuF,EACA4V,EACAvE,GAEA,IAAIoB,EAAYhY,EAAY+b,sBAC5B,GAAI5nB,KAAKsf,eAAeqG,IAAI9B,GAC1B7jB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOyf,OAH5B,CAQA,IAGIxX,EAHAkF,EAAeH,EAAe3K,EAAAnE,eAAiBuJ,EAAY0F,aAAanM,KAI5E,GAAIiH,EAAUrM,KAAK0f,iBAAiBxe,IAAIqQ,GACtCvR,KAAKsf,eAAepX,IAAI2b,EAAWxX,OADrC,CAMA,IAAMyf,EAAYrlB,EAAAnE,eAAiB,QAC/BqhB,EAAe,IAAI/G,EACvB+G,EAAaE,UAAYA,EACrBzS,EAAa+K,SAAS2P,IACxBnI,EAAapS,aAAeA,EAC5BoS,EAAaI,gBACX3S,EAAaxL,UAAU,EAAGwL,EAAa9L,OAASwmB,EAAUxmB,OAAS,GACnEuG,EAAY0F,aAAanM,OAG3Bue,EAAapS,aAAeA,EAC5BoS,EAAaI,gBACX3S,EACA0a,EACArlB,EAAAnE,eACAuJ,EAAY0F,aAAanM,MAG7Bue,EAAa9X,YAAcA,EAC3B4W,EAAc5c,KAAK8d,MAGbvE,EAAAnd,UAAAshB,oBAAR,SAA4B1X,EAAmC8b,QAAA,IAAAA,MAAA,MAC7D,IAAI5E,EAAelX,EAAY+b,sBAC/B,GAAI5nB,KAAKsf,eAAeqG,IAAI5C,GAC1B/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,OAH5B,CAQA,IAAI9S,EAAapE,EAAYoE,WACzB4X,EAAahc,EAAYjL,KAAKwE,KAC9BnD,EAAY,IAAI8pB,EAClB/rB,KACA6nB,EACA9E,EACAlX,EACAoE,EACIjQ,KAAKinB,gBAAgBhX,EAAYgP,EAAe7I,QAChD6I,EAAenX,MAKrB,GAHA7F,EAAU2F,OAAS+f,EACnB3nB,KAAKsf,eAAepX,IAAI6a,EAAc9gB,GAElC0lB,EAAW,CACb,GAAIA,EAAU3X,SACZ,GAAI2X,EAAU3X,QAAQ2V,IAAI1jB,EAAU8gB,cAKlC,YAJA/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5B4E,EAAU3X,QAAU,IAAImP,IAE1BwI,EAAU3X,QAAQ9H,IAAIjG,EAAU8gB,aAAc9gB,GAC1C0lB,EAAU5f,GAAGtB,EAAApE,YAAY6lB,gBAAkBjmB,EAAU8F,GAAGtB,EAAApE,YAAY4X,SACtEhY,EAAUiG,IAAIzB,EAAApE,YAAY6lB,oBAEvB,GAAIjmB,EAAU8F,GAAGtB,EAAApE,YAAY4X,QAAS,CAC3C,GAAIja,KAAK0f,iBAAiBiG,IAAI5C,GAK5B,YAJA/iB,KAAKuG,MACHgW,EAAAzY,eAAeqkB,4DACftc,EAAYjL,KAAKwD,MAAO2e,GAM5B,GAFA/iB,KAAK0f,iBAAiBxX,IAAI6a,EAAc9gB,GACxCjC,KAAKgjB,iBAAiBhT,QAAQ9H,IAAI2f,EAAY5lB,GAC1C4J,EAAYzH,MAAMU,OAAOsjB,QAAS,CACpC,GAAIpoB,KAAK2f,mBAAmBgG,IAAIkC,GAAa,CAC3C,IAAIQ,EAA+BroB,KAAK2f,mBAAmBze,IAAI2mB,GAK/D,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOikB,EAAehc,QAAQ0W,cAInD9gB,EAAUiG,IAAIzB,EAAApE,YAAY6lB,eAC1BloB,KAAK2f,mBAAmBzX,IAAI2f,GAC1Bxb,QAASpK,EACT4N,WAAYhE,EAAYjL,QAM9B,IADA,IAAI0nB,EAAqBzc,EAAYmE,QAC5B3P,EAAI,EAAGwK,EAAIyd,EAAmBhjB,OAAQjF,EAAIwK,IAAKxK,EAAG,CACzD,IAAIkoB,EAAoBD,EAAmBjoB,GAC3C,OAAQkoB,EAAkBxhB,MAExB,KAAK0V,EAAA5V,SAASqU,iBACZlb,KAAKwoB,gBAAkCD,EAAmBtmB,GAC1D,MAEF,KAAKwa,EAAA5V,SAASgS,kBACR0P,EAAkBtgB,MAAMxB,EAAApE,YAAYomB,IAAMhiB,EAAApE,YAAYqmB,KACxD1oB,KAAK2oB,mBAAsCJ,EAAmBtmB,GAE9DjC,KAAK4oB,iBAAoCL,EAAmBtmB,GAE9D,MAEF,QACE,MAAM,IAAIyjB,MAAM,8BAKtB1lB,KAAKwnB,YAAYvlB,EAAW4J,KAGtBuT,EAAAnd,UAAAuhB,oBAAR,SACE3X,EACA8W,EACAC,EACAoJ,QAAA,IAAAA,MAAA,MAEA,IAAIjJ,EAAelX,EAAY+b,sBAC3BC,EAAahc,EAAYjL,KAAKwE,KAC9BuiB,EAAY3nB,KAAKsf,eAAepe,IAAI6hB,GAQxC,GAPK4E,KACHA,EAAY,IAAIsE,EAAUjsB,KAAM6nB,EAAY9E,EAAclX,IAChDjE,OAASokB,EACnBhsB,KAAKsf,eAAepX,IAAI6a,EAAc4E,GACtC3nB,KAAKwnB,YAAYG,EAAW9b,IAG1BmgB,EAAiB,CACnB,GAAIA,EAAgBhc,SAClB,GAAIgc,EAAgBhc,QAAQ2V,IAAIkC,GAK9B,YAJA7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,QAK5BiJ,EAAgBhc,QAAU,IAAImP,IAEhC6M,EAAgBhc,QAAQ9H,IAAI2f,EAAYF,GACpCqE,EAAgBjkB,GAAGtB,EAAApE,YAAY6lB,gBAAkBP,EAAU5f,GAAGtB,EAAApE,YAAY4X,SAC5E0N,EAAUzf,IAAIzB,EAAApE,YAAY6lB,oBAEvB,GAAIP,EAAU5f,GAAGtB,EAAApE,YAAY4X,QAAS,CAC3C,IAAIoO,EAAiBroB,KAAK0f,iBAAiBxe,IAAI6hB,GAa/C,GAZIsF,GACGA,EAAetgB,GAAGtB,EAAApE,YAAY4X,SACjCja,KAAKuG,MACHgW,EAAAzY,eAAeooB,kFACfrgB,EAAYjL,KAAKwD,MAAOujB,EAAU5E,cAGtC4E,EAAYU,GAEZroB,KAAK0f,iBAAiBxX,IAAI6a,EAAc4E,GAE1C3nB,KAAKgjB,iBAAiBhT,QAAQ9H,IAAI2f,EAAYF,GAC1C9b,EAAYzH,MAAMU,OAAOsjB,QAAS,CACpC,GAAIpoB,KAAK2f,mBAAmBgG,IAAIkC,GAAa,CAC3C,IAAIsE,EAA+BnsB,KAAK2f,mBAAmBze,IAAI2mB,GAC/D,GAAIsE,EAAe9f,UAAYsb,EAK7B,YAJA3nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO+nB,EAAe9f,QAAQ0W,mBAKnD/iB,KAAK2f,mBAAmBzX,IAAI2f,GAC1Bxb,QAASsb,EACT9X,WAAYhE,EAAYjL,OAG5B+mB,EAAUzf,IAAIzB,EAAApE,YAAY6lB,gBAK9B,IADA,IAAIlY,EAAUnE,EAAYmE,QACjB3P,EAAI,EAAGwK,EAAImF,EAAQ1K,OAAQjF,EAAIwK,IAAKxK,EAC3C,OAAQ2P,EAAQ3P,GAAG0G,MACjB,KAAK0V,EAAA5V,SAASsT,iBACZna,KAAKkjB,gBAAkClT,EAAQ3P,GAAIsiB,EAAeC,EAAkB+E,GACpF,MAEF,KAAKlL,EAAA5V,SAASgU,gBACZ7a,KAAKmjB,eAAgCnT,EAAQ3P,GAAIsnB,GACjD,MAEF,KAAKlL,EAAA5V,SAAS+R,oBACZ5Y,KAAKqjB,mBAAwCrT,EAAQ3P,GAAIsnB,GACzD,MAEF,KAAKlL,EAAA5V,SAAS2U,qBACZxb,KAAKujB,oBAA0CvT,EAAQ3P,GAAIsnB,GAC3D,MAEF,KAAKlL,EAAA5V,SAASmT,qBACZha,KAAKwjB,oBAA0CxT,EAAQ3P,GAAIsiB,EAAeC,EAAkB+E,GAC5F,MAEF,KAAKlL,EAAA5V,SAASiV,gBAGZ9b,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfjY,EAAQ3P,GAAG+D,OAEb,MAEF,KAAKqY,EAAA5V,SAASkT,SACZ/Z,KAAK0jB,oBAAuC1T,EAAQ3P,GAAIsnB,GACxD,MAEF,QACE,MAAM,IAAIjC,MAAM,+BAMhBtG,EAAAnd,UAAAwhB,oBAAR,SAA4B5X,EAA8B8b,QAAA,IAAAA,MAAA,MAGxD,IAAI/mB,EAAOiL,EAAYjL,KAAKwE,KAC5B,GAAIpF,KAAKwf,YAAYmG,IAAI/kB,IAASZ,KAAKyf,YAAYkG,IAAI/kB,GACrDZ,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOxD,OAH5B,CAOA,IAAI+T,EAAQ,IAAImI,EAChBnI,EAAM7E,eAAiBjE,EAAYiE,eACnC6E,EAAMrM,KAAOuD,EAAYvD,KACzBtI,KAAKyf,YAAYvX,IAAItH,EAAM+T,KAGrByK,EAAAnd,UAAAyhB,oBAAR,SAA4BpT,EAA8BqX,QAAA,IAAAA,MAAA,MAExD,IADA,IAAIvV,EAAe9B,EAAU8B,aACpB/R,EAAI,EAAGwK,EAAIuH,EAAa9M,OAAQjF,EAAIwK,IAAKxK,EAAG,CACnD,IAAIwL,EAAcuG,EAAa/R,GAC3B4P,EAAapE,EAAYoE,WACzB8S,EAAelX,EAAY+b,sBAC/B,GAAI5nB,KAAKsf,eAAeqG,IAAI5C,GAC1B/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,OAH5B,CAOA,IAAI8E,EAAahc,EAAYjL,KAAKwE,KAC9BgnB,EAAS,IAAIzF,EACf3mB,KACA6nB,EACA9E,EACAvG,EAAAyE,KAAKc,KACLlW,EACAoE,EACIjQ,KAAKinB,gBAAgBhX,EACnBgP,EAAe7I,OACf6I,EAAe5I,OACf4I,EAAe9I,UAEjB8I,EAAenX,MAYrB,GAVAskB,EAAOxkB,OAAS+f,EAChB3nB,KAAKsf,eAAepX,IAAI6a,EAAcqJ,GAElCA,EAAO1E,aAAazI,EAAe5I,UAAY+V,EAAOrkB,GAAGtB,EAAApE,YAAYgqB,QACvErsB,KAAKuG,MACHgW,EAAAzY,eAAewjB,8BACf7jB,OAAOgZ,EAAAL,cAAcK,EAAA1G,cAAcM,OAAQpG,IAAa7L,MAAO,UAI/DujB,EAAW,CACb,GAAIA,EAAU3X,SACZ,GAAI2X,EAAU3X,QAAQ2V,IAAIkC,GAAa,CACrC7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,GAE1B,eAGF4E,EAAU3X,QAAU,IAAImP,IAE1BwI,EAAU3X,QAAQ9H,IAAI2f,EAAYuE,GAC9BzE,EAAU5f,GAAGtB,EAAApE,YAAY6lB,gBAAkBkE,EAAOrkB,GAAGtB,EAAApE,YAAY4X,SACnEmS,EAAOlkB,IAAIzB,EAAApE,YAAY6lB,oBAEpB,GAAIkE,EAAOrkB,GAAGtB,EAAApE,YAAY4X,UAC3Bja,KAAK0f,iBAAiBiG,IAAI5C,GAC5B/iB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAO2e,GAG1B/iB,KAAK0f,iBAAiBxX,IAAI6a,EAAcqJ,GAE1CpsB,KAAKgjB,iBAAiBhT,QAAQ9H,IAAI2f,EAAYuE,GAC1CvgB,EAAYzH,MAAMU,OAAOsjB,SAAS,CACpC,GAAIpoB,KAAK2f,mBAAmBgG,IAAIkC,GAAa,CAC3C,IAAIQ,EAA+BroB,KAAK2f,mBAAmBze,IAAI2mB,GAC/D7nB,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOikB,EAAehc,QAAQ0W,cAEjD,SAEFqJ,EAAOlkB,IAAIzB,EAAApE,YAAY6lB,eACvBloB,KAAK2f,mBAAmBzX,IAAI2f,GAC1Bxb,QAAS+f,EACTvc,WAAYhE,EAAYjL,OAI9BZ,KAAKwnB,YAAY4E,EAAQvgB,MAG/BuT,EAzuDA,CAA6B7C,EAAAtW,mBAsyD7B,SAAgBmhB,EAAoBrgB,GAClC,OAAQA,GACN,KAAK0V,EAAA1G,cAAcK,OAAQ,OAAO6I,EAAe7I,OACjD,KAAKqG,EAAA1G,cAAcO,SACnB,KAAKmG,EAAA1G,cAAcW,gBAAiB,OAAOuI,EAAevI,gBAC1D,KAAK+F,EAAA1G,cAAcY,gBAAiB,OAAOsI,EAAetI,gBAC1D,KAAK8F,EAAA1G,cAAca,iBAAkB,OAAOqI,EAAerI,iBAC3D,KAAK6F,EAAA1G,cAAcS,UAAW,OAAOyI,EAAezI,UACpD,KAAKiG,EAAA1G,cAAcQ,OAAQ,OAAO0I,EAAe1I,OACjD,KAAKkG,EAAA1G,cAAcM,OAAQ,OAAO4I,EAAe5I,OACjD,KAAKoG,EAAA1G,cAAcI,SAAU,OAAO8I,EAAe9I,SACnD,KAAKsG,EAAA1G,cAAcG,QAAS,OAAO+I,EAAe/I,QAClD,QAAS,OAAO+I,EAAenX,MAlzDtBpI,EAAA0f,UA4uDb,SAAYJ,GAEVA,IAAA,mBAEAA,IAAA,iBAEAA,IAAA,eAEAA,IAAA,yBAEAA,IAAA,2CAEAA,IAAA,uBAEAA,IAAA,qCAEAA,IAAA,qCAEAA,IAAA,iBAEAA,IAAA,6CAEAA,IAAA,0BAEAA,IAAA,sCAEAA,IAAA,kBAEAA,IAAA,wBAEAA,IAAA,0BAEAA,IAAA,0BAhCF,CAAYA,EAAAtf,EAAAsf,cAAAtf,EAAAsf,iBAmCZ,SAAYC,GAEVA,IAAA,eAEAA,IAAA,mBAEAA,IAAA,qCAEAA,IAAA,qCAEAA,IAAA,uCAEAA,IAAA,0BAEAA,IAAA,oBAEAA,IAAA,oBAEAA,IAAA,yBAEAA,IAAA,uBApBF,CAAYA,EAAAvf,EAAAuf,iBAAAvf,EAAAuf,oBAuBZvf,EAAA0nB,sBAiBA,IAAAkF,EAAA,WAoBE,SAAAA,EAAsBC,EAAkB1E,EAAoB9E,GAT5D/iB,KAAA6H,MAAqBpB,EAAApE,YAAYyF,KAEjC9H,KAAAspB,eAAiCrK,EAAenX,KAEhD9H,KAAAgQ,QAAsC,KAEtChQ,KAAA4H,OAAyB,KAIvB5H,KAAKusB,QAAUA,EACfvsB,KAAK6nB,WAAaA,EAClB7nB,KAAK+iB,aAAeA,EAWxB,OAPEuJ,EAAArqB,UAAA8F,GAAA,SAAGC,GAA2B,OAAQhI,KAAK6H,MAAQG,IAASA,GAE5DskB,EAAArqB,UAAAgG,MAAA,SAAMJ,GAA4B,OAA+B,IAAvB7H,KAAK6H,MAAQA,IAEvDykB,EAAArqB,UAAAiG,IAAA,SAAIF,GAA2BhI,KAAK6H,OAASG,GAE7CskB,EAAArqB,UAAAylB,aAAA,SAAa1f,GAA8B,OAAQhI,KAAKspB,eAAiBthB,IAASA,GACpFskB,EAlCA,GAAsB5sB,EAAA4sB,UAqCtB,IAAAxJ,EAAA,SAAAxN,GAQE,SAAAwN,EACEyJ,EACAznB,GAFF,IAAA0Q,EAIEF,EAAA9U,KAAAR,KAAMusB,EAASznB,EAAOsM,aAAc3K,EAAA1D,iBAAmB+B,EAAOsM,eAAapR,YAV7EwV,EAAAzO,KAAOiY,EAAYuM,UAWjB/V,EAAKxF,QAAU,IAAImP,MAEvB,OAf+B5J,EAAAuN,EAAAxN,GAe/BwN,EAfA,CAA+BwJ,GAAlB5sB,EAAAojB,YAkBb,IAAAmJ,EAAA,SAAA3W,GASE,SAAA2W,EACEM,EACA1E,EACA9E,EACAlX,GAJF,IAAA2J,EAMEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,IAAa/iB,YAZ1CwV,EAAAzO,KAAOiY,EAAYwN,UAajBhX,EAAK3J,YAAcA,EACnB2J,EAAK3N,MAAQgE,EAAYhE,QAE7B,OAnB+B0N,EAAA0W,EAAA3W,GAmB/B2W,EAnBA,CAA+BK,GAAlB5sB,EAAAusB,YAsBb,IAAAjB,EAAA,SAAA1V,GAQE,SAAA0V,EACEuB,EACA1E,EACA9E,EACAlX,GAJF,IAAA2J,EAMEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,IAAa/iB,YAZ1CwV,EAAAzO,KAAOiY,EAAYyN,KAajBjX,EAAK3J,YAAcA,EACnB2J,EAAK3N,MAAQgE,EAAYhE,QAE7B,OAlB0B0N,EAAAyV,EAAA1V,GAkB1B0V,EAlBA,CAA0BsB,GAAb5sB,EAAAsrB,OAqBb,IAAAG,EAAA,SAAA7V,GASE,SAAA6V,EACED,EACAqB,EACA1E,EACA9E,EACAlX,GALF,IAAA2J,EAOEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,IAAa/iB,YAd1CwV,EAAAzO,KAAOiY,EAAY0N,UAKnBlX,EAAAmX,cAAqB,EAUnBnX,EAAK5N,OAASsjB,EACd1V,EAAK3J,YAAcA,IAEvB,OApB+B0J,EAAA4V,EAAA7V,GAoB/B6V,EApBA,CAA+BmB,GAAlB5sB,EAAAyrB,YAsBb,SAAkByB,GAChBA,IAAA,eACAA,IAAA,qBACAA,IAAA,iBAHF,CAAkBltB,EAAAktB,oBAAAltB,EAAAktB,uBAMlB,IAAAC,EAAA,SAAAvX,GAeE,SAAAuX,EACEN,EACA1E,EACA9E,EACAza,EACAuD,GALF,IAAA2J,EAOEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,IAAa/iB,YAb1CwV,EAAAsX,kBAAiB,EAcftX,EAAKlN,KAAOA,EACZkN,EAAK3J,YAAcA,IAgBvB,OAxCyC0J,EAAAsX,EAAAvX,GA2BvCuX,EAAA5qB,UAAA2kB,yBAAA,SAAyBtlB,GAIvB,OAHAtB,KAAK8sB,kBAAiB,EACtB9sB,KAAK+sB,qBAAuBzrB,EAC5BtB,KAAKkI,IAAIzB,EAAApE,YAAYgqB,MAAQ5lB,EAAApE,YAAY2qB,SAClChtB,MAGT6sB,EAAA5qB,UAAA8kB,uBAAA,SAAuBzlB,GAIrB,OAHAtB,KAAK8sB,kBAAiB,EACtB9sB,KAAKitB,mBAAqB3rB,EAC1BtB,KAAKkI,IAAIzB,EAAApE,YAAYgqB,MAAQ5lB,EAAApE,YAAY2qB,SAClChtB,MAEX6sB,EAxCA,CAAyCP,GAA5B5sB,EAAAmtB,sBA2Cb,IAAAlG,EAAA,SAAArR,GAIE,SAAAqR,EACE4F,EACA1E,EACA9E,EACAza,EACAuD,EACAyd,GANF,IAAA9T,EAQEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,EAAcza,EAAMuD,IAAY7L,YAV7DwV,EAAAzO,KAAOiY,EAAY5I,OAWjBZ,EAAK3N,MAAQgE,EAAcA,EAAYhE,MAAQpB,EAAApE,YAAYyF,KAC3D0N,EAAK8T,eAAiBA,EACtB9T,EAAKlN,KAAOA,IAEhB,OAjB4BiN,EAAAoR,EAAArR,GAiB5BqR,EAjBA,CAA4BkG,GAAfntB,EAAAinB,SAoBb,IAAAuG,EAAA,WAiBA,OALE,SAAYtsB,EAAc0H,EAAYW,QAAA,IAAAA,MAAA,MACpCjJ,KAAKY,KAAOA,EACZZ,KAAKsI,KAAOA,EACZtI,KAAKiJ,YAAcA,GAfvB,GAAavJ,EAAAwtB,YAoBb,IAAAC,EAAA,SAAA7X,GASE,SAAA6X,EACEZ,EACA1E,EACAuF,EACA9kB,EACAuD,QAAA,IAAAA,MAAA,MALF,IAAA2J,EAOEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAYA,EAAYvf,EAAMuD,IAAY7L,YAd3DwV,EAAAzO,KAAOiY,EAAYqO,MAKnB7X,EAAA8X,aAA8B,KAU5B9X,EAAK4X,MAAQA,IAEjB,OAnB2B7X,EAAA4X,EAAA7X,GAmB3B6X,EAnBA,CAA2BN,GAAdntB,EAAAytB,QAsBb,IAAA5D,EAAA,SAAAjU,GAgBE,SAAAiU,EACEgD,EACA1E,EACA9E,EACAlX,EACAgd,EACAS,QADA,IAAAT,MAAA,WACA,IAAAS,MAAiCrK,EAAenX,MANlD,IAAA0N,EAQEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,IAAa/iB,YAtB1CwV,EAAAzO,KAAOiY,EAAYgH,mBAOnBxQ,EAAA+X,UAA8C,IAAIpO,IAElD3J,EAAAgY,mBAAoC,KAEpChY,EAAAwU,aAA6B1N,EAAayC,QAYxCvJ,EAAK3J,YAAcA,EACnB2J,EAAK3N,MAAQgE,EAAYhE,MACzB2N,EAAKqT,eAAiBA,EACtBrT,EAAK8T,eAAiBA,IAmB1B,OA/CuC/T,EAAAgU,EAAAjU,GAgCrCiU,EAAAtnB,UAAAwrB,wBAAA,SAAwBC,GACtB,IAAIF,EAAqB/pB,OAAOzD,KAAKwtB,oBAEjCG,EADmBlqB,OAAOzD,KAAK6oB,gBAAgBhd,YACRiE,eACvC8d,EAAyBD,EAAoBroB,OACjD7B,OAAOmqB,GAA0BJ,EAAmBloB,QACpD,IAAK,IAAIjF,EAAI,EAAGA,EAAIutB,IAA0BvtB,EAC5CqtB,EAAwBxlB,IACtBylB,EAAoBttB,GAAGO,KAAKwE,KAC5BooB,EAAmBntB,KAKzBkpB,EAAAtnB,UAAA4C,SAAA,WAAqB,OAAO7E,KAAK6nB,YACnC0B,EA/CA,CAAuC+C,GAA1B5sB,EAAA6pB,oBAkDb,IAAAsE,EAAA,SAAAvY,GAoCE,SAAAuY,EACE5rB,EACA8gB,EACA9P,EACArL,EACA8lB,gBADA,IAAA9lB,MAAA,WACA,IAAA8lB,MAAA,MALF,IAAAlY,EAOEF,EAAA9U,KAAAR,KAAMiC,EAAUsqB,QAAStqB,EAAU4lB,WAAY9E,IAAa/iB,KAO5D,GAhDFwV,EAAAzO,KAAOiY,EAAYnH,SAOnBrC,EAAAsY,aAAkC,IAAI3O,IAEtC3J,EAAAuY,iBAEAvY,EAAAwY,oBAEAxY,EAAAyY,aAA8B,KAM9BzY,EAAA0Y,kBAEA1Y,EAAA2Y,IAAmB,EAEnB3Y,EAAA4Y,oBAA2B,EAE3B5Y,EAAA6Y,WAA8B,KAE9B7Y,EAAA8Y,WAA0B,KAElB9Y,EAAA+Y,YAAmB,EACnB/Y,EAAAgZ,WAA2B,KACnChZ,EAAAiZ,aAAoB,EAkFZjZ,EAAAkZ,SAA2B,KAC3BlZ,EAAAmZ,SAA2B,KAC3BnZ,EAAAoZ,SAA2B,KAC3BpZ,EAAAqZ,SAA2B,KA1EjCrZ,EAAKvT,UAAYA,EACjBuT,EAAKvC,UAAYA,EACjBuC,EAAK5N,OAASA,EACd4N,EAAK3N,MAAQ5F,EAAU4F,MACvB2N,EAAK8T,eAAiBrnB,EAAUqnB,eAChC9T,EAAKkY,wBAA0BA,GACzBzrB,EAAU8F,GAAGtB,EAAApE,YAAY8jB,SAAW,CACxC,IAAI2I,EAAa,EACjB,GAAIlnB,GAAUA,EAAOb,MAAQiY,EAAYvH,MAAO,CAC9ChU,OAAO+R,EAAKzN,GAAGtB,EAAApE,YAAY0sB,WAC3B,IAAIC,EAAQ,IAAI7B,EACdlrB,EAAUsqB,QACV,OACAuC,IACArrB,OAAOwP,EAAUgc,WAEnBzZ,EAAKsY,aAAa5lB,IAAI,OAAQ8mB,GAC9BxZ,EAAKuY,cAAciB,EAAM5B,OAAS4B,EAClC,IAAIE,EAAiCtnB,EAAQ8lB,wBAC7C,GAAIwB,EAAwB,CACrB1Z,EAAKkY,0BAAyBlY,EAAKkY,wBAA0B,IAAIvO,SACtE,IAA2C,IAAAgQ,EAAAjL,EAAAgL,GAAsBE,EAAAD,EAAA/K,QAAAgL,EAAA/K,KAAA+K,EAAAD,EAAA/K,OAAE,CAA1D,IAAAiL,EAAA9K,EAAA6K,EAAA9tB,MAAA,GAACguB,EAAAD,EAAA,GAAeE,EAAAF,EAAA,GAClB7Z,EAAKkY,wBAAwB/H,IAAI2J,IACpC9Z,EAAKkY,wBAAwBxlB,IAAIonB,EAAeC,4GAKtD9rB,QAAQ+R,EAAKzN,GAAGtB,EAAApE,YAAY0sB,WAG9B,IADA,IAAIzI,EAAiBrT,EAAUqT,eACtBjmB,EAAI,EAAGwK,EAAIyb,EAAehhB,OAAQjF,EAAIwK,IAAKxK,EAAG,CACrD,IAAImvB,EAAgBlJ,EAAejmB,GAC/BovB,EAAgBxc,EAAUyc,iBAAiBrvB,GAC3C2uB,EAAQ,IAAI7B,EACdlrB,EAAUsqB,QACVkD,EACAX,IACAU,GAGFha,EAAKsY,aAAa5lB,IAAIunB,EAAeT,GACrCxZ,EAAKuY,cAAciB,EAAM5B,OAAS4B,UAGtCxZ,EAAKma,KAAOC,EAAKjuB,OAAO6T,KAkL5B,OA3Q8BD,EAAAsY,EAAAvY,GA6F5BuY,EAAA5rB,UAAA4tB,SAAA,SAASvnB,EAAY1H,EAA4BiL,QAA5B,IAAAjL,MAAA,WAA4B,IAAAiL,MAAA,MAE/C,IAAIijB,EAAa9uB,KAAKiT,UAAUqT,eAAehhB,OAAStF,KAAKguB,iBAAiB1oB,OAC1EtF,KAAK+H,GAAGtB,EAAApE,YAAY0sB,aAAaD,EACrC,IAAIE,EAAQ,IAAI7B,EACdntB,KAAKiC,UAAUsqB,QACf3rB,GAEI,OAASkuB,EAAWjqB,SAAS,IACjCiqB,EACAxmB,EACAuD,GAEF,GAAIjL,EAAM,CACR,GAAIZ,KAAK8tB,aAAanI,IAAI/kB,GAAO,MAAM,IAAI8kB,MAAM,wBACjD1lB,KAAK8tB,aAAa5lB,IAAItH,EAAMouB,GAI9B,OAFAhvB,KAAK+tB,cAAciB,EAAM5B,OAAS4B,EAClChvB,KAAKguB,iBAAiBnoB,KAAKyC,GACpB0mB,GASTnB,EAAA5rB,UAAA6tB,aAAA,SAAaxnB,EAAYynB,GACvB,IAAIC,EAoBAhB,EAnBJ,YAFuB,IAAAe,OAAA,GAEfznB,EAAK2nB,gBACX,OACED,EAAQhwB,KAAK0uB,SACb,MAEF,OACEsB,EAAQhwB,KAAK2uB,SACb,MAEF,OACEqB,EAAQhwB,KAAK4uB,SACb,MAEF,OACEoB,EAAQhwB,KAAK6uB,SACb,MAEF,QAAS,MAAM,IAAInJ,MAAM,0BAa3B,OAVIsK,GAASA,EAAM1qB,SACjB0pB,EAAQgB,EAAME,OACR5nB,KAAOA,EACb0mB,EAAMnnB,MAAQpB,EAAApE,YAAYyF,MAE1BknB,EAAQhvB,KAAK6vB,SAASvnB,GAEpBA,EAAKP,GAAG,KACV/H,KAAK2vB,KAAKQ,gBAAgBnB,EAAM5B,MAAO2C,GAElCf,GAITnB,EAAA5rB,UAAAmuB,cAAA,SAAcpB,GACZ,IAAIA,EAAMjnB,GAAGtB,EAAApE,YAAY2qB,SAAzB,CAEA,IAAIgD,EAEJ,OAHAvsB,OAAOurB,EAAM5B,OAAS,GAEtB3pB,OAAqB,MAAdurB,EAAM1mB,MACE0mB,EAAM1mB,KAAM2nB,gBACzB,OACED,EAAQhwB,KAAK0uB,WAAa1uB,KAAK0uB,aAC/B,MAEF,OACEsB,EAAQhwB,KAAK2uB,WAAa3uB,KAAK2uB,aAC/B,MAEF,OACEqB,EAAQhwB,KAAK4uB,WAAa5uB,KAAK4uB,aAC/B,MAEF,OACEoB,EAAQhwB,KAAK6uB,WAAa7uB,KAAK6uB,aAC/B,MAEF,QAAS,MAAM,IAAInJ,MAAM,0BAE3BjiB,OAAOurB,EAAM5B,OAAS,GACtB4C,EAAMnqB,KAAKmpB,KAIbnB,EAAA5rB,UAAAouB,oBAAA,SAAoB/nB,EAAYynB,GAC9B,IAAIC,EAoBAhB,EAnBJ,OAAQ1mB,EAAK2nB,gBACX,OACED,EAAQhwB,KAAK0uB,WAAa1uB,KAAK0uB,aAC/B,MAEF,OACEsB,EAAQhwB,KAAK2uB,WAAa3uB,KAAK2uB,aAC/B,MAEF,OACEqB,EAAQhwB,KAAK4uB,WAAa5uB,KAAK4uB,aAC/B,MAEF,OACEoB,EAAQhwB,KAAK6uB,WAAa7uB,KAAK6uB,aAC/B,MAEF,QAAS,MAAM,IAAInJ,MAAM,0BAa3B,OAVIsK,EAAM1qB,QACR0pB,EAAQgB,EAAMA,EAAM1qB,OAAS,IACvBgD,KAAOA,GAEb0mB,EAAQhvB,KAAK6vB,SAASvnB,GACtB0nB,EAAMnqB,KAAKmpB,IAET1mB,EAAKP,GAAG,KACV/H,KAAK2vB,KAAKQ,gBAAgBnB,EAAM5B,MAAO2C,GAElCf,GAITnB,EAAA5rB,UAAAquB,kBAAA,WACE,IAAIC,EAAKvwB,KAAKuuB,cAGd,OAFKvuB,KAAKwuB,WACLxuB,KAAKwuB,WAAW3oB,KAAK0qB,GADJvwB,KAAKwuB,YAAe+B,GAEnCvwB,KAAKiuB,aAAesC,EAAG1rB,SAAS,KAIzCgpB,EAAA5rB,UAAAuuB,kBAAA,WACE/sB,OAA0B,MAAnBzD,KAAKwuB,YACZ,IAAIlpB,EAAiBtF,KAAKwuB,WAAYlpB,OACtC7B,OAAO6B,EAAS,GACRtF,KAAKwuB,WAAY0B,MACrB5qB,EAAS,EACXtF,KAAKiuB,aAAuBjuB,KAAKwuB,WAAYlpB,EAAS,GAAGT,SAAS,KAElE7E,KAAKiuB,aAAe,KACpBjuB,KAAKwuB,WAAa,OAKtBX,EAAA5rB,UAAAwuB,SAAA,SAAS9wB,EAAgBwuB,GAMvB,GALAnuB,KAAKmuB,IAAMA,EACX1qB,QAAQzD,KAAKwuB,aAAexuB,KAAKwuB,WAAWlpB,QAC5CtF,KAAKwuB,WAAa,KAClBxuB,KAAKiuB,aAAe,KACpBjuB,KAAK0uB,SAAW1uB,KAAK2uB,SAAW3uB,KAAK4uB,SAAW5uB,KAAK6uB,SAAW,KAC5D7uB,KAAKusB,QAAQvL,QAAQ0P,UAEvB,IADA,IAAIxC,EAAiBluB,KAAKkuB,eACjB7tB,EAAI,EAAGwK,EAAIqjB,EAAe5oB,OAAQjF,EAAIwK,IAAKxK,EAAG,CACrD,IAAIswB,EAAgBzC,EAAe7tB,GACnCV,EAAOixB,iBACLzC,EACAwC,EAAcE,aACdF,EAAc7rB,OAAOqU,eACrBwX,EAAc3rB,KACd2rB,EAAc1rB,UAOtB4oB,EAAA5rB,UAAA4C,SAAA,WAAqB,OAAO7E,KAAKiC,UAAU4lB,YAC7CgG,EA3QA,CAA8BvB,GAAjB5sB,EAAAmuB,WA8Qb,IAAAiD,EAAA,SAAAxb,GAUE,SAAAwb,EAAYvE,EAAkBtZ,GAA9B,IAAAuC,EACEF,EAAA9U,KAAAR,KAAMusB,EAAS,GAAI,KAAGvsB,KATxBwV,EAAAzO,KAAOiY,EAAY+R,gBAUjB,IAAIlJ,EAAa5U,EAAU+d,2BAC3Bxb,EAAKqS,WAAaA,EAClBrS,EAAKuN,aAAe8E,EACpBrS,EAAKvC,UAAYA,EACjBuC,EAAKlN,KAAOkU,EAAAyE,KAAKQ,IAAIwP,WAAWhe,KAEpC,OAlBoCsC,EAAAub,EAAAxb,GAkBpCwb,EAlBA,CAAoCxE,GAAvB5sB,EAAAoxB,iBAqBb,IAAAzH,EAAA,SAAA/T,GAUE,SAAA+T,EACER,EACAhB,EACA9E,EACAlX,GAJF,IAAA2J,EAMEF,EAAA9U,KAAAR,KAAM6oB,EAAe0D,QAAS1E,EAAY9E,IAAa/iB,YAdzDwV,EAAAzO,KAAOiY,EAAYkS,gBAejB1b,EAAKqT,eAAiBA,EACtBrT,EAAK3J,YAAcA,EACnB2J,EAAK3N,MAAQgE,EAAYhE,QAE7B,OArBoC0N,EAAA8T,EAAA/T,GAqBpC+T,EArBA,CAAoCiD,GAAvB5sB,EAAA2pB,iBAwBb,IAAA8H,EAAA,SAAA7b,GAUE,SAAA6b,EACElvB,EACA8gB,EACAza,EACAuD,EACAjE,GALF,IAAA4N,EAOEF,EAAA9U,KAAAR,KAAMiC,EAAUsqB,QAAStqB,EAAU4lB,WAAY9E,EAAcza,EAAMuD,IAAY7L,YAfjFwV,EAAAzO,KAAOiY,EAAYoS,MAKnB5b,EAAA6b,cAAqB,EAWnB7b,EAAKvT,UAAYA,EACjBuT,EAAK3N,MAAQ5F,EAAU4F,MACvB2N,EAAKlN,KAAOA,EACZkN,EAAK5N,OAASA,IAElB,OAvB2B2N,EAAA4b,EAAA7b,GAuB3B6b,EAvBA,CAA2BtE,GAAdntB,EAAAyxB,QA0Bb,IAAAzG,EAAA,SAAApV,GAYE,SAAAoV,EACE6B,EACA1E,EACA9E,EACAnb,GAJF,IAAA4N,EAMEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,IAAa/iB,YAhB1CwV,EAAAzO,KAAOiY,EAAYuL,SAKnB/U,EAAAgV,gBAA4C,KAE5ChV,EAAAiV,gBAA4C,KAU1CjV,EAAK5N,OAASA,IAElB,OArB8B2N,EAAAmV,EAAApV,GAqB9BoV,EArBA,CAA8B4B,GAAjB5sB,EAAAgrB,WAwBb,IAAA5C,EAAA,SAAAxS,GAiBE,SAAAwS,EACEyE,EACA1E,EACA9E,EACAlX,EACAyd,GALF,IAAA9T,EAOEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,IAAa/iB,YAtB1CwV,EAAAzO,KAAOiY,EAAYmG,gBAKnB3P,EAAA+X,UAA+B,IAAIpO,IAEnC3J,EAAA2T,gBAA8C,KAE9C3T,EAAA4P,cAAuC,KAEvC5P,EAAAgU,qBAAiD,KAEjDhU,EAAAsU,mBAA2D,IAAI3K,IAU7D3J,EAAK3J,YAAcA,EACnB2J,EAAK3N,MAAQgE,EAAYhE,MACzB2N,EAAK8T,eAAiBA,IAM1B,OAjCoC/T,EAAAuS,EAAAxS,GA8BlCwS,EAAA7lB,UAAA4C,SAAA,WACE,OAAO7E,KAAK6nB,YAEhBC,EAjCA,CAAoCwE,GAAvB5sB,EAAAooB,iBAoCb,IAAAwJ,EAAA,SAAAhc,GAwBE,SAAAgc,EACErvB,EACA4lB,EACA9E,EACA3a,EACAmpB,gBADA,IAAAnpB,MAAA,WACA,IAAAmpB,MAAA,MALF,IAAA/b,EAOEF,EAAA9U,KAAAR,KAAMiC,EAAUsqB,QAAS1E,EAAY9E,IAAa/iB,KASlD,GAtCFwV,EAAAzO,KAAOiY,EAAYvH,MAWnBjC,EAAAkY,wBAAmD,KAEnDlY,EAAAgc,oBAA2B,EAE3Bhc,EAAAic,oBAAuC,KAEvCjc,EAAAqU,UAA+C,KAE/CrU,EAAAkc,aAAyB,EAWvBlc,EAAKvT,UAAYA,EACjBuT,EAAK3N,MAAQ5F,EAAU4F,MACvB2N,EAAK8T,eAAiBrnB,EAAUqnB,eAChC9T,EAAKpN,cAAgBA,EACrBoN,EAAKlN,KAAOrG,EAAUsqB,QAAQvL,QAAQW,UAAUgQ,QAAQnc,GACxDA,EAAK+b,KAAOA,EAGRA,EAAM,CACR,IAAIrC,EAAyBqC,EAAK7D,wBAClC,GAAIwB,EAAwB,CACrB1Z,EAAKkY,0BAAyBlY,EAAKkY,wBAA0B,IAAIvO,SACtE,IAAiC,IAAAyS,EAAA1N,EAAAgL,GAAsB2C,EAAAD,EAAAxN,QAAAyN,EAAAxN,KAAAwN,EAAAD,EAAAxN,OAAE,CAAhD,IAAAiL,EAAA9K,EAAAsN,EAAAvwB,MAAA,GAACqpB,EAAA0E,EAAA,GAAUyC,EAAAzC,EAAA,GAClB7Z,EAAKkY,wBAAwBxlB,IAAIyiB,EAAUmH,uGAMjD,IACIzxB,EAAQwK,EADRgB,EAAc2J,EAAKvT,UAAU4J,YAEjC,GAAIA,EAAa,CACf,IAAIiE,EAAiBjE,EAAYiE,eACjC,GAAI1H,EAAe,CACjB,IAAKyC,EAAIzC,EAAc9C,SAAWwK,EAAexK,OAC/C,MAAM,IAAIogB,MAAM,gCAElB,GAAI7a,EAEF,IADK2K,EAAKkY,0BAAyBlY,EAAKkY,wBAA0B,IAAIvO,KACjE9e,EAAI,EAAGA,EAAIwK,IAAKxK,EACnBmV,EAAKkY,wBAAwBxlB,IAAI4H,EAAezP,GAAGO,KAAKwE,KAAMgD,EAAc/H,SAG3E,GAAIyP,EAAexK,OACxB,MAAM,IAAIogB,MAAM,yCAoDxB,OAtH2BnQ,EAAA+b,EAAAhc,GAwEzBgc,EAAArvB,UAAA8vB,eAAA,SAAeC,GACb,IAAIC,EAAwBjyB,KAC5B,GAAG,GAAIiyB,GAAWD,EAAQ,OAAO,QAC1BC,EAAUA,EAAQV,MACzB,OAAO,GAITD,EAAArvB,UAAAiwB,eAAA,SAAenrB,EAAoBorB,GACjC,QADiC,IAAAA,OAAA,GAC7BA,EACF,OAAQprB,GACN,KAAKuV,EAAaW,YAEhB,GADImV,EAAoBpyB,KAAKkyB,eAAe5V,EAAaa,uBAClC,OAAOiV,EAC9B,MAEF,KAAK9V,EAAaY,YAChB,IAAIkV,EACJ,GADIA,EAAoBpyB,KAAKkyB,eAAe5V,EAAac,uBAClC,OAAOgV,EAC9B,MAEF,QAAS3uB,QAAO,GAGpB,IAAIoiB,EAAyB7lB,KAC7B,EAAG,CACD,IAAI6pB,EAAYhE,EAASgE,UACzB,GAAIA,EAAW,CACb,IAAIwI,EAAWxI,EAAU3oB,IAAI6F,GAC7B,GAAIsrB,EAAU,OAAOA,SAEhBxM,EAAWA,EAAS0L,MAC7B,OAAO,MAGTD,EAAArvB,UAAAqwB,SAAA,SAASC,GACP,IAAIviB,EAAUvM,OAAOzD,KAAKgQ,SAC1BvM,OAAOuM,EAAQ2V,IAAI4M,IACnB,IAAIC,EAAiBxiB,EAAQ9O,IAAIqxB,GAEjC,OADA9uB,OAAO+uB,EAAMzrB,MAAQiY,EAAYoS,OAClBoB,EAAOnB,cAGxBC,EAAArvB,UAAA4C,SAAA,WACE,OAAO7E,KAAK6nB,YAEhByJ,EAtHA,CAA2BhF,GAAd5sB,EAAA4xB,QAyHb,IAAAvF,EAAA,SAAAzW,GAQE,SAAAyW,EACEQ,EACA1E,EACA9E,EACAlX,EACAyd,GALF,IAAA9T,EAOEF,EAAA9U,KAAAR,KAAMusB,EAAS1E,EAAY9E,EAAclX,EAAayd,IAAetpB,YAbvEwV,EAAAzO,KAAOiY,EAAY+J,sBAerB,OAjBwCxT,EAAAwW,EAAAzW,GAiBxCyW,EAjBA,CAAwCjE,GAA3BpoB,EAAAqsB,qBAoBb,IAAA0G,EAAA,SAAAnd,GAUE,SAAAmd,EACExwB,EACA4lB,EACA9E,EACA3a,EACAmpB,QADA,IAAAnpB,eACA,IAAAmpB,MAAA,MALF,IAAA/b,EAOEF,EAAA9U,KAAAR,KAAMiC,EAAW4lB,EAAY9E,EAAc3a,EAAempB,IAAKvxB,YAfjEwV,EAAAzO,KAAOiY,EAAY0T,YAiBrB,OAnB+Bnd,EAAAkd,EAAAnd,GAmB/Bmd,EAnBA,CAA+BnB,GAAlB5xB,EAAA+yB,YAsBb,SAAkBE,GAEhBA,IAAA,eAKAA,IAAA,qBAEAA,IAAA,qCAEAA,IAAA,mBAEAA,IAAA,mBAEAA,IAAA,0BAEAA,IAAA,0BAKAA,IAAA,kDAEAA,IAAA,iDAEAA,IAAA,iDAEAA,IAAA,uDAEAA,IAAA,wDAKAA,IAAA,sCAEAA,IAAA,4CAKAA,IAAA,sCAMAA,IAAA,sCAQAA,IAAA,wCAxDF,CAAkBjzB,EAAAizB,YAAAjzB,EAAAizB,eAgElB,IAAA/C,EAAA,WAyCE,SAAAA,IAtBA5vB,KAAA4yB,aAAyC,KAyf3C,OAlfShD,EAAAjuB,OAAP,SAAckxB,GACZ,IAAIC,EAAa,IAAIlD,EAWrB,OAVAkD,EAAWlrB,OAAS,KACpBkrB,EAAWjrB,MAAK,EAChBirB,EAAWD,gBAAkBA,EAC7BC,EAAWC,cAAgB,KAC3BD,EAAWE,WAAa,KACxBF,EAAWG,YAAc,KACzBH,EAAWxpB,WAAaupB,EAAgB5f,UAAU3J,WAClDwpB,EAAWpF,wBAA0BmF,EAAgBnF,wBACrDoF,EAAWI,cAAgBjR,QAAQ,GACnC6Q,EAAWK,iBAAmB,KACvBL,GAMTlD,EAAA3tB,UAAA8F,GAAA,SAAGC,GAAyB,OAAQhI,KAAK6H,MAAQG,IAASA,GAE1D4nB,EAAA3tB,UAAAgG,MAAA,SAAMD,GAAyB,OAA8B,IAAtBhI,KAAK6H,MAAQG,IAEpD4nB,EAAA3tB,UAAAiG,IAAA,SAAIF,GAAyBhI,KAAK6H,OAASG,GAE3C4nB,EAAA3tB,UAAAmxB,MAAA,SAAMprB,GAAyBhI,KAAK6H,QAAUG,GAG9C4nB,EAAA3tB,UAAAoxB,KAAA,WACE,IAAIC,EAAS,IAAI1D,EAWjB,OAVA0D,EAAO1rB,OAAS5H,KAChBszB,EAAOzrB,MAAQ7H,KAAK6H,MACpByrB,EAAOT,gBAAkB7yB,KAAK6yB,gBAC9BS,EAAOP,cAAgB/yB,KAAK+yB,cAC5BO,EAAON,WAAahzB,KAAKgzB,WACzBM,EAAOL,YAAcjzB,KAAKizB,YAC1BK,EAAOhqB,WAAatJ,KAAKsJ,WACzBgqB,EAAO5F,wBAA0B1tB,KAAK0tB,wBACtC4F,EAAOJ,cAAgBlzB,KAAKkzB,cAC5BI,EAAOH,iBAAmBnzB,KAAKmzB,iBAAmBnzB,KAAKmzB,iBAAiBI,QAAU,KAC3ED,GAIT1D,EAAA3tB,UAAAuxB,KAAA,mBACM5rB,EAASnE,OAAOzD,KAAK4H,QACzB,GAAI5H,KAAK4yB,aAAc,KACrB,IAAwB,IAAAvD,EAAAnL,EAAAlkB,KAAK4yB,aAAallB,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAA/C,IAAIqP,EAAWnP,EAAAhjB,MACdmyB,EAAY1rB,GAAGtB,EAAApE,YAAYqxB,SAC7B1zB,KAAK6yB,gBAAgBzC,cAAcqD,qGAGvCzzB,KAAK4yB,aAAe,KAEtB,OAAOhrB,GAITgoB,EAAA3tB,UAAA0xB,eAAA,SAAerrB,EAAY1H,EAAcmvB,EAAelkB,GACtD,IAAI4nB,EAAczzB,KAAK6yB,gBAAgB/C,aAAaxnB,GAAM,GAC1D,GAAKtI,KAAK4yB,aACL,CACH,IAAIgB,EAAgB5zB,KAAK4yB,aAAa1xB,IAAIN,GAC1C,GAAIgzB,EAOF,OANI/nB,EACF7L,KAAK6yB,gBAAgBtG,QAAQhmB,MAC3BgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,OAEdX,QAAO,GACPmwB,OAVa5zB,KAAK4yB,aAAe,IAAIzT,IAkBhD,OALAsU,EAAYvrB,IAAIzB,EAAApE,YAAYqxB,QAC5B1zB,KAAK4yB,aAAa1qB,IAAItH,EAAM6yB,GACxBnrB,EAAKP,GAAG,KACV/H,KAAKmwB,gBAAgBsD,EAAYrG,MAAO2C,GAEnC0D,GAIT7D,EAAA3tB,UAAA4xB,oBAAA,SAAoBzG,EAAY9kB,EAAY1H,GAC1C,GAAKZ,KAAK4yB,aACL,CACH,IAAIgB,EAAgB5zB,KAAK4yB,aAAa1xB,IAAIN,GAC1C,GAAIgzB,EAAe,CACjB,IAAI/nB,EAAc+nB,EAAc/nB,YAOhC,OANIA,EACF7L,KAAK6yB,gBAAgBtG,QAAQhmB,MAC3BgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,OAEdX,QAAO,GACPmwB,QAXa5zB,KAAK4yB,aAAe,IAAIzT,IAchD1b,OAAO2pB,EAAQptB,KAAK6yB,gBAAgB9E,cAAczoB,QAClD,IAAIwuB,EAAc,IAAI3G,EACpBntB,KAAK6yB,gBAAgBtG,QACrB3rB,EACAwsB,EACA9kB,EACA,MAGF,OADAtI,KAAK4yB,aAAa1qB,IAAItH,EAAMkzB,GACrBA,GAITlE,EAAA3tB,UAAA8xB,eAAA,SAAenzB,GACb,IAAIouB,EACAiD,EAAuBjyB,KAC3B,GACE,GAAIiyB,EAAQW,eAAiB5D,EAAQiD,EAAQW,aAAa1xB,IAAIN,IAC5D,OAAOouB,QAEFiD,EAAUA,EAAQrqB,QAC3B,OAAO5H,KAAK6yB,gBAAgB/E,aAAa5sB,IAAIN,IAI/CgvB,EAAA3tB,UAAA+xB,eAAA,SAAe5G,GACb,IAAI6G,EACAC,EACJ,GAAI9G,EAAQ,GAAI,CACd,GAAIA,EAAQ,EAAG,OAAO,EACtB6G,EAAMj0B,KAAKkzB,kBACN,MAAIgB,EAAMl0B,KAAKmzB,kBAMpB,OAAO,EALP,IAAI9yB,GAAM+sB,EAAQ,IAAM,GAAM,EAC9B,GAAI/sB,GAAK6zB,EAAI5uB,OAAQ,OAAO,EAC5B2uB,EAAMC,EAAI7zB,GACV+sB,GAAmB,IAAT/sB,EAAI,GAIhB,OAAO8zB,OACLC,QACEH,EACAI,QACEC,QACArS,QAAQmL,KAGZmH,WAKJ3E,EAAA3tB,UAAAkuB,gBAAA,SAAgB/C,EAAY2C,GAC1B,IAAIkE,EACAO,GAAY,EAChB,GAAIpH,EAAQ,GAAI,CACd,GAAIA,EAAQ,EAAG,OACf6G,EAAMj0B,KAAKkzB,kBACN,CACL,IAAIgB,EAAMl0B,KAAKmzB,iBAMf,IALAqB,GAAQpH,EAAQ,IAAM,GAAM,EACvB8G,IACHl0B,KAAKmzB,iBAAmBe,EAAM,IAAI/tB,MAAMquB,EAAM,GAC9CN,EAAI5uB,OAAS,GAER4uB,EAAI5uB,QAAUkvB,GAAKN,EAAIruB,KAAKoc,QAAQ,IAC3CgS,EAAMC,EAAIM,GACVpH,GAAqB,IAAXoH,EAAM,GAElBP,EAAMlE,EACF0E,OACER,EACAI,QACEC,QACArS,QAAQmL,KAGZgH,QACEH,EACAS,QACEL,QACEC,QACArS,QAAQmL,MAIdoH,GAAO,EAAWx0B,KAAKmzB,iBAAkBqB,GAAOP,EAC/Cj0B,KAAKkzB,cAAgBe,GAI5BrE,EAAA3tB,UAAA0yB,QAAA,SAAQC,GACN50B,KAAK6H,OAAuB,KAAd+sB,EAAM/sB,MACpB7H,KAAKkzB,cAAgB0B,EAAM1B,cAC3BlzB,KAAKmzB,iBAAmByB,EAAMzB,kBAIhCvD,EAAA3tB,UAAA4yB,mBAAA,SAAmBD,GACbA,EAAM7sB,GAAE,IACV/H,KAAKkI,IAAG,IAEN0sB,EAAM7sB,GAAE,IACV/H,KAAKkI,IAAG,KAEN0sB,EAAM7sB,GAAE,IAAsB6sB,EAAM5B,YAAchzB,KAAKgzB,YACzDhzB,KAAKkI,IAAG,KAEN0sB,EAAM7sB,GAAE,KAAyB6sB,EAAM7B,eAAiB/yB,KAAK+yB,eAC/D/yB,KAAKkI,IAAG,KAEN0sB,EAAM7sB,GAAE,KACV/H,KAAKkI,IAAG,OAKZ0nB,EAAA3tB,UAAA6yB,cAAA,SAAcxpB,EAAYC,GAExBvL,KAAK6H,OAASyD,EAAKzD,MAAQ0D,EAAM1D,MAAK,GAGtC7H,KAAK6H,OAAmB,KAAVyD,EAAKzD,MACnB7H,KAAK6H,OAAoB,KAAX0D,EAAM1D,MAGpB7H,KAAKkzB,cAAgBkB,QAAQ9oB,EAAK4nB,cAAe3nB,EAAM2nB,eACvD,IAAI6B,EAAUzpB,EAAK6nB,iBACf6B,EAAWzpB,EAAM4nB,iBACrB,GAAe,MAAX4B,GAA+B,MAAZC,EAAkB,CACvC,IAAIC,EAAUj1B,KAAKmzB,iBACf+B,EAAYC,IAAIJ,EAAQzvB,OAAQ0vB,EAAS1vB,QAC7C,GAAI4vB,EAAW,CACb,GAAKD,EACA,KAAOA,EAAQ3vB,OAAS4vB,GAAWD,EAAQpvB,KAAKoc,QAAQ,SAD/CgT,EAAU,IAAI9uB,MAAM+uB,GAElC,IAAK,IAAI70B,EAAI,EAAGA,EAAI60B,IAAa70B,EAC/B40B,EAAQ50B,GAAK+zB,QACXW,EAAQ10B,GACR20B,EAAS30B,OAYnBuvB,EAAA3tB,UAAAmzB,YAAA,SAAY/qB,EAAqB/B,GAM/B,GAHA7E,OAAO6E,GAAQkU,EAAAyE,KAAKc,OAGfzZ,EAAKP,GAAG,IAAsC,OAAO,EAE1D,IAAImH,EACJ,OAAQwN,EAAA2Y,gBAAgBhrB,IAGtB,KAAKqS,EAAA4Y,aAAaC,SAChB,IAAI1C,EAAkB7yB,KAAK6yB,gBACvB7D,EAAQ6D,EAAgB9E,cAAcrR,EAAA8Y,iBAAiBnrB,IAC3D,OAAQwoB,EAAgBlD,KAAKqE,eAAehF,EAAM5B,QAC3CqI,EAAsBzG,EAAM1mB,KAAMA,GAI3C,KAAKoU,EAAA4Y,aAAaI,SAEhB,OADAjyB,OAAOiZ,EAAAiZ,WAAWtrB,IACXrK,KAAKo1B,YAAY1Y,EAAAkZ,iBAAiBvrB,GAAO/B,GAIlD,KAAKoU,EAAA4Y,aAAaO,UAEhB,IAAIC,EAASryB,OAAOzD,KAAK6yB,gBAAgBtG,QAAQjN,eAAepe,IAAIuC,OAAOiZ,EAAAqZ,iBAAiB1rB,MAE5F,OADA5G,OAAOqyB,EAAO/uB,MAAQiY,EAAY5I,QAC3Bqf,EAAsBhyB,OAAgBqyB,EAAQxtB,MAAOA,GAG9D,KAAKoU,EAAA4Y,aAAaU,OAChB,OAAQtZ,EAAAuZ,YAAY5rB,IAGlB,KAAKqS,EAAAwZ,SAASC,MACd,KAAKzZ,EAAAwZ,SAASE,MACd,KAAK1Z,EAAAwZ,SAASG,MACd,KAAK3Z,EAAAwZ,SAASI,MACd,KAAK5Z,EAAAwZ,SAASK,MACd,KAAK7Z,EAAAwZ,SAASM,MACd,KAAK9Z,EAAAwZ,SAASO,MACd,KAAK/Z,EAAAwZ,SAASQ,MACd,KAAKha,EAAAwZ,SAASS,MACd,KAAKja,EAAAwZ,SAASU,MACd,KAAKla,EAAAwZ,SAASW,MACd,KAAKna,EAAAwZ,SAASY,MACd,KAAKpa,EAAAwZ,SAASa,MACd,KAAKra,EAAAwZ,SAASc,MACd,KAAKta,EAAAwZ,SAASe,MACd,KAAKva,EAAAwZ,SAASgB,MACd,KAAKxa,EAAAwZ,SAASiB,MACd,KAAKza,EAAAwZ,SAASkB,MACd,KAAK1a,EAAAwZ,SAASmB,MACd,KAAK3a,EAAAwZ,SAASoB,MACd,KAAK5a,EAAAwZ,SAASqB,MACd,KAAK7a,EAAAwZ,SAASsB,MACd,KAAK9a,EAAAwZ,SAASuB,MACd,KAAK/a,EAAAwZ,SAASwB,MACd,KAAKhb,EAAAwZ,SAASyB,MACd,KAAKjb,EAAAwZ,SAAS0B,MACd,KAAKlb,EAAAwZ,SAAS2B,MACd,KAAKnb,EAAAwZ,SAAS4B,MACd,KAAKpb,EAAAwZ,SAAS6B,MACd,KAAKrb,EAAAwZ,SAAS8B,MACd,KAAKtb,EAAAwZ,SAAS+B,MACd,KAAKvb,EAAAwZ,SAASgC,MAAO,OAAO,EAG5B,KAAKxb,EAAAwZ,SAASiC,OACZ,QAEIzb,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA0b,cAAc/tB,KAAUqS,EAAA4Y,aAAa+C,QAEhC,GAA7B3b,EAAA4b,iBAAiBppB,IAEc,GAA7BwN,EAAA4b,iBAAiBppB,KAChBlP,KAAKo1B,YAAY1Y,EAAA6b,eAAeluB,GAAO/B,KAI5CoU,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA6b,eAAeluB,KAAUqS,EAAA4Y,aAAa+C,QAEjC,GAA7B3b,EAAA4b,iBAAiBppB,IAEc,GAA7BwN,EAAA4b,iBAAiBppB,KAChBlP,KAAKo1B,YAAY1Y,EAAA0b,cAAc/tB,GAAO/B,KASjD,KAAKoU,EAAAwZ,SAASsC,OAGZ,QAGM9b,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA0b,cAAc/tB,KAAUqS,EAAA4Y,aAAa+C,OAC/D3b,EAAA4b,iBAAiBppB,IAAY5G,EAAKmwB,wBAAwBjc,EAAAyE,KAAKG,OAC3DphB,KAAKo1B,YAAYlmB,EAAS5G,IAG9BoU,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA6b,eAAeluB,KAAUqS,EAAA4Y,aAAa+C,OAChE3b,EAAA4b,iBAAiBppB,IAAY5G,EAAKmwB,wBAAwBjc,EAAAyE,KAAKG,OAC3DphB,KAAKo1B,YAAYlmB,EAAS5G,IAMtC,KAAKoU,EAAAwZ,SAASwC,OACZ,IAAIC,EAAQ,GAAKrwB,EAAKswB,KACtB,OAAOlc,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA6b,eAAeluB,KAAUqS,EAAA4Y,aAAa+C,OAChE3b,EAAA4b,iBAAiBppB,GAAWypB,EAIrC,KAAKjc,EAAAwZ,SAAS2C,OACRF,EAAQ,GAAKrwB,EAAKswB,KACtB,OAAO54B,KAAKo1B,YAAY1Y,EAAA0b,cAAc/tB,GAAO/B,KAC3CoU,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA6b,eAAeluB,KAAUqS,EAAA4Y,aAAa+C,OAChE3b,EAAA4b,iBAAiBppB,GAAWypB,GAMhC,KAAKjc,EAAAwZ,SAAS4C,OACRH,EAAQ,GAAKrwB,EAAKswB,KACtB,OAAOtwB,EAAKP,GAAE,KAER2U,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA6b,eAAeluB,KAAUqS,EAAA4Y,aAAa+C,OAChE3b,EAAA4b,iBAAiBppB,GAAWypB,GAE9B34B,KAAKo1B,YAAY1Y,EAAA0b,cAAc/tB,GAAO/B,MACpCoU,EAAA2Y,gBAAgBnmB,EAAUwN,EAAA6b,eAAeluB,KAAUqS,EAAA4Y,aAAa+C,OAChE3b,EAAA4b,iBAAiBppB,IAAYypB,GAKrC,KAAKjc,EAAAwZ,SAAS6C,OACd,KAAKrc,EAAAwZ,SAAS8C,OACd,KAAKtc,EAAAwZ,SAAS+C,OACZ,OAAOj5B,KAAKo1B,YAAY1Y,EAAA0b,cAAc/tB,GAAO/B,IACtCtI,KAAKo1B,YAAY1Y,EAAA6b,eAAeluB,GAAO/B,GAGlD,MAGF,KAAKoU,EAAA4Y,aAAa4D,MAChB,OAAQxc,EAAAyc,WAAW9uB,IAGjB,KAAKqS,EAAA0c,QAAQC,OACb,KAAK3c,EAAA0c,QAAQE,OAAQ,OAAO,EAG5B,KAAK5c,EAAA0c,QAAQG,OACb,KAAK7c,EAAA0c,QAAQI,OACb,KAAK9c,EAAA0c,QAAQK,UAAW,OAAOnxB,EAAKswB,KAAO,EAE7C,MAIF,KAAKlc,EAAA4Y,aAAa+C,MAChB,IAAI/2B,EAAa,EACjB,OAAQob,EAAAgd,kBAAkBrvB,IACxB,OAAuB/I,EAAQob,EAAA4b,iBAAiBjuB,GAAO,MACvD,OAAuB/I,EAAQob,EAAAid,oBAAoBtvB,GAAO,MAC1D,OAAuB/I,EAAQ8f,IAAI1E,EAAAkd,iBAAiBvvB,IAAQ,MAC5D,OAAuB/I,EAAQ8f,IAAI1E,EAAAmd,iBAAiBxvB,IAAQ,MAC5D,QAAS5G,QAAO,GAElB,OAAQ6E,EAAKvB,MACX,OAAkB,OAAOzF,EAAQ4f,GAAG4Y,WAAax4B,EAAQ4f,GAAG6Y,UAC5D,OAAmB,OAAOz4B,EAAQ6f,IAAI2Y,WAAax4B,EAAQ6f,IAAI4Y,UAC/D,OAAkB,OAAOz4B,EAAQ,GAAKA,EAAQigB,GAAGwY,UACjD,OAAmB,OAAOz4B,EAAQ,GAAKA,EAAQkgB,IAAIuY,UACnD,QAAoB,OAAuB,KAAP,EAARz4B,GAE9B,MAIF,KAAKob,EAAA4Y,aAAa0E,KAChB,IAAIC,OAAQ,EACZ,OAAQvd,EAAAwd,aAAa7vB,IACnB,KAAK,EAAM4vB,EAAWvd,EAAAyd,aAAa9vB,GAAQmS,EAAAyE,KAAKC,GAAK1E,EAAAyE,KAAKM,GAAI,MAC9D,KAAK,EAAM0Y,EAAWvd,EAAAyd,aAAa9vB,GAAQmS,EAAAyE,KAAKE,IAAM3E,EAAAyE,KAAKO,IAAK,MAChE,QAAWyY,EAAWvd,EAAAyd,aAAa9vB,GAAQmS,EAAAyE,KAAKG,IAAM5E,EAAAyE,KAAKQ,IAE7D,OAAOgU,EAAsBwE,EAAU3xB,GAMzC,KAAKoU,EAAA4Y,aAAa8E,MAChB,IAAK1d,EAAA2d,aAAahwB,GAAO,CACvB,IAAIuuB,EAAOn1B,OAAOiZ,EAAA4d,mBAAmBjwB,IACjCkwB,EAAO7d,EAAA8d,cAAcnwB,EAAMuuB,EAAO,GACtC,OAAO54B,KAAKo1B,YAAYmF,EAAMjyB,GAGhC,MAIF,KAAKoU,EAAA4Y,aAAamF,GAChB,OAAOz6B,KAAKo1B,YAAY1Y,EAAAge,UAAUrwB,GAAO/B,IAClCtI,KAAKo1B,YAAY3xB,OAAOiZ,EAAAie,WAAWtwB,IAAQ/B,GAIpD,KAAKoU,EAAA4Y,aAAasF,OAChB,OAAO56B,KAAKo1B,YAAY1Y,EAAAme,cAAcxwB,GAAO/B,IACtCtI,KAAKo1B,YAAY1Y,EAAAoe,cAAczwB,GAAO/B,GAI/C,KAAKoU,EAAA4Y,aAAayF,KAChB,IAAIxO,EAAUvsB,KAAK6yB,gBAAgBtG,QAC/B1G,EAAWpiB,OAAO8oB,EAAQhN,gBAAgBre,IAAIuC,OAAOiZ,EAAAse,cAAc3wB,MACvE5G,OAAOoiB,EAAS9e,MAAQiY,EAAYnH,UACpC,IAAIvO,EAAwBuc,EAAU5S,UAAU3J,WAChD,OAAmBuc,EAAU8J,KAAK5nB,GAAE,IAC7B0tB,EAAsBnsB,EAAYhB,GAI3C,KAAKoU,EAAA4Y,aAAa2F,YAAa,OAAO,EAExC,OAAO,GAITrL,EAAA3tB,UAAAwuB,SAAA,WACEhtB,OAAsB,MAAfzD,KAAK4H,QACZ5H,KAAK+yB,cAAgB,KACrB/yB,KAAKgzB,WAAa,KAClBhzB,KAAKizB,YAAc,KACnBjzB,KAAK0tB,wBAA0B,MAEnCkC,EA5gBA,GA+gBA,SAAS6F,EAAsBwE,EAAgB/uB,GAC7C,OAAQ+uB,EAASlyB,GAAE,IACZkyB,EAASrB,KAAO1tB,EAAO0tB,MACvBqB,EAASlyB,GAAE,IAAsBmD,EAAOnD,GAAE,GAlhBtCrI,EAAAkwB,sFCl/Fb,IAyBY0F,EAzBZ4F,EAAA/6B,EAAA,IAeA,SAAkBg7B,GAChBA,IAAA,eACAA,IAAA,aACAA,IAAA,aACAA,IAAA,aACAA,IAAA,aACAA,IAAA,6BACAA,IAAA,gBAPF,CAAkBz7B,EAAAy7B,aAAAz7B,EAAAy7B,gBAUlB,SAAY7F,GACVA,IAAA,QAAU8F,sBAAoB,UAC9B9F,IAAA,MAAQ+F,oBAAkB,QAC1B/F,IAAA,GAAKgG,iBAAe,KACpBhG,IAAA,KAAOiG,mBAAiB,OACxBjG,IAAA,MAAQkG,oBAAkB,QAC1BlG,IAAA,OAASmG,qBAAmB,SAC5BnG,IAAA,KAAOoG,mBAAiB,OACxBpG,IAAA,aAAeqG,2BAAyB,eACxCrG,IAAA,SAAWsG,uBAAqB,WAChCtG,IAAA,SAAWuG,uBAAqB,WAChCvG,IAAA,UAAYwG,wBAAsB,YAClCxG,IAAA,UAAYyG,wBAAsB,YAClCzG,IAAA,KAAO0G,mBAAiB,OACxB1G,IAAA,MAAQ2G,oBAAkB,QAC1B3G,IAAA,MAAQ4G,oBAAkB,QAC1B5G,IAAA,MAAQ6G,oBAAkB,QAC1B7G,IAAA,OAAS8G,qBAAmB,SAC5B9G,IAAA,OAAS+G,qBAAmB,SAC5B/G,IAAA,KAAOgH,mBAAiB,OACxBhH,IAAA,OAASiH,qBAAmB,SAC5BjH,IAAA,KAAOkH,mBAAiB,OACxBlH,IAAA,IAAMmH,kBAAgB,MACtBnH,IAAA,YAAcoH,0BAAwB,cACtCpH,IAAA,cAAgBqH,4BAA0B,gBAC1CrH,IAAA,UAAYsH,wBAAsB,YAClCtH,IAAA,WAAauH,yBAAuB,aACpCvH,IAAA,WAAawH,yBAAuB,aA3BtC,CAAYxH,EAAA51B,EAAA41B,eAAA51B,EAAA41B,kBAmCZ,SAAY8D,GACVA,IAAA,OAAS2D,qBAAmB,SAC5B3D,IAAA,OAAS4D,qBAAmB,SAC5B5D,IAAA,UAAY6D,wBAAsB,YAClC7D,IAAA,OAAS8D,uBAAqB,SAC9B9D,IAAA,OAAS+D,uBAAqB,SAC9B/D,IAAA,QAAUgE,wBAAsB,UAChChE,IAAA,SAAWiE,yBAAuB,WAClCjE,IAAA,SAAWkE,yBAAuB,WAClClE,IAAA,WAAamE,2BAAyB,aACtCnE,IAAA,QAAUoE,wBAAsB,UAChCpE,IAAA,OAASqE,qBAAmB,SAC5BrE,IAAA,OAASsE,qBAAmB,SAC5BtE,IAAA,OAASuE,qBAAmB,SAC5BvE,IAAA,UAAYwE,wBAAsB,YAClCxE,IAAA,OAASyE,uBAAqB,SAC9BzE,IAAA,OAAS0E,uBAAqB,SAC9B1E,IAAA,QAAU2E,wBAAsB,UAChC3E,IAAA,SAAW4E,yBAAuB,WAClC5E,IAAA,SAAW6E,yBAAuB,WAClC7E,IAAA,WAAa8E,2BAAyB,aACtC9E,IAAA,QAAU+E,wBAAsB,UAChC/E,IAAA,OAASgF,qBAAmB,SAC5BhF,IAAA,UAAYiF,yBAAuB,YACnCjF,IAAA,UAAYkF,yBAAuB,YACnClF,IAAA,QAAUmF,sBAAoB,UAC9BnF,IAAA,cAAgBoF,iCAA+B,gBAC/CpF,IAAA,cAAgBqF,iCAA+B,gBAC/CrF,IAAA,cAAgBsF,iCAA+B,gBAC/CtF,IAAA,cAAgBuF,iCAA+B,gBAC/CvF,IAAA,cAAgBwF,iCAA+B,gBAC/CxF,IAAA,cAAgByF,iCAA+B,gBAC/CzF,IAAA,cAAgB0F,iCAA+B,gBAC/C1F,IAAA,cAAgB2F,iCAA+B,gBAC/C3F,IAAA,eAAiB4F,+BAA6B,iBAC9C5F,IAAA,eAAiB6F,+BAA6B,iBAC9C7F,IAAA,gBAAkB8F,mCAAiC,kBACnD9F,IAAA,gBAAkB+F,mCAAiC,kBACnD/F,IAAA,gBAAkBgG,mCAAiC,kBACnDhG,IAAA,gBAAkBiG,mCAAiC,kBACnDjG,IAAA,gBAAkBkG,mCAAiC,kBACnDlG,IAAA,gBAAkBmG,mCAAiC,kBACnDnG,IAAA,gBAAkBoG,mCAAiC,kBACnDpG,IAAA,gBAAkBqG,mCAAiC,kBACnDrG,IAAA,WAAasG,2BAAyB,aACtCtG,IAAA,UAAYuG,0BAAwB,YACpCvG,IAAA,eAAiBwG,6BAA2B,iBAC5CxG,IAAA,eAAiByG,6BAA2B,iBAG5CzG,IAAA,cAAgB0G,0BAAwB,gBACxC1G,IAAA,eAAiB2G,2BAAyB,iBAC1C3G,IAAA,cAAgB4G,0BAAwB,gBACxC5G,IAAA,eAAiB6G,2BAAyB,iBAC1C7G,IAAA,eAAiB8G,2BAAyB,iBAtD5C,CAAYxgC,EAAA05B,UAAA15B,EAAA05B,aAmEZ,SAAYlD,GACVA,IAAA,OAASiK,qBAAmB,SAC5BjK,IAAA,OAASkK,qBAAmB,SAC5BlK,IAAA,OAASmK,qBAAmB,SAC5BnK,IAAA,OAASoK,sBAAoB,SAC7BpK,IAAA,OAASqK,sBAAoB,SAC7BrK,IAAA,OAASsK,sBAAoB,SAC7BtK,IAAA,OAASuK,sBAAoB,SAC7BvK,IAAA,OAASwK,qBAAmB,SAC5BxK,IAAA,MAAQyK,oBAAkB,QAC1BzK,IAAA,OAAS0K,qBAAmB,SAC5B1K,IAAA,OAAS2K,qBAAmB,SAC5B3K,IAAA,OAAS4K,sBAAoB,SAC7B5K,IAAA,OAAS6K,sBAAoB,SAC7B7K,IAAA,QAAU8K,sBAAoB,UAC9B9K,IAAA,QAAU+K,sBAAoB,UAC9B/K,IAAA,MAAQgL,oBAAkB,QAC1BhL,IAAA,MAAQiL,oBAAkB,QAC1BjL,IAAA,MAAQkL,qBAAmB,QAC3BlL,IAAA,MAAQmL,qBAAmB,QAC3BnL,IAAA,MAAQoL,qBAAmB,QAC3BpL,IAAA,MAAQqL,qBAAmB,QAC3BrL,IAAA,MAAQsL,qBAAmB,QAC3BtL,IAAA,MAAQuL,qBAAmB,QAC3BvL,IAAA,MAAQwL,qBAAmB,QAC3BxL,IAAA,MAAQyL,qBAAmB,QAC3BzL,IAAA,OAAS0L,qBAAmB,SAC5B1L,IAAA,OAAS2L,qBAAmB,SAC5B3L,IAAA,OAAS4L,qBAAmB,SAC5B5L,IAAA,OAAS6L,sBAAoB,SAC7B7L,IAAA,OAAS8L,sBAAoB,SAC7B9L,IAAA,OAAS+L,sBAAoB,SAC7B/L,IAAA,OAASgM,sBAAoB,SAC7BhM,IAAA,OAASiM,qBAAmB,SAC5BjM,IAAA,MAAQkM,oBAAkB,QAC1BlM,IAAA,OAASmM,qBAAmB,SAC5BnM,IAAA,OAASoM,qBAAmB,SAC5BpM,IAAA,OAASqM,sBAAoB,SAC7BrM,IAAA,OAASsM,sBAAoB,SAC7BtM,IAAA,QAAUuM,sBAAoB,UAC9BvM,IAAA,QAAUwM,sBAAoB,UAC9BxM,IAAA,MAAQyM,oBAAkB,QAC1BzM,IAAA,MAAQ0M,oBAAkB,QAC1B1M,IAAA,MAAQ2M,qBAAmB,QAC3B3M,IAAA,MAAQ4M,qBAAmB,QAC3B5M,IAAA,MAAQ6M,qBAAmB,QAC3B7M,IAAA,MAAQ8M,qBAAmB,QAC3B9M,IAAA,MAAQ+M,qBAAmB,QAC3B/M,IAAA,MAAQgN,qBAAmB,QAC3BhN,IAAA,MAAQiN,qBAAmB,QAC3BjN,IAAA,MAAQkN,qBAAmB,QAC3BlN,IAAA,OAASmN,uBAAqB,SAC9BnN,IAAA,OAASoN,uBAAqB,SAC9BpN,IAAA,OAASqN,uBAAqB,SAC9BrN,IAAA,OAASsN,uBAAqB,SAC9BtN,IAAA,YAAcuN,4BAA0B,cACxCvN,IAAA,OAASwN,uBAAqB,SAC9BxN,IAAA,OAASyN,uBAAqB,SAC9BzN,IAAA,MAAQ0N,sBAAoB,QAC5B1N,IAAA,MAAQ2N,sBAAoB,QAC5B3N,IAAA,MAAQ4N,sBAAoB,QAC5B5N,IAAA,MAAQ6N,sBAAoB,QAC5B7N,IAAA,MAAQ8N,sBAAoB,QAC5B9N,IAAA,MAAQ+N,sBAAoB,QAC5B/N,IAAA,OAASgO,uBAAqB,SAC9BhO,IAAA,OAASiO,uBAAqB,SAC9BjO,IAAA,OAASkO,uBAAqB,SAC9BlO,IAAA,OAASmO,uBAAqB,SAC9BnO,IAAA,YAAcoO,4BAA0B,cACxCpO,IAAA,OAASqO,uBAAqB,SAC9BrO,IAAA,OAASsO,uBAAqB,SAC9BtO,IAAA,MAAQuO,sBAAoB,QAC5BvO,IAAA,MAAQwO,sBAAoB,QAC5BxO,IAAA,MAAQyO,sBAAoB,QAC5BzO,IAAA,MAAQ0O,sBAAoB,QAC5B1O,IAAA,MAAQ2O,sBAAoB,QAC5B3O,IAAA,MAAQ4O,sBAAoB,QA5E9B,CAAYplC,EAAAw2B,WAAAx2B,EAAAw2B,cA+EZ,SAAY6O,GACVA,IAAA,cAAgBC,0BAAwB,gBACxCD,IAAA,WAAaE,uBAAqB,aAFpC,CAAYvlC,EAAAqlC,SAAArlC,EAAAqlC,YASZ,SAAYG,GACVA,IAAA,IAAMC,yBAAuB,MAC7BD,IAAA,IAAME,yBAAuB,MAC7BF,IAAA,IAAMG,yBAAuB,MAC7BH,IAAA,GAAKI,wBAAsB,KAC3BJ,IAAA,IAAMK,yBAAuB,MAC7BL,IAAA,KAAOM,0BAAwB,OANjC,CAAY9lC,EAAAwlC,cAAAxlC,EAAAwlC,iBAyHZ,IAAAO,EAAA,oBAAAA,KAWA,OANSA,EAAA9jC,OAAP,SAAc+jC,EAAoBC,GAChC,IAAIC,EAAU,IAAIH,EAGlB,OAFAG,EAAQF,OAASA,EACjBE,EAAQD,OAASA,EACVC,GAEXH,EAXA,GAAa/lC,EAAA+lC,gBAab,IAAAI,EAAA,WAyBE,SAAAA,IAkZQ7lC,KAAA8lC,oBAA6B,EAC7B9lC,KAAA+lC,sBAA6B,EAyQ7B/lC,KAAAgmC,qBAA8B,EAC9BhmC,KAAAimC,sBAA+B,EAgMzC,OAh3BSJ,EAAAlkC,OAAP,WACE,IAAIhC,EAAS,IAAIkmC,EAGjB,OAFAlmC,EAAOwuB,IAAM+X,wBACbvmC,EAAOwmC,cAAgBC,OAAOC,SAAS,IAChC1mC,GAGFkmC,EAAAS,WAAP,SAAkBZ,GAChB,IAAIa,EAAOC,EAAad,GACxB,IACE,IAAI/lC,EAAS,IAAIkmC,EAGjB,OAFAlmC,EAAOwuB,IAAMsY,oBAAoBF,EAAMb,EAAOpgC,QAC9C3F,EAAOwmC,cAAgBC,OAAOC,SAAS,IAChC1mC,UAEPymC,OAAO5S,KAAKkT,WAAkBH,MAQlCV,EAAA5jC,UAAA0kC,gBAAA,SACE/lC,EACAgmC,EACAC,GAEA,IAAIC,EAAOC,EAAYnmC,GACnB2lC,EAAOS,EAAcH,GACzB,IACE,OAAOI,yBAAyBjnC,KAAKmuB,IAAK2Y,EAAMF,EAAQL,EAAMM,EAAaA,EAAWvhC,OAAS,WAE/F8gC,OAAO5S,KAAK+S,GACZH,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAilC,2BAAA,SACEN,EACAC,GAEA,IAAIN,EAAOS,EAAcH,GACzB,IACE,OAAOM,oCAAoCnnC,KAAKmuB,IAAKyY,EAAQL,EAAMM,EAAaA,EAAWvhC,OAAS,WAEpG8gC,OAAO5S,KAAK+S,KAIhBV,EAAA5jC,UAAAmlC,mBAAA,SAAmBxmC,GACjB,IAAIkmC,EAAOC,EAAYnmC,GACvB,IACEymC,4BAA4BrnC,KAAKmuB,IAAK2Y,WAEtCV,OAAO5S,KAAKsT,KAMhBjB,EAAA5jC,UAAAqlC,UAAA,SAAUhmC,GACR,IAAIimC,EAAMvnC,KAAKmmC,cAEf,OADAqB,sBAAsBD,EAAKjmC,GACpBmmC,eAAeznC,KAAKmuB,IAAKoZ,IAGlC1B,EAAA5jC,UAAAylC,UAAA,SAAUC,EAAeC,QAAA,IAAAA,MAAA,GACvB,IAAIL,EAAMvnC,KAAKmmC,cAEf,OADA0B,sBAAsBN,EAAKI,EAAUC,GAC9BH,eAAeznC,KAAKmuB,IAAKoZ,IAGlC1B,EAAA5jC,UAAA6lC,UAAA,SAAUxmC,GACR,IAAIimC,EAAMvnC,KAAKmmC,cAEf,OADA4B,wBAAwBR,EAAKjmC,GACtBmmC,eAAeznC,KAAKmuB,IAAKoZ,IAGlC1B,EAAA5jC,UAAA+lC,UAAA,SAAU1mC,GACR,IAAIimC,EAAMvnC,KAAKmmC,cAEf,OADA8B,wBAAwBV,EAAKjmC,GACtBmmC,eAAeznC,KAAKmuB,IAAKoZ,IAKlC1B,EAAA5jC,UAAAimC,YAAA,SACEC,EACA99B,GAEA,OAAO+9B,eAAepoC,KAAKmuB,IAAKga,EAAI99B,IAGtCw7B,EAAA5jC,UAAAomC,aAAA,SACEF,EACA78B,EACAC,GAEA,OAAO+8B,gBAAgBtoC,KAAKmuB,IAAKga,EAAI78B,EAAMC,IAG7Cs6B,EAAA5jC,UAAAsmC,WAAA,SACEJ,EACAvnC,EACA4nC,QADA,IAAA5nC,MAAA,WACA,IAAA4nC,MAAA,MAEA,IAAI1B,EAAOC,EAAYnmC,GACnB2lC,EAAOkC,EAAcD,GACzB,IACE,OAAOE,cAAc1oC,KAAKmuB,IAAKga,EAAIrB,EAAMP,EAAMiC,EAA6BA,EAAUljC,OAAS,WAE/F8gC,OAAO5S,KAAK+S,GACZH,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAA0mC,eAAA,SACEvb,EACA9kB,GAEA,OAAOsgC,kBAAkB5oC,KAAKmuB,IAAKf,EAAO9kB,IAG5Cu9B,EAAA5jC,UAAA4mC,eAAA,SACEzb,EACA9rB,GAEA,OAAOwnC,kBAAkB9oC,KAAKmuB,IAAKf,EAAO9rB,IAG5CukC,EAAA5jC,UAAA8mC,gBAAA,SACEnoC,EACA0H,GAEA,IAAIw+B,EAAOC,EAAYnmC,GACvB,IACE,OAAOooC,mBAAmBhpC,KAAKmuB,IAAK2Y,EAAMx+B,WAE1C89B,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAgnC,WAAA,SACEC,EACAC,EACAC,EACA9gC,EACAq9B,GAEA,YAFA,IAAAA,MAAA,GAEO0D,cAAcrpC,KAAKmuB,IAAK+a,EAAOC,EAAS,EAAI,EAAGxD,EAA6BuD,EAAO5gC,EAAM8gC,IAGlGvD,EAAA5jC,UAAAqnC,YAAA,SACEJ,EACAE,EACA9nC,EACAgH,EACAq9B,GAEA,YAFA,IAAAA,MAAA,GAEO4D,eAAevpC,KAAKmuB,IAAK+a,EAAOvD,EAA6BuD,EAAOE,EAAK9nC,EAAOgH,IAGzFu9B,EAAA5jC,UAAAunC,iBAAA,SACEN,EACAE,EACA9gC,EACAq9B,GAEA,YAFA,IAAAA,MAAA,GAEO8D,oBAAoBzpC,KAAKmuB,IAAK+a,EAAOvD,EAAQr9B,EAAM8gC,IAG5DvD,EAAA5jC,UAAAynC,kBAAA,SACER,EACAE,EACA9nC,EACAgH,EACAq9B,GAEA,YAFA,IAAAA,MAAA,GAEOgE,qBAAqB3pC,KAAKmuB,IAAK+a,EAAOvD,EAAQyD,EAAK9nC,EAAOgH,IAGnEu9B,EAAA5jC,UAAA2nC,gBAAA,SACEzB,EACAe,EACAvD,EACAyD,EACA9nC,EACAgH,GAEA,OAAOuhC,mBAAmB7pC,KAAKmuB,IAAKga,EAAIe,EAAOvD,EAAQyD,EAAK9nC,EAAOgH,IAGrEu9B,EAAA5jC,UAAA6nC,oBAAA,SACEZ,EACAvD,EACAyD,EACAW,EACAC,EACA1hC,GAEA,OAAO2hC,uBAAuBjqC,KAAKmuB,IAAK+a,EAAOvD,EAAQyD,EAAKW,EAAUC,EAAa1hC,IAGrFu9B,EAAA5jC,UAAAioC,iBAAA,SACEd,EACAW,EACAI,EACAC,GAEA,OAAOC,oBAAoBrqC,KAAKmuB,IAAKib,EAAKW,EAAUI,EAASC,IAG/DvE,EAAA5jC,UAAAqoC,iBAAA,SACElB,EACAmB,GAEA,OAAOC,oBAAoBxqC,KAAKmuB,IAAKib,EAAKmB,IAK5C1E,EAAA5jC,UAAAwoC,eAAA,SACErd,EACA9rB,GAEA,OAAOopC,kBAAkB1qC,KAAKmuB,IAAKf,EAAO9rB,IAG5CukC,EAAA5jC,UAAA0oC,gBAAA,SACE/pC,EACAU,GAEA,IAAIwlC,EAAOC,EAAYnmC,GACvB,IACE,OAAOgqC,mBAAmB5qC,KAAKmuB,IAAK2Y,EAAMxlC,WAE1C8kC,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAA4oC,YAAA,SACEn7B,EACAo7B,EACAxiC,QAAA,IAAAA,MAAA,GAEA,IAAIw+B,EAAOC,EAAYr3B,GACnB62B,EAAOkC,EAAcqC,GACzB,IACE,OAAOC,eAAe/qC,KAAKmuB,IAAK2Y,EAAMP,EAAMuE,EAASxlC,OAAQgD,WAE7D89B,OAAO5S,KAAK+S,GACZH,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAA+oC,YAAA,SACEt7B,EACArB,EACA/M,QADA,IAAA+M,MAAA,QACA,IAAA/M,MAAA,GAEA,IAAIwlC,EAAOC,EAAYr3B,GACvB,IACE,OAAOu7B,eAAejrC,KAAKmuB,IAAK2Y,EAAMz4B,EAAW/M,WAEjD8kC,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAipC,WAAA,SACEjgC,GAEA,OAAOkgC,cAAcnrC,KAAKmuB,IAAKljB,IAGjC46B,EAAA5jC,UAAAmpC,WAAA,SACE17B,EACAwD,GAEA,IAAI4zB,EAAOC,EAAYr3B,GACvB,IACE,OAAO27B,cAAcrrC,KAAKmuB,IAAK2Y,EAAM5zB,WAErCkzB,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAqpC,SAAA,SACEj9B,EACAyD,EACAC,GAEA,YAFA,IAAAA,MAAA,GAEOw5B,YAAYvrC,KAAKmuB,IAAK9f,EAAWyD,EAAQC,IAGlD8zB,EAAA5jC,UAAAupC,UAAA,WACE,OAAOC,aAAazrC,KAAKmuB,MAG3B0X,EAAA5jC,UAAAypC,aAAA,SACEzgC,GAEA,YAFA,IAAAA,MAAA,GAEO0gC,gBAAgB3rC,KAAKmuB,IAAKljB,IAGnC46B,EAAA5jC,UAAA2pC,aAAA,SACE95B,EACAC,EACA1D,GAEA,OAAOw9B,gBAAgB7rC,KAAKmuB,IAAK9f,EAAWyD,EAAQC,IAGtD8zB,EAAA5jC,UAAA6pC,aAAA,SACEr+B,EACAs+B,EACA19B,EACA/M,QAAA,IAAAA,MAAA,GAIA,IAFA,IAAI0qC,EAAWv+B,EAAMnI,OACjB2mC,EAAO,IAAI9lC,MAAa6lC,GACnB3rC,EAAI,EAAGA,EAAI2rC,IAAY3rC,EAC9B4rC,EAAK5rC,GAAK0mC,EAAYt5B,EAAMpN,IAE9B,IAAIkmC,EAAOS,EAAciF,GACrBnF,EAAOC,EAAYgF,GACvB,IACE,OAAOG,gBAAgBlsC,KAAKmuB,IAAKoY,EAAMyF,EAAUlF,EAAMz4B,EAAW/M,WAElE8kC,OAAO5S,KAAKsT,GACZV,OAAO5S,KAAK+S,GACZ,IAASlmC,EAAI2rC,EAAW,EAAG3rC,GAAK,IAAKA,EAAG+lC,OAAO5S,KAAKyY,EAAK5rC,MAI7DwlC,EAAA5jC,UAAAkqC,WAAA,SACEna,EACAwW,EACAl/B,GAEA,IAAIw9B,EAAOC,EAAY/U,GACnBuU,EAAOkC,EAAcD,GACzB,IACE,OAAO4D,cAAcpsC,KAAKmuB,IAAK2Y,EAAMP,EAAMiC,GAAYA,EAASljC,QAAU,EAAGgE,WAE7E88B,OAAO5S,KAAK+S,GACZH,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAoqC,mBAAA,SACEjf,EACAob,EACA8D,GAEA,IAAI/F,EAAOkC,EAAcD,GACrB1B,EAAOC,EAAYuF,GACvB,IACE,OAAOC,sBAAsBvsC,KAAKmuB,IAAKf,EAAOmZ,EAAMiC,GAAYA,EAASljC,QAAU,EAAGwhC,WAEtFV,OAAO5S,KAAKsT,GACZV,OAAO5S,KAAK+S,KAIhBV,EAAA5jC,UAAAuqC,kBAAA,WACE,OAAOC,qBAAqBzsC,KAAKmuB,MAKnC0X,EAAA5jC,UAAAyqC,UAAA,SACE9rC,EACA0H,EACAqkC,EACA1jC,GAEA,IAAI69B,EAAOC,EAAYnmC,GACvB,IACE,OAAOgsC,mBAAmB5sC,KAAKmuB,IAAK2Y,EAAMx+B,EAAMqkC,EAAU,EAAI,EAAG1jC,WAEjEm9B,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAA4qC,aAAA,SACEjsC,GAEA,IAAIkmC,EAAOC,EAAYnmC,GACvB,IACEksC,sBAAsB9sC,KAAKmuB,IAAK2Y,WAEhCV,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAA8qC,YAAA,SACEnsC,EACA0H,EACA0kC,EACA95B,GAEA,IAAI4zB,EAAOC,EAAYnmC,GACnB2lC,EAAOS,EAAcgG,GACzB,IACE,OAAOC,qBAAqBjtC,KAAKmuB,IAAK2Y,EAAMx+B,EAAMi+B,EAAMyG,EAAWA,EAAS1nC,OAAS,EAAG4N,WAExFkzB,OAAO5S,KAAK+S,GACZH,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAirC,eAAA,SAAetsC,GACb,IAAIkmC,EAAOC,EAAYnmC,GACvB,IACEusC,wBAAwBntC,KAAKmuB,IAAK2Y,WAElCV,OAAO5S,KAAKsT,KAOhBjB,EAAA5jC,UAAAmrC,qBAAA,SAAqBxG,EAAoBC,EAAiC3zB,GACxElT,KAAK+lC,qBAAuBtiC,QAAQzD,KAAK+lC,sBACzC,IAAIsH,EAAWrtC,KAAK8lC,oBACfuH,IAAUrtC,KAAK8lC,oBAAsBuH,EAAWtG,EAAY,KACjE,IAAIR,EAAOS,EAAcH,GACzB,IACE,IAAIyG,EAAUrG,yBAAyBjnC,KAAKmuB,IAAKkf,EAAUzG,EAAQL,EAAMM,EAAaA,EAAWvhC,OAAS,GAC1G,OAAO2nC,qBAAqBjtC,KAAKmuB,IAAKkf,EAAUC,EAAS,EAAG,EAAGp6B,WAE/DkzB,OAAO5S,KAAK+S,KAIhBV,EAAA5jC,UAAAsrC,wBAAA,WACEvtC,KAAK+lC,sBAAwBtiC,OAAOzD,KAAK+lC,sBACzC,IAAIsH,EAAW5pC,OAAOzD,KAAK8lC,qBAC3BqH,wBAAwBntC,KAAKmuB,IAAKkf,GAClChG,4BAA4BrnC,KAAKmuB,IAAKkf,IAGxCxH,EAAA5jC,UAAAurC,kBAAA,SACEzqB,EACAxR,GAEA,IAAIk8B,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYx1B,GACxB,IACE,OAAOo8B,2BAA2B3tC,KAAKmuB,IAAKsf,EAAOC,WAEnDtH,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAIhB5H,EAAA5jC,UAAA2rC,eAAA,SACE7qB,EACAxR,GAEA,IAAIk8B,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYx1B,GACxB,IACE,OAAOs8B,wBAAwB7tC,KAAKmuB,IAAKsf,EAAOC,WAEhDtH,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAIhB5H,EAAA5jC,UAAA6rC,gBAAA,SACE/qB,EACAxR,GAEA,IAAIk8B,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYx1B,GACxB,IACE,OAAOw8B,yBAAyB/tC,KAAKmuB,IAAKsf,EAAOC,WAEjDtH,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAIhB5H,EAAA5jC,UAAA+rC,gBAAA,SACEjrB,EACAxR,GAEA,IAAIk8B,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYx1B,GACxB,IACE,OAAO08B,yBAAyBjuC,KAAKmuB,IAAKsf,EAAOC,WAEjDtH,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAIhB5H,EAAA5jC,UAAAisC,aAAA,SAAa38B,GACX,IAAIu1B,EAAOC,EAAYx1B,GACvB,IACE48B,sBAAsBnuC,KAAKmuB,IAAK2Y,WAEhCV,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAmsC,kBAAA,SACErrB,EACAsrB,EACAC,EACAC,GAEA,IAAId,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYsH,GACpBG,EAAQzH,EAAYuH,GACxB,IACE,OAAOG,2BAA2BzuC,KAAKmuB,IAAKsf,EAAOC,EAAOc,EAAOD,WAEjEnI,OAAO5S,KAAKgb,GACZpI,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAIhB5H,EAAA5jC,UAAAysC,eAAA,SACE3rB,EACAsrB,EACAC,GAEA,IAAIb,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYsH,GACpBG,EAAQzH,EAAYuH,GACxB,IACE,OAAOK,wBAAwB3uC,KAAKmuB,IAAKsf,EAAOC,EAAOc,WAEvDpI,OAAO5S,KAAKgb,GACZpI,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAIhB5H,EAAA5jC,UAAA2sC,gBAAA,SACE7rB,EACAsrB,EACAC,GAEA,IAAIb,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYsH,GACpBG,EAAQzH,EAAYuH,GACxB,IACE,OAAOO,yBAAyB7uC,KAAKmuB,IAAKsf,EAAOC,EAAOc,WAExDpI,OAAO5S,KAAKgb,GACZpI,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAIhB5H,EAAA5jC,UAAA6sC,gBAAA,SACE/rB,EACAsrB,EACAC,EACAS,GAEA,IAAItB,EAAQ1G,EAAYhkB,GACpB2qB,EAAQ3G,EAAYsH,GACpBG,EAAQzH,EAAYuH,GACxB,IACE,OAAOU,yBAAyBhvC,KAAKmuB,IAAKsf,EAAOC,EAAOc,EAAOO,WAE/D3I,OAAO5S,KAAKgb,GACZpI,OAAO5S,KAAKka,GACZtH,OAAO5S,KAAKia,KAOhB5H,EAAA5jC,UAAAgtC,UAAA,SACEC,EACAC,EACAC,EACApd,EACAxN,QAAA,IAAAA,MAAA,MAOA,IALA,IAAIsiB,EAAOC,EAAYviB,GACnB3Z,EAAIukC,EAAS9pC,OACb+pC,EAAO,IAAIlpC,MAAa0E,GACxBykC,EAAO,IAAInpC,MAAqB0E,GAChC0kC,EAAO,IAAIppC,MAAa0E,GACnBxK,EAAI,EAAGA,EAAIwK,IAAKxK,EAAG,CAC1B,IAAIqlC,EAAS0J,EAAS/uC,GAAGqlC,OACrBC,EAASyJ,EAAS/uC,GAAGslC,OACzB0J,EAAKhvC,GAAKmmC,EAAad,GACvB4J,EAAKjvC,GAAK2xB,GAAUkJ,EAAAsU,OAAOC,OACvBzvC,KAAK0nC,UAAUgI,QAAQ/J,GAASgK,SAAShK,IACzC3lC,KAAKsnC,UAAUoI,QAAQ/J,IAC3B4J,EAAKlvC,GAAKqlC,EAAOpgC,OAEnB,IAAIsqC,EAAQ5I,EAAcqI,GACtBQ,EAAQ7I,EAAcsI,GACtBQ,EAAQ9I,EAAcuI,GAC1B,IACEQ,mBAAmB/vC,KAAKmuB,IAAK+gB,EAASC,EAASrI,EAAM8I,EAAOC,EAAOC,EAAOjlC,WAE1Eu7B,OAAO5S,KAAKsc,GACZ1J,OAAO5S,KAAKqc,GACZzJ,OAAO5S,KAAKoc,GACZ,IAASvvC,EAAIwK,EAAI,EAAGxK,GAAK,IAAKA,EAAG+lC,OAAO5S,KAAK6b,EAAKhvC,IAClD+lC,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAA+tC,iBAAA,SACEd,EACAC,EACAc,GAIA,IAFA,IAAIjE,EAAWiE,EAAM3qC,OACjBmI,EAAQ,IAAItH,MAAa6lC,GACpB3rC,EAAI,EAAGA,EAAI2rC,IAAY3rC,EAC9BoN,EAAMpN,GAAK0mC,EAAYkJ,EAAM5vC,IAE/B,IAAIkmC,EAAOS,EAAcv5B,GACzB,IACEyiC,0BAA0BlwC,KAAKmuB,IAAK+gB,EAASC,EAAS5I,EAAMyF,WAE5D5F,OAAO5S,KAAK+S,GACZ,IAASlmC,EAAI2rC,EAAU3rC,GAAK,IAAKA,EAAG+lC,OAAO5S,KAAK/lB,EAAMpN,MAI1DwlC,EAAA5jC,UAAAkuC,SAAA,SAASC,GACPC,kBAAkBrwC,KAAKmuB,IAAKiiB,IAG9BvK,EAAA5jC,UAAAquC,iBAAA,WACE,OAAOC,6BAGT1K,EAAA5jC,UAAAuuC,iBAAA,SAAiBC,QAAA,IAAAA,MAAA,GACfC,0BAA0BD,IAG5B5K,EAAA5jC,UAAA0uC,eAAA,WACE,OAAOC,2BAGT/K,EAAA5jC,UAAA4uC,eAAA,SAAeJ,QAAA,IAAAA,MAAA,GACbK,wBAAwBL,IAG1B5K,EAAA5jC,UAAA8uC,aAAA,SAAaC,QAAA,IAAAA,OAAA,GACXC,sBAAsBD,IAGxBnL,EAAA5jC,UAAAivC,SAAA,SAASd,QAAA,IAAAA,MAAA,GACHA,EACFe,0BAA0Bf,EAAMpwC,KAAKmuB,KAErCijB,wBAAwBpxC,KAAKmuB,MAIjC0X,EAAA5jC,UAAAovC,UAAA,SAAUC,EAAkBlB,QAAA,IAAAA,MAAA,GAG1B,IAFA,IAAIpE,EAAWsF,EAAOhsC,OAClBmI,EAAQ,IAAItH,MAAa6lC,GACpB3rC,EAAI,EAAGA,EAAI2rC,IAAY3rC,EAC9BoN,EAAMpN,GAAK0mC,EAAYuK,EAAOjxC,IAEhC,IAAIkmC,EAAOS,EAAcv5B,GACzB,IACM2iC,EACFmB,2BAA2BnB,EAAMpwC,KAAKmuB,IAAKoY,EAAMyF,GAEjDwF,yBAAyBxxC,KAAKmuB,IAAKoY,EAAMyF,WAG3C5F,OAAO5S,KAAK+S,GACZ,IAASlmC,EAAI2rC,EAAU3rC,GAAK,IAAKA,EAAG+lC,OAAO5S,KAAK/lB,EAAMpN,MAO1DwlC,EAAA5jC,UAAAwvC,qBAAA,SAAqBpnC,GAEnB,IAAIqnC,EAAwBnB,4BACxBoB,EAAsBf,0BACtBgB,EAAoBC,wBACxBnB,0BAA0B,GAC1BI,wBAAwB,GACxBG,uBAAsB,GAGtB,IAAI3oC,EAAOwpC,2BAA2BznC,GAClC+lC,EAAOpwC,KAAKotC,qBAAqB9kC,EAAM,KAAM+B,GAC7CoD,EAAQzN,KAAKimC,sBACjB,IAAKx4B,EAAO,CACV,IAAI7M,EAAOmmC,EAAY,cACvB/mC,KAAKgmC,qBAAuBplC,EAC5BZ,KAAKimC,sBAAwBx4B,EAAQu5B,GAAgBpmC,IAUvD,OARA2wC,2BAA2BnB,EAAMpwC,KAAKmuB,IAAK1gB,EAAO,GAClDpD,EAAO0nC,yBAAyB3B,GAChCpwC,KAAKutC,0BAGLmD,0BAA0BgB,GAC1BZ,wBAAwBa,GACxBV,sBAAsBW,GACfvnC,GAGTw7B,EAAA5jC,UAAA+vC,SAAA,WACE,OAA4C,GAArCC,wBAAwBjyC,KAAKmuB,MAGtC0X,EAAA5jC,UAAAiwC,UAAA,WACEC,yBAAyBnyC,KAAKmuB,MAGhC0X,EAAA5jC,UAAAmwC,SAAA,SAASC,GACP,IAAI9K,EAAMvnC,KAAKmmC,cACXW,EAAOC,EAAYsL,GACnBC,EAAmB,EACnBC,EAAsB,EAC1B,IACEC,gCAAgCjL,EAAKvnC,KAAKmuB,IAAK2Y,GAC/CwL,EAAYG,EAAQlL,GACpB,IAAImL,EAAcD,EAAQlL,EAAM,GAChCgL,EAAeE,EAAQlL,EAAM,GAC7B,IAAIoL,EAAM,IAAIC,EAGd,OAFAD,EAAIE,OAmiBV,SAAoBzJ,EAAY9jC,GAE9B,IADA,IAAIqtC,EAAM,IAAIG,WAAWxtC,GAChBjF,EAAW,EAAGA,EAAIiF,IAAUjF,EACnCsyC,EAAItyC,GAAK0yC,KAAS3J,EAAM/oC,GAE1B,OAAOsyC,EAxiBUK,CAAWV,EAAWI,GACnCC,EAAIjiB,UAAYuiB,EAAWV,GACpBI,UAEH7L,GAAMV,OAAO5S,KAAKsT,GAClBwL,GAAWlM,OAAO5S,KAAK8e,GACvBC,GAAcnM,OAAO5S,KAAK+e,KAIlC1M,EAAA5jC,UAAAixC,OAAA,WACE,MAAM,IAAIxtB,MAAM,oBAGlBmgB,EAAA5jC,UAAAkxC,QAAA,WACE,MAAM,IAAIztB,MAAM,oBAGlBmgB,EAAA5jC,UAAAmxC,QAAA,WACE3vC,OAAOzD,KAAKmuB,KACZiY,OAAO5S,KAAKxzB,KAAKmmC,eACjBC,OAAO5S,KAAKxzB,KAAK8lC,qBACjBM,OAAO5S,KAAKxzB,KAAKgmC,sBACjBI,OAAO5S,KAAKxzB,KAAKimC,uBACjBoN,uBAAuBrzC,KAAKmuB,KAC5BnuB,KAAKmuB,IAAM,GAGb0X,EAAA5jC,UAAAqxC,eAAA,WACE,OAAOC,EAAS5xC,OAAO3B,OAGzB6lC,EAAA5jC,UAAAuxC,gBAAA,SACEnpC,EACAopC,EACAC,GAEA,QAHA,IAAAD,OAAA,QACA,IAAAC,MAAgBtyB,IAAI2Y,WAEhB2Z,EAAW,EAAG,OAAO,EAGzB,IAAIC,EACAC,EAEA,OALJF,GAAY,EAKAG,yBAAyBxpC,IACnC,KAAKirB,EAAa+C,MAChB,OAAQyZ,2BAA2BznC,IACjC,OACE,OAAOrK,KAAKsnC,UAAUwM,0BAA0BzpC,IAElD,OACE,OAAOrK,KAAK0nC,UACVqM,6BAA6B1pC,GAC7B2pC,8BAA8B3pC,IAGlC,OACE,OAAOrK,KAAK8nC,UAAUmM,0BAA0B5pC,IAElD,OACE,OAAOrK,KAAKgoC,UAAUkM,0BAA0B7pC,IAElD,QACE,MAAM,IAAIqb,MAAM,0BAItB,KAAK4P,EAAaC,SAChB,OAAOqT,kBAAkB5oC,KAAKmuB,IAC5BgmB,0BAA0B9pC,GAC1BynC,2BAA2BznC,IAG/B,KAAKirB,EAAaO,UAChB,IAAIpP,EAAa2tB,0BAA0B/pC,GAC3C,IAAKoc,EAAY,MACjB,OAAOuiB,mBAAmBhpC,KAAKmuB,IAAK1H,EAAYqrB,2BAA2BznC,IAE7E,KAAKirB,EAAa0E,KAChB,KAAM2Z,EAAU3zC,KAAKwzC,gBAAgBa,oBAAoBhqC,GAAOopC,EAAeC,IAC7E,MAEF,OACEY,sBAAsBjqC,GAClBo/B,oBAAoBzpC,KAAKmuB,IACvBomB,sBAAsBlqC,GACtBmqC,uBAAuBnqC,GACvBynC,2BAA2BznC,GAC3BspC,GAEFtK,cAAcrpC,KAAKmuB,IACjBomB,sBAAsBlqC,GACtBoqC,sBAAsBpqC,GAAQ,EAAI,EAClCmqC,uBAAuBnqC,GACvBqqC,sBAAsBrqC,GACtBynC,2BAA2BznC,GAC3BspC,GAIV,KAAKre,EAAa4D,MAChB,KAAMya,EAAU3zC,KAAKwzC,gBAAgBmB,uBAAuBtqC,GAAOopC,EAAeC,IAChF,MAEF,OAAOtL,eAAepoC,KAAKmuB,IAAKymB,oBAAoBvqC,GAAOspC,GAE7D,KAAKre,EAAaU,OAChB,KAAM2d,EAAU3zC,KAAKwzC,gBAAgBqB,uBAAuBxqC,GAAOopC,EAAeC,IAChF,MAEF,KAAME,EAAU5zC,KAAKwzC,gBAAgBsB,wBAAwBzqC,GAAOopC,EAAeC,IACjF,MAEF,OAAOpL,gBAAgBtoC,KAAKmuB,IAAK4mB,qBAAqB1qC,GAAOspC,EAASC,GAG1E,OAAO,GAKT/N,EAAA5jC,UAAA+yC,iBAAA,SAAiBp0C,GACf,IAAIkmC,EAAOC,EAAYnmC,GACvB,IACE,OAAOq0C,oCAAoCj1C,KAAKmuB,IAAK2Y,WAErDV,OAAO5S,KAAKsT,KAIhBjB,EAAA5jC,UAAAizC,iBAAA,SAAiB9nB,GACf,OAAO6lB,EAAWkC,oCAAoCn1C,KAAKmuB,IAAKf,KAGlEyY,EAAA5jC,UAAA2uB,iBAAA,SACEwf,EACA/lC,EACA+qC,EACAC,EACAC,GAEAC,kCAAkCnF,EAAM/lC,EAAM+qC,EAAWC,EAAYC,IA1SvDzP,EAAA2P,kBAAkC,EA4SpD3P,EAt3BA,GAAanmC,EAAAmmC,SA03BbnmC,EAAA21B,gBAAA,SAAgChrB,GAC9B,OAAOwpC,yBAAyBxpC,IAGlC3K,EAAAg6B,kBAAA,SAAkCrvB,GAChC,OAAOynC,2BAA2BznC,IAGpC3K,EAAA44B,iBAAA,SAAiCjuB,GAC/B,OAAOypC,0BAA0BzpC,IAGnC3K,EAAAi6B,oBAAA,SAAoCtvB,GAClC,OAAO0pC,6BAA6B1pC,IAGtC3K,EAAA+1C,qBAAA,SAAqCprC,GACnC,OAAO2pC,8BAA8B3pC,IAGvC3K,EAAAk6B,iBAAA,SAAiCvvB,GAC/B,OAAO4pC,0BAA0B5pC,IAGnC3K,EAAAm6B,iBAAA,SAAiCxvB,GAC/B,OAAO6pC,0BAA0B7pC,IAGnC3K,EAAA81B,iBAAA,SAAiCnrB,GAC/B,OAAO8pC,0BAA0B9pC,IAGnC3K,EAAAg2C,iBAAA,SAAiCrrC,GAC/B,OAAOsrC,0BAA0BtrC,IAGnC3K,EAAAk2B,iBAAA,SAAiCvrB,GAC/B,OAAOurC,0BAA0BvrC,IAGnC3K,EAAAi2B,WAAA,SAA2BtrB,GACzB,OAAOwrC,uBAAuBxrC,IAGhC3K,EAAAq2B,iBAAA,SAAiC1rB,GAC/B,OAAO4oC,EAAWmB,0BAA0B/pC,KAG9C3K,EAAAu2B,YAAA,SAA4B5rB,GAC1B,OAAO0qC,qBAAqB1qC,IAG9B3K,EAAA04B,cAAA,SAA8B/tB,GAC5B,OAAOwqC,uBAAuBxqC,IAGhC3K,EAAA64B,eAAA,SAA+BluB,GAC7B,OAAOyqC,wBAAwBzqC,IAGjC3K,EAAAy5B,WAAA,SAA2B9uB,GACzB,OAAOuqC,oBAAoBvqC,IAG7B3K,EAAAo2C,cAAA,SAA8BzrC,GAC5B,OAAOsqC,uBAAuBtqC,IAGhC3K,EAAAw6B,aAAA,SAA6B7vB,GAC3B,OAAOkqC,sBAAsBlqC,IAG/B3K,EAAAq2C,cAAA,SAA8B1rC,GAC5B,OAAOmqC,uBAAuBnqC,IAGhC3K,EAAAs2C,WAAA,SAA2B3rC,GACzB,OAAOgqC,oBAAoBhqC,IAG7B3K,EAAAy6B,aAAA,SAA6B9vB,GAC3B,OAAOoqC,sBAAsBpqC,IAG/B3K,EAAAu2C,cAAA,SAA8B5rC,GAC5B,OAAO6rC,uBAAuB7rC,IAGhC3K,EAAAy2C,eAAA,SAA+B9rC,GAC7B,OAAO+rC,wBAAwB/rC,IAGjC3K,EAAA22C,YAAA,SAA4BhsC,GAC1B,OAAOisC,qBAAqBjsC,IAG9B3K,EAAA62C,cAAA,SAA8BlsC,GAC5B,OAAOmsC,uBAAuBnsC,IAGhC3K,EAAA26B,aAAA,SAA6BhwB,GAC3B,OAAO4oC,EAAWwD,sBAAsBpsC,KAG1C3K,EAAA46B,mBAAA,SAAmCjwB,GACjC,OAAOqsC,6BAA6BrsC,IAGtC3K,EAAA86B,cAAA,SAA8BnwB,EAAqB+iB,GACjD,OAAOupB,uBAAuBtsC,EAAM+iB,IAGtC1tB,EAAAk3C,eAAA,SAA+BvsC,GAC7B,OAAOwsC,wBAAwBxsC,IAGjC3K,EAAAg7B,UAAA,SAA0BrwB,GACxB,OAAOysC,qBAAqBzsC,IAG9B3K,EAAAi7B,WAAA,SAA2BtwB,GACzB,OAAO0sC,sBAAsB1sC,IAG/B3K,EAAAs3C,YAAA,SAA4B3sC,GAC1B,OAAO4oC,EAAWgE,qBAAqB5sC,KAGzC3K,EAAAw3C,YAAA,SAA4B7sC,GAC1B,OAAO8sC,qBAAqB9sC,IAG9B3K,EAAA03C,aAAA,SAA6B/sC,GAC3B,OAAO4oC,EAAWoE,sBAAsBhtC,KAG1C3K,EAAA43C,kBAAA,SAAkCjtC,GAChC,OAAOktC,2BAA2BltC,IAGpC3K,EAAAm7B,cAAA,SAA8BxwB,GAC5B,OAAOmtC,yBAAyBntC,IAGlC3K,EAAAo7B,cAAA,SAA8BzwB,GAC5B,OAAOotC,0BAA0BptC,IAGnC3K,EAAAg4C,mBAAA,SAAmCrtC,GACjC,OAAOstC,4BAA4BttC,IAGrC3K,EAAAk4C,aAAA,SAA6BvtC,GAC3B,OAAOwtC,sBAAsBxtC,IAG/B3K,EAAAo4C,eAAA,SAA+BztC,GAC7B,OAAO0tC,wBAAwB1tC,IAGjC3K,EAAAs7B,cAAA,SAA8B3wB,GAC5B,OAAO4oC,EAAW+E,uBAAuB3tC,KAG3C3K,EAAAu4C,UAAA,SAA0B5tC,GACxB,OAAO6tC,mBAAmB7tC,IAG5B3K,EAAAy4C,oBAAA,SAAoC9tC,GAClC,OAAO+tC,4BAA4B/tC,IAGrC3K,EAAA24C,eAAA,SAA+BhuC,EAAqB+iB,GAClD,OAAOkrB,wBAAwBjuC,EAAM+iB,IAGvC1tB,EAAA64C,YAAA,SAA4BluC,GAC1B,OAAO4oC,EAAWuF,4BAA4BnuC,KAKhD3K,EAAA+4C,gBAAA,SAAgCrI,GAC9B,OAAO2B,yBAAyB3B,IAGlC1wC,EAAAg5C,gBAAA,SAAgCtI,GAC9B,OAAO6C,EAAW0F,yBAAyBvI,KAG7C1wC,EAAAk5C,sBAAA,SAAsCxI,GACpC,OAAOyI,8BAA8BzI,IAGvC1wC,EAAAo5C,qBAAA,SAAqC1I,EAAmBhjB,GACtD,OAAO2rB,0BAA0B3I,EAAMhjB,IAGzC1tB,EAAAs5C,sBAAA,SAAsC5I,GACpC,OAAO6I,2BAA2B7I,IAGpC,IAAAmD,EAAA,WAYE,SAAAA,KAoCF,OA3CSA,EAAA5xC,OAAP,SAAchC,GACZ,IAAIu5C,EAAW,IAAI3F,EAGnB,OAFA2F,EAASv5C,OAASA,EAClBu5C,EAAS/qB,IAAMgrB,gBAAgBx5C,EAAOwuB,KAC/B+qB,GAKT3F,EAAAtxC,UAAAm3C,SAAA,SAASl1C,GACP,OAAOm1C,kBAAkBr5C,KAAKmuB,IAAKjqB,IAGrCqvC,EAAAtxC,UAAAq3C,UAAA,SACEC,EACAC,EACAnrC,EACAnK,QADA,IAAAmK,MAAA,QACA,IAAAnK,MAAA,GAEAu1C,mBAAmBF,EAAMC,EAAInrC,EAAWnK,IAG1CqvC,EAAAtxC,UAAAy3C,mBAAA,SAAmBx1C,EAAqBmK,GACtC,OAAOsrC,4BAA4B35C,KAAKmuB,IAAKjqB,EAAMmK,IAGrDklC,EAAAtxC,UAAA23C,mBAAA,SACEL,EACAC,EACAK,EACA31C,QAAA,IAAAA,MAAA,GAEA,IAAIqiC,EAAOS,EAAc6S,GACzB,IACEC,4BAA4BP,EAAMC,EAAIjT,EAAMsT,EAAQv0C,OAAQpB,WAE5DkiC,OAAO5S,KAAK+S,KAIhBgN,EAAAtxC,UAAA83C,iBAAA,SAAiBC,EAAyBC,GACxC,OAAOC,0BAA0Bl6C,KAAKmuB,IAAK6rB,EAAOC,IAEtD1G,EAhDA,GA4FA,SAAS/M,EAAa2T,GACpB,IAAKA,EAAK,OAAO,EAIjB,IAHA,IAAIC,EAAYD,EAAI70C,OAChB8jC,EAAMhD,OAAOC,SAAS+T,GACtBC,EAAMjR,EACD/oC,EAAI,EAAGA,EAAI+5C,IAAa/5C,EAC/Bi6C,MAAUD,IAAOF,EAAI95C,IAEvB,OAAO+oC,EAGT,SAASpC,EAAcuT,GACrB,IAAKA,EAAM,OAAO,EAGlB,IAFA,IAAInR,EAAMhD,OAAOC,SAASkU,EAAKj1C,QAAU,GACrC+0C,EAAMjR,EACD/oC,EAAI,EAAGwK,EAAI0vC,EAAKj1C,OAAQjF,EAAIwK,IAAKxK,EAAG,CAC3C,IAAIm6C,EAAMD,EAAKl6C,GAEfi6C,MAAUD,EAAyB,IAAdG,GACrBF,MAAUD,EAAM,EAAKG,GAAS,EAAK,KACnCF,MAAUD,EAAM,EAAKG,GAAQ,GAAM,KACnCF,MAAUD,EAAM,EAAKG,IAAQ,IAC7BH,GAAO,EAET,OAAOjR,EAGT,SAASX,EAAcgS,GACrB,OAAOzT,EAAcyT,GA2BvB,SAAS1T,EAAY2T,GACnB,GAAW,MAAPA,EAAa,OAAO,EAIxB,IAHA,IAAItR,EAAMhD,OAAOC,SA1BnB,SAA0BqU,GAExB,IADA,IAAIr1C,EAAM,EACDhF,EAAI,EAAGwK,EAAI6vC,EAAIp1C,OAAQjF,EAAIwK,IAAKxK,EAAG,CAC1C,IAAIs6C,EAAID,EAAIh1C,WAAWrF,GACnBs6C,GAAK,OAAUA,GAAK,OAAUt6C,EAAI,EAAIwK,IACxC8vC,EAAI,QAAgB,KAAJA,IAAc,IAA6B,KAAtBD,EAAIh1C,aAAarF,IAEpDs6C,GAAK,MACLt1C,EAEFA,GADSs1C,GAAK,KACP,EACEA,GAAK,MACP,EACEA,GAAK,QACP,EACEA,GAAK,SACP,EAEA,EAGX,OAAOt1C,EAKmBu1C,CAAiBF,GAAO,GAE9CL,EAAMjR,EACD/oC,EAAI,EAAGwK,EAAI6vC,EAAIp1C,OAAQjF,EAAIwK,IAAKxK,EAAG,CAC1C,IAAIs6C,EAAID,EAAIh1C,WAAWrF,GACnBs6C,GAAK,OAAUA,GAAK,OAAUt6C,EAAI,EAAIwK,IACxC8vC,EAAI,QAAgB,KAAJA,IAAc,IAA6B,KAAtBD,EAAIh1C,aAAarF,IAEpDs6C,GAAK,IACPL,MAAUD,IAAOM,GACRA,GAAK,MACdL,MAAUD,IAAQ,IAASM,IAAM,GACjCL,MAAUD,IAAQ,IAAqB,GAAZM,IAClBA,GAAK,OACdL,MAAUD,IAAQ,IAASM,IAAM,IACjCL,MAAUD,IAAQ,IAASM,IAAO,EAAK,IACvCL,MAAUD,IAAQ,IAAqB,GAAZM,IAClBA,GAAK,SACdL,MAAUD,IAAQ,IAASM,IAAM,IACjCL,MAAUD,IAAQ,IAASM,IAAM,GAAM,IACvCL,MAAUD,IAAQ,IAASM,IAAO,EAAK,IACvCL,MAAUD,IAAQ,IAAqB,GAAZM,IAClBA,GAAK,UACdL,MAAUD,IAAQ,IAASM,IAAM,IACjCL,MAAUD,IAAQ,IAASM,IAAM,GAAM,IACvCL,MAAUD,IAAQ,IAASM,IAAM,GAAM,IACvCL,MAAUD,IAAQ,IAASM,IAAO,EAAK,IACvCL,MAAUD,IAAQ,IAAqB,GAAZM,KAE3BL,MAAUD,IAAQ,IAASM,IAAM,IACjCL,MAAUD,IAAQ,IAASM,IAAM,GAAM,IACvCL,MAAUD,IAAQ,IAASM,IAAM,GAAM,IACvCL,MAAUD,IAAQ,IAASM,IAAM,GAAM,IACvCL,MAAUD,IAAQ,IAASM,IAAO,EAAK,IACvCL,MAAUD,IAAQ,IAAqB,GAAZM,IAI/B,OADAL,MAAUD,EAAK,GACRjR,EAGT,SAASqJ,EAAQrJ,GACf,OACG2J,KAAS3J,GACT2J,KAAS3J,EAAM,IAAO,EACtB2J,KAAS3J,EAAM,IAAM,GACrB2J,KAAS3J,EAAM,IAAM,GAY1B,SAAgB6J,EAAW7J,GACzB,IAAKA,EAAK,OAAO,KAKjB,IAJA,IAEIyR,EACAC,EAASC,EAASC,EAASC,EAH3BC,EAAM,IAAI/0C,MAIP00C,EAAK9H,KAAS3J,MACR,IAALyR,GAINC,EAAuB,GAAlB/H,KAAS3J,KACK,MAAT,IAALyR,IAILE,EAAuB,GAAlBhI,KAAS3J,KACK,MAAT,IAALyR,GACHA,GAAY,GAALA,IAAY,GAAOC,GAAM,EAAKC,GAErCC,EAAuB,GAAlBjI,KAAS3J,KACK,MAAT,IAALyR,GACHA,GAAY,EAALA,IAAW,GAAOC,GAAM,GAAOC,GAAM,EAAKC,GAEjDC,EAAuB,GAAlBlI,KAAS3J,KAEZyR,EADiB,MAAT,IAALA,IACS,EAALA,IAAW,GAAOC,GAAM,GAAOC,GAAM,GAAOC,GAAM,EAAKC,GAGlD,EAALJ,IAAW,GAAOC,GAAM,GAAOC,GAAM,GAAOC,GAAM,GAAOC,GAAM,EAD/C,GAAlBlI,KAAS3J,OAKpB8R,EAAIr1C,KAAKg1C,IApBPK,EAAIr1C,MAAY,GAALg1C,IAAY,EAAKC,IAL5BI,EAAIr1C,KAAKg1C,GAmCb,OAAOM,OAAOC,eAAeF,GA1PlBx7C,EAAA6zC,WA+Mb7zC,EAAAuzC,aA+CA,IAAAL,EAAA,WAKA,OALA,gBAAalzC,EAAAkzC,eAQblzC,EAAA27C,yBAAA,SAAgBA,EAAyBhxC,GAEvC,OAAQynC,2BAA2BznC,IACjC,OACA,OACA,OACA,OAAqB,OAAO,EAE9B,OAAQwpC,yBAAyBxpC,IAC/B,KAAKirB,EAAa2F,YAClB,KAAK3F,EAAagmB,OAAQ,OAAO,EACjC,KAAKhmB,EAAaimB,MAAO,OAA2C,GAApChE,2BAA2BltC,GAC3D,KAAKirB,EAAa8E,MAChB,IAAKqc,sBAAsBpsC,GAAO,CAChC,IAAImxC,EAAc9E,6BAA6BrsC,GAC/C,OAAOmxC,EAAc,GAAKH,EAAyB1E,uBAAuBtsC,EAAMmxC,EAAc,KAIpG,OAAO,kFC1rDT,IAAAC,EAAAt7C,EAAA,IAcA,SAAkBu7C,GAKhBA,IAAA,WAEAA,IAAA,aAEAA,IAAA,aAEAA,IAAA,aAEAA,IAAA,iBAKAA,IAAA,WAEAA,IAAA,aAEAA,IAAA,aAEAA,IAAA,aAEAA,IAAA,iBAEAA,IAAA,gBAKAA,IAAA,cAEAA,IAAA,cAKAA,IAAA,gBAxCF,CAAkBh8C,EAAAg8C,WAAAh8C,EAAAg8C,cA4ClB,SAAkBC,GAChBA,IAAA,eAEAA,IAAA,mBAEAA,IAAA,uBAEAA,IAAA,qBAEAA,IAAA,iBAEAA,IAAA,sBAEAA,IAAA,kBAEAA,IAAA,gBAEAA,IAAA,mBAEAA,IAAA,2BAEAA,IAAA,yBArBF,CAAkBj8C,EAAAi8C,YAAAj8C,EAAAi8C,eAyBlB,IAAA16B,EAAA,WAoBE,SAAAA,EAAYla,EAAgBc,EAAkB+wB,GAHtC54B,KAAA47C,mBAAkC,KAIxC57C,KAAK+G,KAAOA,EACZ/G,KAAK6H,MAAQA,EACb7H,KAAK44B,KAAOA,EACZ54B,KAAKwmB,SAAgBq1B,KAAejjB,EAAO,GAC3C54B,KAAK87C,eAAiB,KACtB97C,KAAKumB,mBAAqB,KAC1BvmB,KAAK+7C,gBAAkB/7C,KAuW3B,OAnWEe,OAAAC,eAAIigB,EAAAhf,UAAA,eAAJ,WACE,OAAQjC,KAAK+G,MACX,OAAkB,OAAOka,EAAKC,GAC9B,OAAmB,OAAOD,EAAKE,IAC/B,QACA,OAAmB,OAAOF,EAAKG,IAC/B,QACA,OAAmB,OAAOH,EAAKI,IAC/B,OAAqB,OAAoB,IAAbrhB,KAAK44B,KAAa3X,EAAK+6B,QAAU/6B,EAAKg7B,QAClE,OAAkB,OAAOh7B,EAAKM,GAC9B,OAAmB,OAAON,EAAKO,IAC/B,OAAmB,OAAOP,EAAKQ,IAC/B,OAAmB,OAAOR,EAAKS,IAC/B,OAAqB,OAAoB,IAAb1hB,KAAK44B,KAAa3X,EAAKi7B,QAAUj7B,EAAKk7B,QAClE,QACA,QAAS,OAAOl7B,EAAKG,sCAKzBH,EAAAhf,UAAAm6C,UAAA,SAAU7vB,GACR,GAAIA,EAAQrM,MAAO,CACjB,IAAI47B,EAAiB97C,KAAK87C,eAC1B,OAA0B,OAAnBA,IAA4BA,EAAep0B,aAAa+zB,EAAAx8B,eAAezI,WAEhF,OAAO,GAITyK,EAAAhf,UAAAo6C,yBAAA,SAAyBC,GACvB,OAAOA,EAAW1jB,KAAO54B,KAAK44B,MAIhC3X,EAAAhf,UAAAw2B,wBAAA,SAAwB6jB,GACtB,IAAI1jB,EAAO54B,KAAK+H,GAAE,GAAuB/H,KAAK44B,KAAO54B,KAAK44B,KAAO,EACjE,OAAO,IAAQ0jB,EAAW1jB,KAAOA,GAInC3X,EAAAhf,UAAA8F,GAAA,SAAGF,GAA0B,OAAQ7H,KAAK6H,MAAQA,IAAUA,GAE5DoZ,EAAAhf,UAAAgG,MAAA,SAAMJ,GAA0B,OAA+B,IAAvB7H,KAAK6H,MAAQA,IAGrDoZ,EAAAhf,UAAA0vB,QAAA,SAAQ4qB,GACN94C,OAAgB,GAATzD,KAAK+G,OAA2B/G,KAAK87C,gBAC5C,IAAInJ,EAAM,IAAI1xB,EAAKjhB,KAAK+G,MAAmB,IAAb/G,KAAK6H,MAAwB,IAAwB7H,KAAK44B,MAExF,OADA+Z,EAAImJ,eAAiBS,EACd5J,GAIT1xB,EAAAhf,UAAAgvB,WAAA,SAAWhe,GACTxP,OAAgB,GAATzD,KAAK+G,OAAyB/G,KAAKumB,oBAC1C,IAAIosB,EAAM,IAAI1xB,EAAKjhB,KAAK+G,MAAmB,IAAb/G,KAAK6H,MAAwB,IAAwB7H,KAAK44B,MAExF,OADA+Z,EAAIpsB,mBAAqBtT,EAClB0/B,GAIT1xB,EAAAhf,UAAAu6C,WAAA,WASE,OARA/4C,OAAOzD,KAAK+H,GAAE,MACT/H,KAAK47C,qBACRn4C,QAAQzD,KAAK+H,GAAE,MACf/H,KAAK47C,mBAAqB,IAAI36B,EAAKjhB,KAAK+G,KAAgB,IAAV/G,KAAK6H,MAA4B7H,KAAK44B,MACpF54B,KAAK47C,mBAAmBG,gBAAkB/7C,KAC1CA,KAAK47C,mBAAmBE,eAAiB97C,KAAK87C,eAC9C97C,KAAK47C,mBAAmBr1B,mBAAqBvmB,KAAKumB,oBAE7CvmB,KAAK47C,oBAId36B,EAAAhf,UAAA8vB,eAAA,SAAeC,EAAcyqB,GAC3B,IAAIC,EACAC,EACA9pB,EACA+pB,EACJ,QAL2B,IAAAH,OAAA,GAKvBz8C,KAAK+H,GAAE,MACT,GAAIiqB,EAAOjqB,GAAE,QACN/H,KAAK+H,GAAE,MAAwBiqB,EAAOjqB,GAAE,MAC3C,GAAI20C,EAAe18C,KAAK87C,gBACtB,GAAIa,EAAc3qB,EAAO8pB,eACvB,OAAOY,EAAa3qB,eAAe4qB,QAEhC,IAAI9pB,EAAkB7yB,KAAKumB,sBAC5Bq2B,EAAiB5qB,EAAOzL,oBAC1B,OAAOsM,EAAgBd,eAAe6qB,QAKzC,IAAK5qB,EAAOjqB,GAAE,KACnB,GAAI/H,KAAK+H,GAAE,GACT,GAAIiqB,EAAOjqB,GAAE,IACX,IACG00C,GACDz8C,MAAQihB,EAAKW,MACb5hB,KAAK+H,GAAE,IAAsBiqB,EAAOjqB,GAAE,GAEtC,OAAO/H,KAAK44B,MAAQ5G,EAAO4G,SAExB,IAAe,IAAX5G,EAAOjrB,KAChB,OAAO/G,KAAK44B,MAAQ,GACf,GAAe,IAAX5G,EAAOjrB,KAChB,OAAO/G,KAAK44B,MAAQ,QAEjB,GAAI54B,KAAK+H,GAAE,IACZiqB,EAAOjqB,GAAE,GACX,OAAO/H,KAAK44B,MAAQ5G,EAAO4G,KAIjC,OAAO,GAIF3X,EAAA47B,iBAAP,SAAwBvxC,EAAYC,EAAauxC,GAC/C,OAAIvxC,EAAMwmB,eAAezmB,EAAMwxC,GAA+BxxC,EACrDA,EAAKymB,eAAexmB,EAAOuxC,GAA+BvxC,EAC5D,MAIT0V,EAAAhf,UAAA4C,SAAA,SAASk4C,GACP,QADO,IAAAA,OAAA,IACFA,GAAY/8C,KAAK+H,GAAE,KAAuB,CAC7C,IAAI+zC,EAAiB97C,KAAK87C,eAC1B,GAAIA,EACF,OAAO97C,KAAK+H,GAAE,KACV+zC,EAAej3C,WAAa,UAC5Bi3C,EAAej3C,WAErB,IAAI0hB,EAAqBvmB,KAAKumB,mBAC9B,GAAIA,EACF,OAAOvmB,KAAK+H,GAAE,KACV,IAAMwe,EAAmB1hB,UAAS,GAAQ,WAC1C0hB,EAAmB1hB,UAAS,GAElCpB,QAAO,GAET,OAAQzD,KAAK+G,MACX,OAAkB,MAAO,KACzB,OAAmB,MAAO,MAC1B,OAAmB,MAAO,MAC1B,OAAmB,MAAO,MAC1B,OAAqB,MAAO,QAC5B,OAAkB,MAAO,KACzB,OAAmB,MAAO,MAC1B,OAAmB,MAAO,MAC1B,OAAmB,MAAO,MAC1B,OAAqB,MAAO,QAC5B,QAAoB,MAAO,OAC3B,QAAmB,MAAO,MAC1B,QAAmB,MAAO,MAC1B,QAAStD,QAAO,GAChB,QAAoB,MAAO,SAO/Bwd,EAAAhf,UAAAguB,aAAA,WACE,OAAQjwB,KAAK+G,MACX,QAAS,SACT,OACA,OAAmB,SACnB,OACA,OAAqB,OAAoB,IAAb/G,KAAK44B,KAAY,EAAiB,EAC9D,QAAmB,SACnB,QAAmB,SACnB,QAAqB,WAKzB3X,EAAAhf,UAAA+6C,aAAA,SAAar9C,GACX,OAAQK,KAAK+G,MACX,QAAoBtD,QAAO,GAC3B,QAAS,OAAO9D,EAAO2nC,UAAU,GACjC,OACA,OAAqB,GAAiB,IAAbtnC,KAAK44B,KAAY,OAAOj5B,EAAO2nC,UAAU,GAClE,OACA,OAAmB,OAAO3nC,EAAO+nC,UAAU,GAC3C,QAAmB,OAAO/nC,EAAOmoC,UAAU,GAC3C,QAAmB,OAAOnoC,EAAOqoC,UAAU,KAK/C/mB,EAAAhf,UAAAg7C,YAAA,SAAYt9C,GACV,OAAQK,KAAK+G,MACX,QAAoBtD,QAAO,GAC3B,QAAS,OAAO9D,EAAO2nC,UAAU,GACjC,OACA,OAAqB,GAAiB,IAAbtnC,KAAK44B,KAAY,OAAOj5B,EAAO2nC,UAAU,GAClE,OACA,OAAmB,OAAO3nC,EAAO+nC,UAAU,GAC3C,QAAmB,OAAO/nC,EAAOmoC,UAAU,GAC3C,QAAmB,OAAOnoC,EAAOqoC,UAAU,KAK/C/mB,EAAAhf,UAAAi7C,eAAA,SAAev9C,GACb,OAAQK,KAAK+G,MACX,QAAoBtD,QAAO,GAC3B,QAAS,OAAO9D,EAAO2nC,WAAW,GAClC,OACA,OAAqB,GAAiB,IAAbtnC,KAAK44B,KAAY,OAAOj5B,EAAO2nC,WAAW,GACnE,OACA,OAAmB,OAAO3nC,EAAO+nC,WAAW,GAAI,GAChD,QAAmB,OAAO/nC,EAAOmoC,WAAW,GAC5C,QAAmB,OAAOnoC,EAAOqoC,WAAW,KAKhD/mB,EAAAhf,UAAA+uB,kBAAA,WACE,OAAQhxB,KAAK+G,MACX,QAAS,MAAO,IAChB,OACA,OAAmB,MAAO,IAC1B,OACA,OAAqB,OAAoB,IAAb/G,KAAK44B,KAAa,IAAM,IACpD,QAAmB,MAAO,IAC1B,QAAmB,MAAO,IAC1B,QAAoB,MAAO,MAOf3X,EAAAC,GAAY,IAAID,EAAI,EAClC,IAGmB,GAILA,EAAAE,IAAY,IAAIF,EAAI,EAClC,IAGkB,IAIJA,EAAAG,IAAY,IAAIH,EAAI,EAClC,IAEkB,IAIJA,EAAAI,IAAY,IAAIJ,EAAI,EAClC,IAGkB,IAIJA,EAAAg7B,QAAgB,IAAIh7B,EAAI,EACtC,IAGkB,IAIJA,EAAA+6B,QAAgB,IAAI/6B,EAAI,EACtC,IAIkB,IAIJA,EAAAM,GAAW,IAAIN,EAAI,EACjC,IAGmB,GAILA,EAAAO,IAAY,IAAIP,EAAI,EAClC,IAGkB,IAIJA,EAAAQ,IAAY,IAAIR,EAAI,EAClC,IAEkB,IAIJA,EAAAS,IAAY,IAAIT,EAAI,EAClC,IAGkB,IAIJA,EAAAk7B,QAAgB,IAAIl7B,EAAI,EACtC,IAGkB,IAIJA,EAAAi7B,QAAgB,IAAIj7B,EAAI,EACtC,IAIkB,IAIJA,EAAAW,KAAa,IAAIX,EAAI,GACnC,IAGmB,GAILA,EAAAY,IAAY,IAAIZ,EAAI,GAClC,IAEkB,IAIJA,EAAAa,IAAY,IAAIb,EAAI,GAClC,IAGkB,IAIJA,EAAAc,KAAa,IAAId,EAAI,KAAgC,GACvEA,EAlYA,GAAavhB,EAAAuhB,OAqYbvhB,EAAAy9C,mBAAA,SAAmCC,GAGjC,IAFA,IAAIC,EAAWD,EAAM93C,OACjBqtC,EAAM,IAAIxsC,MAAkBk3C,GACvBh9C,EAAI,EAAGA,EAAIg9C,IAAYh9C,EAAGsyC,EAAItyC,GAAK+8C,EAAM/8C,GAAG4vB,eACrD,OAAO0iB,GAITjzC,EAAA49C,cAAA,SAA8BF,GAC5B,IAAIC,EAAWD,EAAM93C,OACrB,IAAK+3C,EAAU,MAAO,GAEtB,IADA,IAAI13C,EAAK,IAAIQ,MAAck3C,GAClBh9C,EAAI,EAAGA,EAAIg9C,IAAYh9C,EAAGsF,EAAGtF,GAAK+8C,EAAM/8C,GAAGwE,WACpD,OAAOc,EAAGG,KAAK,MAIjB,IAAAy3C,EAAA,WAoBE,SAAAA,EACEj3B,EACAhd,EACA2lB,QAFA,IAAA3I,MAAA,WACA,IAAAhd,MAAA,WACA,IAAA2lB,MAAA,MARFjvB,KAAAw9C,qBAA8C,KAU5Cx9C,KAAKsmB,eAAiBA,MACtBtmB,KAAKy9C,eAAiB,KACtBz9C,KAAK09C,mBAAqB,EAC1B19C,KAAKsJ,WAAaA,GAA0B2X,EAAKc,KACjD/hB,KAAKivB,SAAWA,EAChBjvB,KAAK29C,SAAU,EACf39C,KAAKsI,KAAO2Y,EAAKQ,IAAIwP,WAAWjxB,MA8FpC,OA1FEu9C,EAAAt7C,UAAAytB,iBAAA,SAAiBtC,GACf,IAAIqwB,EAAiBz9C,KAAKy9C,eAC1B,OAAOA,GAAkBA,EAAen4C,OAAS8nB,EAC7CqwB,EAAerwB,GACfwwB,EAAwBxwB,IAI9BmwB,EAAAt7C,UAAA8vB,eAAA,SAAeC,GAIb,IAAI6rB,EAAe79C,KAAKivB,SACpB6uB,EAAiB9rB,EAAO/C,SAC5B,GAAI4uB,GACF,IAAMC,IAAkBD,EAAa9rB,eAAe+rB,GAAkB,OAAO,OACxE,GAAIA,EACT,OAAO,EAIT,GAAI99C,KAAK29C,SAAW3rB,EAAO2rB,QAAS,OAAO,EAG3C,IAAII,EAAqB/9C,KAAKsmB,eAC1B03B,EAAuBhsB,EAAO1L,eAC9B23B,EAAgBF,EAAmBz4C,OACvC,GAAI24C,GAAiBD,EAAqB14C,OAAQ,OAAO,EACzD,IAAK,IAAIjF,EAAI,EAAGA,EAAI49C,IAAiB59C,EAAG,CACtC,IAAI69C,EAAoBH,EAAmB19C,GACvC89C,EAAsBH,EAAqB39C,GAC/C,IAAK69C,EAAkBnsB,eAAeosB,GAAsB,OAAO,EAIrE,IAAIC,EAAiBp+C,KAAKsJ,WACtB+0C,EAAmBrsB,EAAO1oB,WAC9B,OAAO80C,GAAkBC,GAAoBD,EAAersB,eAAessB,IAItEd,EAAAe,oBAAP,SAA2Bh4B,EAA+Bhd,EAAkB2lB,QAAA,IAAAA,MAAA,MAC1E,IAAItpB,KAEJ,GADIspB,GAAUtpB,EAAGE,KAAKopB,EAAS+B,qBAC3B1K,EACF,IAAK,IAAIjmB,EAAI,EAAGwK,EAAIyb,EAAehhB,OAAQjF,EAAIwK,IAAKxK,EAAGsF,EAAGE,KAAKygB,EAAejmB,GAAG2wB,qBAGnF,OADArrB,EAAGE,KAAKyD,EAAW0nB,qBACZrrB,EAAGG,KAAK,KAIjBy3C,EAAAt7C,UAAA+uB,kBAAA,WACE,OAAOusB,EAAUe,oBAAoBt+C,KAAKsmB,eAAgBtmB,KAAKsJ,WAAYtJ,KAAKivB,WAIlFsuB,EAAAt7C,UAAA4C,SAAA,SAAS05C,QAAA,IAAAA,OAAA,GACP,IAAI54C,EAAK,IAAIQ,MACbR,EAAGE,KAAK,KACR,IAAIunB,EAAQ,EACR6B,EAAWjvB,KAAKivB,SAChBA,GACEsvB,IACF54C,EAAGE,KAAK,UACRF,EAAGE,KAAKopB,EAASpqB,YACjBuoB,EAAQ,GAGZ,IAAI/jB,EAAarJ,KAAKsmB,eAClB23B,EAAgB50C,EAAW/D,OAC/B,GAAI24C,EAKF,IAJA,IAAIxwC,EAAQzN,KAAKy9C,eACbzR,EAAWv+B,EAAQA,EAAMnI,OAAS,EAClCk5C,EAAgBx+C,KAAK09C,mBACrBe,EAAYz+C,KAAK29C,QAAUM,EAAgB,GAAK,EAC3C59C,EAAI,EAAGA,EAAI49C,IAAiB59C,IAAK+sB,EACpCA,GAAOznB,EAAGE,KAAK,MACfxF,GAAKo+C,GAAW94C,EAAGE,KAAK,OACxBxF,EAAI2rC,EAAUrmC,EAAGE,KAAgB4H,EAAOpN,IACvCsF,EAAGE,KAAK+3C,EAAwBv9C,IACjCA,GAAKm+C,GAAiBn+C,GAAKo+C,EAAW94C,EAAGE,KAAK,OAC7CF,EAAGE,KAAK,MACbF,EAAGE,KAAKwD,EAAWhJ,GAAGwE,YAK1B,OAFAc,EAAGE,KAAK,SACRF,EAAGE,KAAK7F,KAAKsJ,WAAWzE,YACjBc,EAAGG,KAAK,KAEnBy3C,EA7HA,GAAa79C,EAAA69C,YAkIb,IAAImB,EAA+C,KAGnD,SAAgBd,EAAwBxwB,GACjCsxB,IAA6BA,MAClC,IAAK,IAAIr+C,EAAIq+C,EAA4Bp5C,OAAQjF,GAAK+sB,IAAS/sB,EAC7Dq+C,EAA4B74C,KAAK,OAASxF,EAAEwE,SAAS,KAEvD,OAAO65C,EAA4BtxB,EAAQ,GAL7C1tB,EAAAk+C,yCCnnBA,IAAAe,EAGAA,EAAA,WACA,OAAA3+C,KADA,GAIA,IAEA2+C,KAAA9wB,SAAA,cAAAA,KAAA,EAAA+wB,MAAA,QACC,MAAAC,GAED,iBAAAC,SAAAH,EAAAG,QAOAn/C,EAAAD,QAAAi/C,sbCVA,IAuBYh4C,EAwIAo4C,EA/JZxiC,EAAApc,EAAA,GAMAsc,EAAAtc,EAAA,GAKA+C,EAAA/C,EAAA,GA0JA,SAAgB6+C,EAAiB55C,GAE/B,OADA3B,OAAO2B,EAAKE,QACJF,EAAKM,WAAW,IACtB,QACE,OAAQN,GACN,IAAK,WAAY,OAAOuB,EAAMuiB,SAC9B,IAAK,KAAM,OAAOviB,EAAMs4C,GACxB,IAAK,QAAS,OAAOt4C,EAAMu4C,MAC3B,IAAK,QAAS,OAAOv4C,EAAMw4C,MAE7B,MAEF,QACE,OAAQ/5C,GACN,IAAK,QAAS,OAAOuB,EAAM8T,MAE7B,MAEF,QACE,OAAQrV,GACN,IAAK,OAAQ,OAAOuB,EAAMy4C,KAC1B,IAAK,QAAS,OAAOz4C,EAAM04C,MAC3B,IAAK,QAAS,OAAO14C,EAAM8Q,MAC3B,IAAK,WAAY,OAAO9Q,EAAM+T,SAC9B,IAAK,QAAS,OAAO/T,EAAM0lB,MAC3B,IAAK,cAAe,OAAO1lB,EAAMgR,YAEnC,MAEF,SACE,OAAQvS,GACN,IAAK,WAAY,OAAOuB,EAAM24C,SAC9B,IAAK,UAAW,OAAO34C,EAAM44C,QAC7B,IAAK,UAAW,OAAO54C,EAAM64C,QAC7B,IAAK,SAAU,OAAO74C,EAAM84C,OAC5B,IAAK,KAAM,OAAO94C,EAAMgU,GAE1B,MAEF,SACE,OAAQvV,GACN,IAAK,OAAQ,OAAOuB,EAAM+4C,KAC1B,IAAK,OAAQ,OAAO/4C,EAAM8lB,KAC1B,IAAK,SAAU,OAAO9lB,EAAMsT,OAC5B,IAAK,UAAW,OAAOtT,EAAMg5C,QAE/B,MAEF,SACE,OAAQv6C,GACN,IAAK,QAAS,OAAOuB,EAAMQ,MAC3B,IAAK,UAAW,OAAOR,EAAMi5C,QAC7B,IAAK,MAAO,OAAOj5C,EAAMyU,IACzB,IAAK,OAAQ,OAAOzU,EAAMk5C,KAC1B,IAAK,WAAY,OAAOl5C,EAAMkR,SAEhC,MAEF,SACE,OAAQzS,GACN,IAAK,MAAO,OAAOuB,EAAM8hB,IAE3B,MAEF,SACE,OAAQrjB,GACN,IAAK,KAAM,OAAOuB,EAAM0U,GACxB,IAAK,aAAc,OAAO1U,EAAMm5C,WAChC,IAAK,SAAU,OAAOn5C,EAAM4U,OAC5B,IAAK,KAAM,OAAO5U,EAAMo5C,GACxB,IAAK,aAAc,OAAOp5C,EAAMmR,WAChC,IAAK,YAAa,OAAOnR,EAAM+rB,UAC/B,IAAK,KAAM,OAAO/rB,EAAMq5C,GAE1B,MAEF,SACE,OAAQ56C,GACN,IAAK,QAAS,OAAOuB,EAAMs5C,MAE7B,MAEF,SACE,OAAQ76C,GACN,IAAK,MAAO,OAAOuB,EAAMu5C,IAE3B,MAEF,SACE,OAAQ96C,GACN,IAAK,SAAU,OAAOuB,EAAMw5C,OAE9B,MAEF,SACE,OAAQ/6C,GACN,IAAK,YAAa,OAAOuB,EAAM6lB,UAC/B,IAAK,MAAO,OAAO7lB,EAAMqR,IACzB,IAAK,OAAQ,OAAOrR,EAAMM,KAE5B,MAEF,SACE,OAAQ7B,GACN,IAAK,KAAM,OAAOuB,EAAMy5C,GAE1B,MAEF,SACE,OAAQh7C,GACN,IAAK,UAAW,OAAOuB,EAAM05C,QAC7B,IAAK,UAAW,OAAO15C,EAAM25C,QAC7B,IAAK,YAAa,OAAO35C,EAAM45C,UAC/B,IAAK,SAAU,OAAO55C,EAAM65C,OAE9B,MAEF,SACE,OAAQp7C,GACN,IAAK,WAAY,OAAOuB,EAAMsiB,SAC9B,IAAK,SAAU,OAAOtiB,EAAM8U,OAE9B,MAEF,SACE,OAAQrW,GACN,IAAK,MAAO,OAAOuB,EAAM+hB,IACzB,IAAK,SAAU,OAAO/hB,EAAMyT,OAC5B,IAAK,QAAS,OAAOzT,EAAM0R,MAC3B,IAAK,SAAU,OAAO1R,EAAMgV,OAE9B,MAEF,SACE,OAAQvW,GACN,IAAK,OAAQ,OAAOuB,EAAM2R,KAC1B,IAAK,QAAS,OAAO3R,EAAMiV,MAC3B,IAAK,OAAQ,OAAOjV,EAAMO,KAC1B,IAAK,MAAO,OAAOP,EAAMkV,IACzB,IAAK,OAAQ,OAAOlV,EAAM+O,KAC1B,IAAK,SAAU,OAAO/O,EAAM85C,OAE9B,MAEF,SACE,OAAQr7C,GACN,IAAK,MAAO,OAAOuB,EAAM+5C,IACzB,IAAK,OAAQ,OAAO/5C,EAAMqV,KAE5B,MAEF,SACE,OAAQ5W,GACN,IAAK,QAAS,OAAOuB,EAAMsV,MAC3B,IAAK,OAAQ,OAAOtV,EAAMg6C,KAE5B,MAEF,SACE,OAAQv7C,GACN,IAAK,QAAS,OAAOuB,EAAMi6C,OAKjC,OAAOj6C,EAAMoY,QAGf,SAAgB8hC,EAAsBC,GACpC,OAAQA,GACN,KAAKn6C,EAAMuiB,SACX,KAAKviB,EAAMs4C,GACX,KAAKt4C,EAAMgR,YACX,KAAKhR,EAAM44C,QACX,KAAK54C,EAAM84C,OACX,KAAK94C,EAAMk5C,KACX,KAAKl5C,EAAMyU,IACX,KAAKzU,EAAM8hB,IACX,KAAK9hB,EAAMq5C,GACX,KAAKr5C,EAAMs5C,MACX,KAAKt5C,EAAMw5C,OACX,KAAKx5C,EAAM6lB,UACX,KAAK7lB,EAAMsiB,SACX,KAAKtiB,EAAM+hB,IACX,KAAK/hB,EAAM+O,KACX,KAAK/O,EAAMqV,KAAM,OAAO,EACxB,QAAS,OAAO,IAxUpB,SAAYrV,GAKVA,IAAA,uBACAA,IAAA,WACAA,IAAA,iBACAA,IAAA,iBACAA,IAAA,iBACAA,IAAA,eACAA,IAAA,iBACAA,IAAA,iBACAA,IAAA,iBACAA,IAAA,uBACAA,IAAA,8BACAA,IAAA,wBACAA,IAAA,sBACAA,IAAA,sBACAA,IAAA,oBACAA,IAAA,YACAA,IAAA,gBACAA,IAAA,gBACAA,IAAA,oBACAA,IAAA,sBACAA,IAAA,kBACAA,IAAA,sBACAA,IAAA,cACAA,IAAA,gBACAA,IAAA,wBACAA,IAAA,cACAA,IAAA,YACAA,IAAA,4BACAA,IAAA,oBACAA,IAAA,YACAA,IAAA,4BACAA,IAAA,0BACAA,IAAA,YACAA,IAAA,kBACAA,IAAA,cACAA,IAAA,oBACAA,IAAA,0BACAA,IAAA,cACAA,IAAA,gBACAA,IAAA,YACAA,IAAA,sBACAA,IAAA,sBACAA,IAAA,0BACAA,IAAA,oBACAA,IAAA,wBACAA,IAAA,oBACAA,IAAA,cACAA,IAAA,oBACAA,IAAA,kBACAA,IAAA,oBACAA,IAAA,gBACAA,IAAA,kBACAA,IAAA,gBACAA,IAAA,cACAA,IAAA,gBACAA,IAAA,oBACAA,IAAA,cACAA,IAAA,gBACAA,IAAA,kBACAA,IAAA,gBACAA,IAAA,kBAIAA,IAAA,0BACAA,IAAA,4BACAA,IAAA,0BACAA,IAAA,4BACAA,IAAA,8BACAA,IAAA,gCACAA,IAAA,cACAA,IAAA,8BACAA,IAAA,0BACAA,IAAA,kBACAA,IAAA,wBACAA,IAAA,8BACAA,IAAA,sCACAA,IAAA,4CACAA,IAAA,kCACAA,IAAA,4CACAA,IAAA,gDACAA,IAAA,0DACAA,IAAA,4CACAA,IAAA,gBACAA,IAAA,kBACAA,IAAA,0CACAA,IAAA,wBACAA,IAAA,kBACAA,IAAA,sBACAA,IAAA,0BACAA,IAAA,8BACAA,IAAA,0CACAA,IAAA,sDACAA,IAAA,8EACAA,IAAA,0BACAA,IAAA,cACAA,IAAA,kBACAA,IAAA,8BACAA,IAAA,kBACAA,IAAA,8CACAA,IAAA,sBACAA,IAAA,wBACAA,IAAA,kBACAA,IAAA,qBACAA,IAAA,+BACAA,IAAA,iCACAA,IAAA,uCACAA,IAAA,yDACAA,IAAA,iCACAA,IAAA,qCACAA,IAAA,yDACAA,IAAA,qEACAA,IAAA,6FACAA,IAAA,yCACAA,IAAA,6BACAA,IAAA,iCACAA,IAAA,aAIAA,IAAA,6BACAA,IAAA,mCACAA,IAAA,qCACAA,IAAA,iCAIAA,IAAA,uBACAA,IAAA,2BArIF,CAAYA,EAAAjH,EAAAiH,QAAAjH,EAAAiH,WAwIZ,SAAYo4C,GACVA,IAAA,qBACAA,IAAA,mBACAA,IAAA,mBAHF,CAAYA,EAAAr/C,EAAAq/C,qBAAAr/C,EAAAq/C,wBAMZr/C,EAAAs/C,mBAwKAt/C,EAAAmhD,wBAsBAnhD,EAAAqhD,sBAAA,SAAsCD,GACpC,OAAQA,GACN,KAAKn6C,EAAM84C,OAAQ,MAAO,SAC1B,KAAK94C,EAAMo5C,GAAI,MAAO,KACtB,KAAKp5C,EAAMmR,WAAY,MAAO,aAC9B,KAAKnR,EAAMqR,IAAK,MAAO,MACvB,KAAKrR,EAAM85C,OAAQ,MAAO,SAC1B,KAAK95C,EAAMqV,KAAM,MAAO,OACxB,KAAKrV,EAAMi6C,MAAO,MAAO,QACzB,KAAKj6C,EAAMq6C,YAAa,MAAO,MAC/B,KAAKr6C,EAAM+Q,MAAO,MAAO,IACzB,KAAK/Q,EAAMs6C,SAAU,MAAO,IAC5B,KAAKt6C,EAAMu6C,YAAa,MAAO,IAC/B,KAAKv6C,EAAMw6C,gBAAiB,MAAO,KACnC,KAAKx6C,EAAMy6C,mBAAoB,MAAO,KACtC,KAAKz6C,EAAM06C,cAAe,MAAO,KACjC,KAAK16C,EAAM26C,mBAAoB,MAAO,KACtC,KAAK36C,EAAM46C,qBAAsB,MAAO,MACxC,KAAK56C,EAAM66C,0BAA2B,MAAO,MAC7C,KAAK76C,EAAM4X,KAAM,MAAO,IACxB,KAAK5X,EAAM8X,MAAO,MAAO,IACzB,KAAK9X,EAAM86C,kBAAmB,MAAO,KACrC,KAAK96C,EAAM+6C,SAAU,MAAO,IAC5B,KAAK/6C,EAAMg7C,MAAO,MAAO,IACzB,KAAKh7C,EAAMi7C,QAAS,MAAO,IAC3B,KAAKj7C,EAAMk7C,UAAW,MAAO,KAC7B,KAAKl7C,EAAMm7C,YAAa,MAAO,KAC/B,KAAKn7C,EAAMo7C,kBAAmB,MAAO,KACrC,KAAKp7C,EAAMq7C,wBAAyB,MAAO,KAC3C,KAAKr7C,EAAMs7C,oCAAqC,MAAO,MACvD,KAAKt7C,EAAMu7C,UAAW,MAAO,IAC7B,KAAKv7C,EAAMw7C,IAAK,MAAO,IACvB,KAAKx7C,EAAMy7C,MAAO,MAAO,IACzB,KAAKz7C,EAAM07C,YAAa,MAAO,IAC/B,KAAK17C,EAAM27C,MAAO,MAAO,IACzB,KAAK37C,EAAM47C,oBAAqB,MAAO,KACvC,KAAK57C,EAAM67C,QAAS,MAAO,KAC3B,KAAK77C,EAAM87C,OAAQ,MAAO,IAC1B,KAAK97C,EAAM+7C,YAAa,MAAO,KAC/B,KAAK/7C,EAAMg8C,aAAc,MAAO,KAChC,KAAKh8C,EAAMi8C,gBAAiB,MAAO,KACnC,KAAKj8C,EAAMk8C,yBAA0B,MAAO,MAC5C,KAAKl8C,EAAMm8C,aAAc,MAAO,KAChC,KAAKn8C,EAAMo8C,eAAgB,MAAO,KAClC,KAAKp8C,EAAMq8C,yBAA0B,MAAO,MAC5C,KAAKr8C,EAAMs8C,+BAAgC,MAAO,MAClD,KAAKt8C,EAAMu8C,2CAA4C,MAAO,OAC9D,KAAKv8C,EAAMw8C,iBAAkB,MAAO,KACpC,KAAKx8C,EAAMy8C,WAAY,MAAO,KAC9B,KAAKz8C,EAAM08C,aAAc,MAAO,KAChC,QAEE,OADA5/C,QAAO,GACA,KAKb,IAAAmD,EAAA,WAUE,SAAAA,EAAY9B,EAAgBS,EAAYC,GA4CxCxF,KAAA6wB,aAAsB,EA3CpB7wB,KAAK8E,OAASA,EACd9E,KAAKuF,MAAQA,EACbvF,KAAKwF,IAAMA,EA0Cf,OAvCSoB,EAAAd,KAAP,SAAYw9C,EAAUC,GACpB,GAAID,EAAEx+C,QAAUy+C,EAAEz+C,OAAQ,MAAM,IAAI4gB,MAAM,mBAC1C,OAAO,IAAI9e,EAAM08C,EAAEx+C,OACjBw+C,EAAE/9C,MAAQg+C,EAAEh+C,MAAQ+9C,EAAE/9C,MAAQg+C,EAAEh+C,MAChC+9C,EAAE99C,IAAM+9C,EAAE/9C,IAAM89C,EAAE99C,IAAM+9C,EAAE/9C,MAI9BzE,OAAAC,eAAI4F,EAAA3E,UAAA,eAAJ,WACE,OAAO,IAAI2E,EAAM5G,KAAK8E,OAAQ9E,KAAKuF,MAAOvF,KAAKuF,wCAEjDxE,OAAAC,eAAI4F,EAAA3E,UAAA,aAAJ,WACE,OAAO,IAAI2E,EAAM5G,KAAK8E,OAAQ9E,KAAKwF,IAAKxF,KAAKwF,sCAG/CzE,OAAAC,eAAI4F,EAAA3E,UAAA,YAAJ,WAGE,IAFA,IAAImD,EAAOpF,KAAK8E,OAAOM,KACnBJ,EAAO,EACFsU,EAAMtZ,KAAKuF,MAAO+T,GAAO,IAAKA,EACb,IAApBlU,EAAKM,WAAW4T,IAA2BtU,IAEjD,OAAOA,mCAGTjE,OAAAC,eAAI4F,EAAA3E,UAAA,cAAJ,WAGE,IAFA,IAAImD,EAAOpF,KAAK8E,OAAOM,KACnBH,EAAS,EACJqU,EAAMtZ,KAAKuF,MAAQ,EAAG+T,GAAO,GACZ,IAApBlU,EAAKM,WAAW4T,KADqBA,IAEvCrU,EAEJ,OAAOA,mCAGT2B,EAAA3E,UAAA4C,SAAA,WACE,OAAO7E,KAAK8E,OAAOM,KAAKQ,UAAU5F,KAAKuF,MAAOvF,KAAKwF,MAIvDoB,EAvDA,GAAalH,EAAAkH,QA+Db,IAAA48C,EAAA,SAAAluC,GAgBE,SAAAkuC,EAAY1+C,EAAgBoB,QAAA,IAAAA,MAAA,MAA5B,IAAAsP,EACEF,EAAA9U,KAAAR,KAAMkG,IAAYlG,KAdpBwV,EAAAhQ,IAAW,EAEXgQ,EAAA8D,IAAW,EACX9D,EAAAsrC,OAAgB,EAChBtrC,EAAAiuC,SAAgB,EAEhBjuC,EAAAkuC,WAAoB,EACpBluC,EAAAmuC,aAAoB,EACpBnuC,EAAAouC,oBAA2B,EAE3BpuC,EAAAquC,UAAmC,KAKjCruC,EAAK1Q,OAASA,EACd0Q,EAAK8D,IAAM,EACX9D,EAAKhQ,IAAMV,EAAOM,KAAKE,OACvBkQ,EAAKtP,YAAcA,GAA4B,IAAIC,MAEnD,IAAIf,EAAON,EAAOM,KAWlB,GAPEoQ,EAAK8D,IAAM9D,EAAKhQ,KACS,OAAzBJ,EAAKM,WAAW8P,EAAK8D,QAEnB9D,EAAK8D,IAKP9D,EAAK8D,IAAM,EAAI9D,EAAKhQ,KACK,IAAzBJ,EAAKM,WAAW8P,EAAK8D,MACQ,IAA7BlU,EAAKM,WAAW8P,EAAK8D,IAAM,GAG3B,IADA9D,EAAK8D,KAAO,EAEV9D,EAAK8D,IAAM9D,EAAKhQ,KACS,IAAzBJ,EAAKM,WAAW8P,EAAK8D,QAEnB9D,EAAK8D,aA6hCf,OAzkC+B/D,EAAAiuC,EAAAluC,GAkD7BkuC,EAAAvhD,UAAAmiB,KAAA,SAAK0/B,GAEH,YAFG,IAAAA,MAAyC/E,EAAmBS,SAC/Dx/C,KAAK0jD,WAAa,EACX1jD,KAAK8gD,MAAQ9gD,KAAK+jD,WAAWD,IAG9BN,EAAAvhD,UAAA8hD,WAAR,SACED,EACAE,QADA,IAAAF,MAAyC/E,EAAmBS,cAC5D,IAAAwE,MAAsB5iC,IAAI2Y,WAG1B,IADA,IAAI30B,EAAOpF,KAAK8E,OAAOM,KAChBpF,KAAKsZ,IAAMtZ,KAAKwF,KAAK,CAC1BxF,KAAKyjD,SAAWzjD,KAAKsZ,IACrB,IAAI5Y,EAAI0E,EAAKM,WAAW1F,KAAKsZ,KAC7B,OAAQ5Y,GACN,QACE,OACIV,KAAKsZ,IAAMtZ,KAAKwF,KACO,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,MACpB,MAGL,QACA,OACA,QACA,QACA,UACItZ,KAAKsZ,IACP,MAEF,QAEE,QADEtZ,KAAKsZ,IAEL0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,KACb,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IAEL0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,KACb,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACA3S,EAAM66C,2BAER76C,EAAM26C,oBAER36C,EAAM07C,YAEf,QACA,QACA,QACE,OAAO17C,EAAMs9C,cAEf,QAEE,QADEjkD,KAAKsZ,IAEL0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,KACb,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACA3S,EAAMo8C,gBAERp8C,EAAMi7C,QAEf,QAEE,KADE5hD,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAM47C,oBAEf,GAA6B,IAAzBn9C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMw8C,iBAGjB,OAAOx8C,EAAMu7C,UAEf,QAEE,QADEliD,KAAKsZ,IACA3S,EAAMu9C,UAEf,QAEE,QADElkD,KAAKsZ,IACA3S,EAAMw9C,WAEf,QAEE,KADEnkD,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMi8C,gBAEf,GAA6B,IAAzBx9C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IAEL0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,KACb,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACA3S,EAAMk8C,0BAERl8C,EAAM86C,kBAGjB,OAAO96C,EAAM+6C,SAEf,QAEE,KADE1hD,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMk7C,UAEf,GAA6B,IAAzBz8C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAM+7C,YAGjB,OAAO/7C,EAAM4X,KAEf,QAEE,QADEve,KAAKsZ,IACA3S,EAAM+Q,MAEf,QAEE,KADE1X,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMm7C,YAEf,GAA6B,IAAzB18C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMg8C,aAGjB,OAAOh8C,EAAM8X,MAEf,QAEE,KADEze,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAAItC,EAAAkhD,eAAeh/C,EAAKM,WAAW1F,KAAKsZ,MAEtC,QADEtZ,KAAKsZ,IACA3S,EAAM09C,aAEf,GACEL,EAAiB,GAAKhkD,KAAKsZ,IAAM,EAAItZ,KAAKwF,KACjB,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,MACQ,IAA7BlU,EAAKM,WAAW1F,KAAKsZ,IAAM,GAG3B,OADAtZ,KAAKsZ,KAAO,EACL3S,EAAMq6C,YAGjB,OAAOr6C,EAAM29C,IAEf,QACE,IAAIC,EAAkBvkD,KAAKsZ,IAE3B,KADEtZ,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAAwB,CAC/C,IAAIlP,EAAcqS,EAAA1F,YAAYytC,KAQ9B,IANExkD,KAAKsZ,IAAM,EAAItZ,KAAKwF,KACS,IAA7BJ,EAAKM,WAAW1F,KAAKsZ,IAAM,OAEzBtZ,KAAKsZ,IACPlP,EAAcqS,EAAA1F,YAAY0tC,UAEnBzkD,KAAKsZ,IAAMtZ,KAAKwF,KACvB,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAA2B,GAChDtZ,KAAKsZ,IACP,MAGAtZ,KAAK6jD,WACP7jD,KAAK6jD,UACHz5C,EACAhF,EAAKQ,UAAU2+C,EAAiBvkD,KAAKsZ,KACrCtZ,KAAKoE,MAAMmgD,EAAiBvkD,KAAKsZ,MAGrC,MAEF,GAA6B,IAAzBlU,EAAKM,WAAW1F,KAAKsZ,KAA2B,CAElD,IADA,IAAIorC,GAAS,IACJ1kD,KAAKsZ,IAAMtZ,KAAKwF,KAEvB,GACG,KAFH9E,EAAI0E,EAAKM,WAAW1F,KAAKsZ,OAGvBtZ,KAAKsZ,IAAM,EAAItZ,KAAKwF,KACS,IAA7BJ,EAAKM,WAAW1F,KAAKsZ,IAAM,GAC3B,CACAtZ,KAAKsZ,KAAO,EACZorC,GAAS,EACT,MAGCA,EAKM1kD,KAAK6jD,WACd7jD,KAAK6jD,UACHpnC,EAAA1F,YAAY4B,MACZvT,EAAKQ,UAAU2+C,EAAiBvkD,KAAKsZ,KACrCtZ,KAAKoE,MAAMmgD,EAAiBvkD,KAAKsZ,MARnCtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACf3kD,KAAKoE,MAAMpE,KAAKsZ,KAAM,MAS1B,MAEF,GAA6B,IAAzBlU,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMm8C,aAGjB,OAAOn8C,EAAMg7C,MAEf,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACE,OAAO3hD,KAAK4kD,cACRj+C,EAAMk+C,eACNl+C,EAAM09C,aAEZ,QAEE,QADErkD,KAAKsZ,IACA3S,EAAMm+C,MAEf,QAEE,QADE9kD,KAAKsZ,IACA3S,EAAMo+C,UAEf,QAEE,KADE/kD,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IAEL0qC,EAAiB,GACjBhkD,KAAKsZ,IAAMtZ,KAAKwF,KACS,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACA3S,EAAMq8C,0BAERr8C,EAAMo7C,kBAEf,GAA6B,IAAzB38C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMw6C,gBAGjB,OAAOx6C,EAAMs6C,SAEf,QAEE,KADEjhD,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IAEL0qC,EAAiB,GACjBhkD,KAAKsZ,IAAMtZ,KAAKwF,KACS,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACA3S,EAAM46C,sBAER56C,EAAM06C,cAEf,GAA6B,IAAzBj8C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMq+C,mBAGjB,OAAOr+C,EAAM87C,OAEf,QAEE,KADEziD,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAA8B,CAErD,KADEtZ,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IAEL0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,KACb,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACA3S,EAAMu8C,4CAERv8C,EAAMs7C,oCAEf,GAA6B,IAAzB78C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMs8C,+BAGjB,OAAOt8C,EAAMq7C,wBAEf,GAA6B,IAAzB58C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMy6C,mBAGjB,OAAOz6C,EAAMu6C,YAEf,QAEE,QADElhD,KAAKsZ,IACA3S,EAAMs+C,SAEf,QAEE,QADEjlD,KAAKsZ,IACA3S,EAAMu+C,YAEf,QAEE,QADEllD,KAAKsZ,IACA3S,EAAMw+C,aAEf,QAEE,QADEnlD,KAAKsZ,IAEL0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,KACb,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACA3S,EAAM08C,cAER18C,EAAMy7C,MAEf,SAEE,QADEpiD,KAAKsZ,IACA3S,EAAMy+C,UAEf,SAEE,KADEplD,KAAKsZ,IACH0qC,EAAiB,GAAKhkD,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CAC7C,GAA6B,KAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAM67C,QAEf,GAA6B,IAAzBp9C,EAAKM,WAAW1F,KAAKsZ,KAEvB,QADEtZ,KAAKsZ,IACA3S,EAAMy8C,WAGjB,OAAOz8C,EAAMw7C,IAEf,SAEE,QADEniD,KAAKsZ,IACA3S,EAAM0+C,WAEf,SAEE,QADErlD,KAAKsZ,IACA3S,EAAM27C,MAEf,QAEE,QADEtiD,KAAKsZ,IACA3S,EAAM2+C,GAEf,QACE,GAAIpiD,EAAAqiD,kBAAkB7kD,GAAI,CACxB,GAAIwC,EAAAsiD,mBAAmB9kD,GAAI,CAEzB,IADA,IAAI+kD,EAAYzlD,KAAKsZ,MAEjBtZ,KAAKsZ,IAAMtZ,KAAKwF,KAClBtC,EAAAwiD,iBAAiBhlD,EAAI0E,EAAKM,WAAW1F,KAAKsZ,OAE1C,IAAKpW,EAAAsiD,mBAAmB9kD,GAEtB,OADAV,KAAKsZ,IAAMmsC,EACJ9+C,EAAMU,WAGjB,IACIs+C,EAAe3G,EADD55C,EAAKQ,UAAU6/C,EAAWzlD,KAAKsZ,MAEjD,GACEqsC,GAAgBh/C,EAAMoY,SACtB+kC,IAAuB/E,EAAmB6G,SAExC9B,IAAuB/E,EAAmB8G,SAC1ChF,EAAsB8E,IAGxB,OAAOA,EAET3lD,KAAKsZ,IAAMmsC,EAEb,OAAO9+C,EAAMU,WACR,GAAInE,EAAA4iD,aAAaplD,GAAI,GACxBV,KAAKsZ,IACP,MAOF,OALAtZ,KAAKuG,MACHgW,EAAAzY,eAAeiiD,kBACf/lD,KAAKoE,MAAMpE,KAAKsZ,IAAKtZ,KAAKsZ,IAAM,MAEhCtZ,KAAKsZ,IACA3S,EAAMoY,SAInB,OAAOpY,EAAMq/C,WAGfxC,EAAAvhD,UAAAgkD,KAAA,SACEC,EACApC,EACAqC,QAFA,IAAAD,OAAA,QACA,IAAApC,MAAyC/E,EAAmBS,cAC5D,IAAA2G,MAAyB/kC,IAAI2Y,WAE7B,IAAI30B,EAAOpF,KAAK8E,OAAOM,KACvB,GAAIpF,KAAK0jD,UAAY,EAAG,CACtB,IAAI+B,EAAYzlD,KAAKsZ,IACjB8sC,EAAcpmD,KAAK8gD,MACnBuF,EAAiBrmD,KAAKyjD,SAG1B,GAFAzjD,KAAK0jD,UAAY1jD,KAAK+jD,WAAWD,EAAoBqC,GACrDnmD,KAAK2jD,aAAe3jD,KAAKyjD,SACrByC,EAAgB,CAClBlmD,KAAK4jD,oBAAqB,EAC1B,IAAK,IAAItqC,EAAMmsC,EAAWjgD,EAAMxF,KAAK2jD,aAAcrqC,EAAM9T,IAAO8T,EAC9D,GAAIpW,EAAAuC,YAAYL,EAAKM,WAAW4T,IAAO,CACrCtZ,KAAK4jD,oBAAqB,EAC1B,OAIN5jD,KAAKsZ,IAAMmsC,EACXzlD,KAAK8gD,MAAQsF,EACbpmD,KAAKyjD,SAAW4C,EAElB,OAAOrmD,KAAK0jD,WAGdF,EAAAvhD,UAAAqkD,eAAA,SAAexC,GACb,YADa,IAAAA,MAAyC/E,EAAmB8G,QAClE7lD,KAAKumD,KAAK5/C,EAAMU,WAAYy8C,IAGrCN,EAAAvhD,UAAAskD,KAAA,SAAKzF,EAAcgD,QAAA,IAAAA,MAAyC/E,EAAmBS,SAC7E,IAAIiG,EAAYzlD,KAAKsZ,IACjB8sC,EAAcpmD,KAAK8gD,MACnBuF,EAAiBrmD,KAAKyjD,SACtB0C,EAAoB/kC,IAAI2Y,UAC5B,OAAQ+mB,GACN,KAAKn6C,EAAMu6C,YACTiF,EAAoB,EAKxB,OADAnmD,KAAK8gD,MAAQ9gD,KAAK+jD,WAAWD,EAAoBqC,GAC7CnmD,KAAK8gD,OAASA,GAChB9gD,KAAK0jD,WAAa,GACX,IAEP1jD,KAAKsZ,IAAMmsC,EACXzlD,KAAK8gD,MAAQsF,EACbpmD,KAAKyjD,SAAW4C,GACT,IAIX7C,EAAAvhD,UAAAukD,KAAA,WACE,IAAIC,EAUJ,OATIC,GACFD,EAAQC,EACRA,EAAgB,MAEhBD,EAAQ,IAAIE,EAEdF,EAAMntC,IAAMtZ,KAAKsZ,IACjBmtC,EAAM3F,MAAQ9gD,KAAK8gD,MACnB2F,EAAMhD,SAAWzjD,KAAKyjD,SACfgD,GAGTjD,EAAAvhD,UAAA2kD,QAAA,SAAQH,GACNC,EAAgBD,GAGlBjD,EAAAvhD,UAAA4kD,MAAA,SAAMJ,GACJzmD,KAAKsZ,IAAMmtC,EAAMntC,IACjBtZ,KAAK8gD,MAAQ2F,EAAM3F,MACnB9gD,KAAKyjD,SAAWgD,EAAMhD,SACtBzjD,KAAK0jD,WAAa,GAGpBF,EAAAvhD,UAAAmC,MAAA,SAAMmB,EAAiBC,GAOrB,YAPI,IAAAD,OAAc,QAAG,IAAAC,OAAY,GAC7BD,EAAQ,GACVA,EAAQvF,KAAKyjD,SACbj+C,EAAMxF,KAAKsZ,KACF9T,EAAM,IACfA,EAAMD,GAED,IAAIqB,EAAM5G,KAAK8E,OAAQS,EAAOC,IAGvCg+C,EAAAvhD,UAAA6kD,eAAA,WAGE,IAFA,IAAI1hD,EAAOpF,KAAK8E,OAAOM,KACnBG,EAAQvF,KAAKsZ,MAEbtZ,KAAKsZ,IAAMtZ,KAAKwF,KAClBtC,EAAAwiD,iBAAiBtgD,EAAKM,WAAW1F,KAAKsZ,QAExC,OAAOlU,EAAKQ,UAAUL,EAAOvF,KAAKsZ,MAGpCkqC,EAAAvhD,UAAAgxC,WAAA,WAKE,IAJA,IAAI7tC,EAAOpF,KAAK8E,OAAOM,KACnB2hD,EAAQ3hD,EAAKM,WAAW1F,KAAKsZ,OAC7B/T,EAAQvF,KAAKsZ,IACbstB,EAAS,KACA,CACX,GAAI5mC,KAAKsZ,KAAOtZ,KAAKwF,IAAK,CACxBohC,GAAUxhC,EAAKQ,UAAUL,EAAOvF,KAAKsZ,KACrCtZ,KAAKuG,MACHgW,EAAAzY,eAAekjD,4BACfhnD,KAAKoE,MAAMmB,EAAQ,EAAGvF,KAAKwF,MAE7B,MAEF,IAAI9E,EAAI0E,EAAKM,WAAW1F,KAAKsZ,KAC7B,GAAI5Y,GAAKqmD,EAAO,CACdngB,GAAUxhC,EAAKQ,UAAUL,EAAOvF,KAAKsZ,OACrC,MAEF,GAAK,IAAD5Y,EAAJ,CAMA,GAAIwC,EAAAuC,YAAY/E,GAAI,CAClBkmC,GAAUxhC,EAAKQ,UAAUL,EAAOvF,KAAKsZ,KACrCtZ,KAAKuG,MACHgW,EAAAzY,eAAekjD,4BACfhnD,KAAKoE,MAAMmB,EAAQ,EAAGvF,KAAKsZ,MAE7B,QAEAtZ,KAAKsZ,SAbLstB,GAAUxhC,EAAKQ,UAAUL,EAAOvF,KAAKsZ,KACrCstB,GAAU5mC,KAAKinD,qBACf1hD,EAAQvF,KAAKsZ,IAajB,OAAOstB,GAGT4c,EAAAvhD,UAAAglD,mBAAA,WACE,KAAMjnD,KAAKsZ,KAAOtZ,KAAKwF,IAKrB,OAJAxF,KAAKuG,MACHgW,EAAAzY,eAAeojD,uBACflnD,KAAKoE,MAAMpE,KAAKwF,MAEX,GAGT,IAAIJ,EAAOpF,KAAK8E,OAAOM,KACnB1E,EAAI0E,EAAKM,WAAW1F,KAAKsZ,OAC7B,OAAQ5Y,GACN,QAAkB,MAAO,KACzB,QAAiB,MAAO,KACxB,SAAiB,MAAO,KACxB,SAAiB,MAAO,KACxB,SAAiB,MAAO,KACxB,SAAiB,MAAO,KACxB,SAAiB,MAAO,KACxB,QAA2B,MAAO,IAClC,QAA2B,MAAO,IAClC,SACE,OACEV,KAAKsZ,IAAMtZ,KAAKwF,KACS,KAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IACAtZ,KAAKmnD,6BAEPnnD,KAAKonD,oBAEd,QAEIpnD,KAAKsZ,IAAMtZ,KAAKwF,KACS,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,QAEnBtZ,KAAKsZ,IAIX,QACA,UACA,UAAkC,MAAO,GACzC,QAAS,OAAO6hC,OAAOkM,aAAa3mD,KAIxC8iD,EAAAvhD,UAAAqlD,kBAAA,WAIE,IAHA,IAAIliD,EAAOpF,KAAK8E,OAAOM,KACnBG,EAAQvF,KAAKsZ,IACbiuC,GAAU,IACD,CACX,GAAIvnD,KAAKsZ,KAAOtZ,KAAKwF,IAAK,CACxBxF,KAAKuG,MACHgW,EAAAzY,eAAe0jD,wCACfxnD,KAAKoE,MAAMmB,EAAOvF,KAAKwF,MAEzB,MAEF,GAA6B,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAAzB,CAKA,IAAI5Y,EAAI0E,EAAKM,WAAW1F,KAAKsZ,KAC7B,GAAK,IAAD5Y,IAAwB6mD,EAAS,MACrC,GAAIrkD,EAAAuC,YAAY/E,GAAI,CAClBV,KAAKuG,MACHgW,EAAAzY,eAAe0jD,wCACfxnD,KAAKoE,MAAMmB,EAAOvF,KAAKsZ,MAEzB,QAEAtZ,KAAKsZ,IACPiuC,GAAU,QAdNvnD,KAAKsZ,IACPiuC,GAAU,EAed,OAAOniD,EAAKQ,UAAUL,EAAOvF,KAAKsZ,MAGpCkqC,EAAAvhD,UAAAwlD,gBAAA,WAIE,IAHA,IAAIriD,EAAOpF,KAAK8E,OAAOM,KACnBG,EAAQvF,KAAKsZ,IACbzR,EAAQ,EACL7H,KAAKsZ,IAAMtZ,KAAKwF,KAAK,CAC1B,IAAI9E,EAAS0E,EAAKM,WAAW1F,KAAKsZ,KAClC,IAAKpW,EAAAwiD,iBAAiBhlD,GAAI,MAI1B,SAHEV,KAAKsZ,IAGC5Y,GACN,SACEmH,GAAiB,EAARA,GAAa,EAAI,EAC1B,MAEF,SACEA,GAAiB,EAARA,GAAa,EAAI,EAC1B,MAEF,SACEA,GAAiB,EAARA,GAAa,EAAI,EAC1B,MAEF,QACEA,GAAS,GAWf,OANc,GAAVA,GACF7H,KAAKuG,MACHgW,EAAAzY,eAAe4jD,iCACf1nD,KAAKoE,MAAMmB,EAAOvF,KAAKsZ,MAGpBlU,EAAKQ,UAAUL,EAAOvF,KAAKsZ,MAGpCkqC,EAAAvhD,UAAA2iD,YAAA,WACE,IAAIx/C,EAAOpF,KAAK8E,OAAOM,KACvB,GAA6B,IAAzBA,EAAKM,WAAW1F,KAAKsZ,MAAuBtZ,KAAKsZ,IAAM,EAAItZ,KAAKwF,IAClE,OAAQJ,EAAKM,WAAW1F,KAAKsZ,IAAM,IACjC,QACA,SACA,QACA,QACA,QACA,SAAiB,OAAO,EAI5B,IADA,IAAIA,EAAMtZ,KAAKsZ,IACRA,EAAMtZ,KAAKwF,KAAK,CACrB,IAAI9E,EAAI0E,EAAKM,WAAW4T,GACxB,GAAK,IAAD5Y,GAAsB,IAADA,GAAoB,KAADA,EAC1C,OAAO,EAET,IAAKA,EAAC,IAAkBA,EAAC,KAAoB,IAADA,EAAiB,MAE7D4Y,IAEF,OAAO,GAGTkqC,EAAAvhD,UAAA0lD,YAAA,WACE,IAAIviD,EAAOpF,KAAK8E,OAAOM,KACvB,GAA6B,IAAzBA,EAAKM,WAAW1F,KAAKsZ,MAAuBtZ,KAAKsZ,IAAM,EAAItZ,KAAKwF,IAAK,CACvE,OAAQJ,EAAKM,WAAW1F,KAAKsZ,IAAM,IACjC,QACA,SAEE,OADAtZ,KAAKsZ,KAAO,EACLtZ,KAAK4nD,iBAEd,QACA,QAEE,OADA5nD,KAAKsZ,KAAO,EACLtZ,KAAK6nD,oBAEd,QACA,SAEE,OADA7nD,KAAKsZ,KAAO,EACLtZ,KAAK8nD,mBAGhB,GAAI5kD,EAAA6kD,aAAa3iD,EAAKM,WAAW1F,KAAKsZ,IAAM,IAAK,CAC/C,IAAI/T,EAAQvF,KAAKsZ,MACftZ,KAAKsZ,IACP,IAAIhY,EAAQtB,KAAK8nD,mBAKjB,OAJA9nD,KAAKuG,MACHgW,EAAAzY,eAAekkD,8CACfhoD,KAAKoE,MAAMmB,EAAOvF,KAAKsZ,MAElBhY,GAGX,OAAOtB,KAAKioD,sBAGdzE,EAAAvhD,UAAA2lD,eAAA,WAME,IALA,IAAIxiD,EAAOpF,KAAK8E,OAAOM,KACnBG,EAAQvF,KAAKsZ,IACbhY,EAAQ2gB,QAAQ,EAAG,GACnBimC,EAASjmC,QAAQ,GAAI,GACrBkmC,EAAS5iD,EACNvF,KAAKsZ,IAAMtZ,KAAKwF,KAAK,CAC1B,IAAI8T,EAAMtZ,KAAKsZ,IACX5Y,EAAI0E,EAAKM,WAAW4T,GACxB,GAAI5Y,GAAC,IAAmBA,GAAC,GAEvBY,EAAQ8mD,QACNC,QAAQ/mD,EAAO4mD,GACfjmC,QAAQvhB,EAAC,GAAgB,SAErB,GAAIA,GAAC,IAAkBA,GAAC,GAE9BY,EAAQ8mD,QACNC,QAAQ/mD,EAAO4mD,GACfjmC,QAAQ,GAAKvhB,EAAC,GAAe,SAE1B,GAAIA,GAAC,IAAkBA,GAAC,IAE7BY,EAAQ8mD,QACNC,QAAQ/mD,EAAO4mD,GACfjmC,QAAQ,GAAKvhB,EAAC,GAAe,QAE1B,IAAK,IAADA,EAWT,MAVIynD,GAAU7uC,GACZtZ,KAAKuG,MACH4hD,GAAU5iD,EACNgX,EAAAzY,eAAewkD,wCACf/rC,EAAAzY,eAAeykD,0DACnBvoD,KAAKoE,MAAMkV,IAGf6uC,EAAS7uC,EAAM,EAIjBtZ,KAAKsZ,IAAMA,EAAM,EAanB,OAXItZ,KAAKsZ,KAAO/T,EACdvF,KAAKuG,MACHgW,EAAAzY,eAAe0kD,2BACfxoD,KAAKoE,MAAMmB,IAEJ4iD,GAAUnoD,KAAKsZ,KACxBtZ,KAAKuG,MACHgW,EAAAzY,eAAewkD,wCACftoD,KAAKoE,MAAM+jD,EAAS,IAGjB7mD,GAGTkiD,EAAAvhD,UAAAgmD,mBAAA,WAME,IALA,IAAI7iD,EAAOpF,KAAK8E,OAAOM,KACnBG,EAAQvF,KAAKsZ,IACbhY,EAAQ2gB,QAAQ,EAAG,GACnBwmC,EAASxmC,QAAQ,GAAI,GACrBkmC,EAAS5iD,EACNvF,KAAKsZ,IAAMtZ,KAAKwF,KAAK,CAC1B,IAAI8T,EAAMtZ,KAAKsZ,IACX5Y,EAAI0E,EAAKM,WAAW4T,GACxB,GAAI5Y,GAAC,IAAmBA,GAAC,GAEvBY,EAAQ8mD,QACNC,QAAQ/mD,EAAOmnD,GACfxmC,QAAQvhB,EAAC,GAAgB,QAEtB,IAAK,IAADA,EAWT,MAVIynD,GAAU7uC,GACZtZ,KAAKuG,MACH4hD,GAAU5iD,EACNgX,EAAAzY,eAAewkD,wCACf/rC,EAAAzY,eAAeykD,0DACnBvoD,KAAKoE,MAAMkV,IAGf6uC,EAAS7uC,EAAM,EAIjBtZ,KAAKsZ,IAAMA,EAAM,EAanB,OAXItZ,KAAKsZ,KAAO/T,EACdvF,KAAKuG,MACHgW,EAAAzY,eAAe4kD,eACf1oD,KAAKoE,MAAMmB,IAEJ4iD,GAAUnoD,KAAKsZ,KACxBtZ,KAAKuG,MACHgW,EAAAzY,eAAewkD,wCACftoD,KAAKoE,MAAM+jD,EAAS,IAGjB7mD,GAGTkiD,EAAAvhD,UAAA6lD,iBAAA,WAME,IALA,IAAI1iD,EAAOpF,KAAK8E,OAAOM,KACnBG,EAAQvF,KAAKsZ,IACbhY,EAAQ2gB,QAAQ,EAAG,GACnB0mC,EAAQ1mC,QAAQ,EAAG,GACnBkmC,EAAS5iD,EACNvF,KAAKsZ,IAAMtZ,KAAKwF,KAAK,CAC1B,IAAI8T,EAAMtZ,KAAKsZ,IACX5Y,EAAI0E,EAAKM,WAAW4T,GACxB,GAAI5Y,GAAC,IAAmBA,GAAC,GAEvBY,EAAQ8mD,QACNC,QAAQ/mD,EAAOqnD,GACf1mC,QAAQvhB,EAAC,GAAgB,QAEtB,IAAK,IAADA,EAWT,MAVIynD,GAAU7uC,GACZtZ,KAAKuG,MACH4hD,GAAU5iD,EACNgX,EAAAzY,eAAewkD,wCACf/rC,EAAAzY,eAAeykD,0DACnBvoD,KAAKoE,MAAMkV,IAGf6uC,EAAS7uC,EAAM,IAIftZ,KAAKsZ,IAaT,OAXItZ,KAAKsZ,KAAO/T,EACdvF,KAAKuG,MACHgW,EAAAzY,eAAe8kD,qBACf5oD,KAAKoE,MAAMmB,IAEJ4iD,GAAUnoD,KAAKsZ,KACxBtZ,KAAKuG,MACHgW,EAAAzY,eAAewkD,wCACftoD,KAAKoE,MAAM+jD,EAAS,IAGjB7mD,GAGTkiD,EAAAvhD,UAAA4lD,kBAAA,WAOE,IANA,IAAIziD,EAAOpF,KAAK8E,OAAOM,KACnBG,EAAQvF,KAAKsZ,IACbhY,EAAQ2gB,QAAQ,EAAG,GACnB4mC,EAAQ5mC,QAAQ,EAAG,GACnB6mC,EAAQ7mC,QAAQ,EAAG,GACnBkmC,EAAS5iD,EACNvF,KAAKsZ,IAAMtZ,KAAKwF,KAAK,CAC1B,IAAI8T,EAAMtZ,KAAKsZ,IACX5Y,EAAI0E,EAAKM,WAAW4T,GACxB,GAAK,IAAD5Y,EAEFY,EAAQ+mD,QACN/mD,EACAunD,QAEG,GAAK,IAADnoD,EAETY,EAAQ8mD,QACNC,QAAQ/mD,EAAOunD,GACfC,OAEG,IAAK,IAADpoD,EAWT,MAVIynD,GAAU7uC,GACZtZ,KAAKuG,MACH4hD,GAAU5iD,EACNgX,EAAAzY,eAAewkD,wCACf/rC,EAAAzY,eAAeykD,0DACnBvoD,KAAKoE,MAAMkV,IAGf6uC,EAAS7uC,EAAM,EAIjBtZ,KAAKsZ,IAAMA,EAAM,EAanB,OAXItZ,KAAKsZ,KAAO/T,EACdvF,KAAKuG,MACHgW,EAAAzY,eAAeilD,sBACf/oD,KAAKoE,MAAMmB,IAEJ4iD,GAAUnoD,KAAKsZ,KACxBtZ,KAAKuG,MACHgW,EAAAzY,eAAewkD,wCACftoD,KAAKoE,MAAM+jD,EAAS,IAGjB7mD,GAGTkiD,EAAAvhD,UAAA+mD,UAAA,WAWE,OAAOhpD,KAAKipD,oBAGdzF,EAAAvhD,UAAAgnD,iBAAA,WAIE,IAFA,IAAI1jD,EAAQvF,KAAKsZ,IACblU,EAAOpF,KAAK8E,OAAOM,KAChBpF,KAAKsZ,IAAMtZ,KAAKwF,KAAOtC,EAAAkhD,eAAeh/C,EAAKM,WAAW1F,KAAKsZ,SAC9DtZ,KAAKsZ,IAET,GAAItZ,KAAKsZ,IAAMtZ,KAAKwF,KAAgC,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,KAE9C,MADEtZ,KAAKsZ,IACAtZ,KAAKsZ,IAAMtZ,KAAKwF,KAAOtC,EAAAkhD,eAAeh/C,EAAKM,WAAW1F,KAAKsZ,SAC9DtZ,KAAKsZ,IAGX,GAAItZ,KAAKsZ,IAAMtZ,KAAKwF,IAAK,CACvB,IAAI9E,EAAI0E,EAAKM,WAAW1F,KAAKsZ,KAC7B,GAAK,IAAD5Y,GAAoB,KAADA,EAUrB,MARIV,KAAKsZ,IAAMtZ,KAAKwF,MACS,IAAzBJ,EAAKM,WAAW1F,KAAKsZ,MACI,IAAzBlU,EAAKM,WAAW1F,KAAKsZ,OAEvBpW,EAAAkhD,eAAeh/C,EAAKM,WAAW1F,KAAKsZ,IAAM,OAExCtZ,KAAKsZ,IAEFtZ,KAAKsZ,IAAMtZ,KAAKwF,KAAOtC,EAAAkhD,eAAeh/C,EAAKM,WAAW1F,KAAKsZ,SAC9DtZ,KAAKsZ,IAIb,OAAO4vC,WAAW9jD,EAAKQ,UAAUL,EAAOvF,KAAKsZ,OAG/CkqC,EAAAvhD,UAAAknD,aAAA,WACE,MAAM,IAAIzjC,MAAM,oBAGlB89B,EAAAvhD,UAAAmlD,kBAAA,WAIE,IAHA,IAAIgC,EAAS,EACT9nD,EAAQ,EACR8D,EAAOpF,KAAK8E,OAAOM,KAChBpF,KAAKsZ,IAAMtZ,KAAKwF,KAAK,CAC1B,IAAI9E,EAAI0E,EAAKM,WAAW1F,KAAKsZ,OAC7B,GAAI5Y,GAAC,IAAmBA,GAAC,GACvBY,EAAgB,GAARA,EAAaZ,EAAC,QACjB,GAAIA,GAAC,IAAkBA,GAAC,GAC7BY,EAAgB,GAARA,EAAa,GAAKZ,EAAC,OACtB,MAAIA,GAAC,IAAkBA,GAAC,KAO7B,OAJAV,KAAKuG,MACHgW,EAAAzY,eAAe0kD,2BACfxoD,KAAKoE,MAAMpE,KAAKsZ,IAAM,EAAGtZ,KAAKsZ,MAEzB,GANPhY,EAAgB,GAARA,EAAa,GAAKZ,EAAC,GAQ7B,GAAgB,KAAV0oD,EAAa,MAErB,OAAIA,GACFppD,KAAKuG,MACHgW,EAAAzY,eAAeojD,uBACflnD,KAAKoE,MAAMpE,KAAKsZ,MAEX,IAEF6hC,OAAOkM,aAAa/lD,IAGrBkiD,EAAAvhD,UAAAklD,0BAAR,WACE,IAAI5hD,EAAQvF,KAAKsZ,IACbhY,EAAQtB,KAAK4nD,iBACbyB,EAAU3Z,QAAQpuC,GAClBgoD,GAAU,EAEd7lD,QAAQksC,SAASruC,IACb+nD,EAAU,UACZrpD,KAAKuG,MACHgW,EAAAzY,eAAeylD,4EACfvpD,KAAKoE,MAAMmB,EAAOvF,KAAKsZ,MAEzBgwC,GAAU,GAGZ,IAAIlkD,EAAOpF,KAAK8E,OAAOM,KAiBvB,OAhBIpF,KAAKsZ,KAAOtZ,KAAKwF,KACnBxF,KAAKuG,MACHgW,EAAAzY,eAAeojD,uBACflnD,KAAKoE,MAAMmB,EAAOvF,KAAKwF,MAEzB8jD,GAAU,GACwB,KAAzBlkD,EAAKM,WAAW1F,KAAKsZ,OAC5BtZ,KAAKsZ,KAEPtZ,KAAKuG,MACHgW,EAAAzY,eAAe0lD,qCACfxpD,KAAKoE,MAAMmB,EAAOvF,KAAKsZ,MAEzBgwC,GAAU,GAGRA,EAAgB,GACbD,EAAU,MACblO,OAAOkM,aAAagC,GACpBlO,OAAOkM,aAC2B,QAA/BgC,EAAU,OAAS,KAAO,IAC1BA,EAAU,OAAS,KAAY,QAIxC7F,EAAAvhD,UAAAwnD,OAAA,aAEFjG,EAzkCA,CAA+BjnC,EAAAtW,mBAAlBvG,EAAA8jD,YA4kCb,IAAAmD,EAAA,WAOA,OAPA,gBAAajnD,EAAAinD,QAUb,IAAID,EAA8B,o6BCrjDlC,IAoKYlX,EApKZka,EAAAvpD,EAAA,IAQAoc,EAAApc,EAAA,GAKAuc,EAAAvc,EAAA,GAyBAsG,EAAAtG,EAAA,GAUAs7C,EAAAt7C,EAAA,GA4BAuG,EAAAvG,EAAA,GAKAsc,EAAAtc,EAAA,GA+DAqc,EAAArc,EAAA,GASA+C,EAAA/C,EAAA,IAWA,SAAYqvC,GAEVA,IAAA,mBAEAA,IAAA,mBAJF,CAAYA,EAAA9vC,EAAA8vC,SAAA9vC,EAAA8vC,YAQZ,IAAAma,EAAA,oBAAAA,IAGE3pD,KAAAgyB,OAAiBwd,EAAOoa,OAExB5pD,KAAAmiB,eAAsB,EAEtBniB,KAAAoiB,UAAiB,EAEjBpiB,KAAA6pD,cAAqB,EAErB7pD,KAAA8pD,aAAoB,EAEpB9pD,KAAA0wB,WAAkB,EAElB1wB,KAAAqiB,WAAkB,EAElBriB,KAAAslB,cAA2C,KAE3CtlB,KAAA+pD,SAAQ,EAGR/pD,KAAAsiB,kBAAyB,EAEzBtiB,KAAAuiB,gBAAuB,EA0BzB,OAvBExhB,OAAAC,eAAI2oD,EAAA1nD,UAAA,gBAAJ,WACE,OAAOjC,KAAKgyB,QAAUwd,EAAOC,wCAI/B1uC,OAAAC,eAAI2oD,EAAA1nD,UAAA,iBAAJ,WACE,OAAOjC,KAAKgyB,QAAUwd,EAAOC,OAASjzB,EAAAyE,KAAKi7B,QAAU1/B,EAAAyE,KAAKk7B,yCAI5Dp7C,OAAAC,eAAI2oD,EAAA1nD,UAAA,iBAAJ,WACE,OAAOjC,KAAKgyB,QAAUwd,EAAOC,OAASjzB,EAAAyE,KAAK+6B,QAAUx/B,EAAAyE,KAAKg7B,yCAI5Dl7C,OAAAC,eAAI2oD,EAAA1nD,UAAA,sBAAJ,WACE,OAAOjC,KAAKgyB,QAAUwd,EAAOC,OAAQ,EAAiB,mCAIxDka,EAAA1nD,UAAAugB,WAAA,SAAWwnC,GACT,OAAoC,IAA5BhqD,KAAK+pD,SAAWC,IAE5BL,EAlDA,GAAajqD,EAAAiqD,UAqDb,SAAkBM,GAEhBA,IAAA,eAEAA,IAAA,mCAEAA,IAAA,mCANF,CAAkBvqD,EAAAuqD,UAAAvqD,EAAAuqD,aAUlB,SAAkBC,GAEhBA,IAAA,eAEAA,IAAA,uBAEAA,IAAA,uBANF,CAAkBxqD,EAAAwqD,iBAAAxqD,EAAAwqD,oBAUlB,SAAkBC,GAEhBA,IAAA,eAEAA,IAAA,eAJF,CAAkBzqD,EAAAyqD,WAAAzqD,EAAAyqD,cAQlB,IA+3OIC,EACAC,EAh4OJC,EAAA,SAAAh1C,GA6CE,SAAAg1C,EAAY/9B,EAAkBvL,QAAA,IAAAA,MAAA,MAA9B,IAAAxL,EACEF,EAAA9U,KAAAR,KAAMusB,EAAQrmB,cAAYlG,YAjC5BwV,EAAA+0C,qBAAwC,KAExC/0C,EAAAg1C,0BAEAh1C,EAAAi1C,YAA2B,KAE3Bj1C,EAAAk1C,YAAoBluC,EAAAyE,KAAKc,KAQzBvM,EAAAm1C,kBAEAn1C,EAAAo1C,eAA4C,IAAIzrC,IAEhD3J,EAAAq1C,eAA4B,QAE5Br1C,EAAAs1C,QAAqB,EAErBt1C,EAAAu1C,QAAuB,EAEvBv1C,EAAAw1C,mBAA0B,EAo3ElBx1C,EAAAy1C,eAAkC,KAClCz1C,EAAA01C,eAAkC,KAClC11C,EAAA21C,eAAkC,KAClC31C,EAAA41C,eAAkC,KA72ExC51C,EAAK+W,QAAUA,EACf/W,EAAKgL,SAAW+L,EAAQ/L,SACnBQ,IAASA,EAAU,IAAI2oC,GAC5Bn0C,EAAKwL,QAAUA,EACfxL,EAAK6b,aAAepP,QAGlBopC,IAAIrqC,EAAQqB,WAAY,IAE1B7M,EAAK7V,OAAS+c,EAAAmpB,OAAOlkC,WA+wOzB,OAv0O8B4T,EAAA+0C,EAAAh1C,GAwCrBg1C,EAAAgB,QAAP,SAAe/+B,EAAkBvL,GAC/B,YAD+B,IAAAA,MAAA,MACxB,IAAIspC,EAAS/9B,EAASvL,GAASsqC,WAmBxChB,EAAAroD,UAAAqpD,QAAA,mBACMtqC,EAAUhhB,KAAKghB,QACfrhB,EAASK,KAAKL,OACd4sB,EAAUvsB,KAAKusB,QAGnBA,EAAQxL,WAAWC,GAGnB,IAAIuqC,EAAwB,IAAI9P,EAAA5tB,SAAStB,EAAQtG,cAAe,QAAS,IAAIzJ,EAAA+gC,aAAc/gC,EAAAyE,KAAKc,OAChG/hB,KAAKurD,sBAAwBA,EAC7B,IAAIC,EAAoB,IAAIrlD,MAC5BnG,KAAKwrD,kBAAoBA,EACzBxrD,KAAK6yB,gBAAkB04B,EAGnBvqC,EAAQkB,SACVviB,EAAO+sC,UACL,YAAW,GAEX,EACA/sC,EAAO+nC,UAAU,EAAG,IAGtB/nC,EAAO+sC,UACL,YAAW,GAEX,EACA/sC,EAAO2nC,UAAU,IAMrB,IADA,IAAI5mB,EAAU6L,EAAQ7L,QACbrgB,EAAI,EAAGwK,EAAI6V,EAAQpb,OAAQjF,EAAIwK,IAAKxK,EACvCqgB,EAAQrgB,GAAG+nB,SAASpoB,KAAKyrD,cAAc/qC,EAAQrgB,IAIrD,GAAImrD,EAAkBlmD,QAAmC,OAAzBinB,EAAQxM,aAAuB,CAC7D,IAAI9M,EAAYs4C,EAAsBt4C,UAClCy4C,EAAU/rD,EAAOotC,YACnBwe,EAAsBxoC,aACtB/iB,KAAK2rD,mBACH14C,EAAUqT,eACVrT,EAAU3J,WACV2J,EAAUgc,UAEZzS,EAAA2gC,mBAAmBoO,EAAsBv9B,kBACzCruB,EAAOkrC,YAAY,KAAM2gB,IAE3BD,EAAsB96B,SAAS9wB,EAAQ+rD,GAClCn/B,EAAQxM,cAAcpgB,EAAOwwC,SAASub,GAI7C,IAAIr6B,EAAerxB,KAAKqxB,aACxBA,EAAeu6B,UAAUv6B,EAAcrQ,EAAQW,UAAU6E,UACzDxmB,KAAKqxB,aAAeA,EACpB1xB,EAAOktC,aAAa,aAChB7rB,EAAQkB,SACVviB,EAAO+sC,UACL,YAAW,GAEX,EACA/sC,EAAO+nC,UAAUgI,QAAQre,GAAese,SAASte,KAGnD1xB,EAAO+sC,UACL,YAAW,GAEX,EACA/sC,EAAO2nC,UAAUoI,QAAQre,KAK7B,IAAIw6B,EAAW7rD,KAAK2qD,eAAerlD,OAC/BoqC,QAAQoc,UAAUF,UAAUv6B,EAAc,OAAUpP,QAAQ,GAAI,KAChE,EACJtiB,EAAOsvC,UACL4c,EACAnvC,EAAAmpB,OAAO2P,iBACPx1C,KAAK2qD,eACL3pC,EAAQgR,OACR,UAIEhR,EAAQ6oC,cAAclqD,EAAOivC,gBAAgB,IAAK,MAAO,UAG7D,IAAIic,EAAgB7qD,KAAK6qD,cACzBlrD,EAAOqwC,iBAAiB6a,EAAcvlD,OAAQ,WAAYulD,GAC1DlrD,EAAOiuC,eAAe,IAAK,SAC3BjuC,EAAOotC,YAAY,OAAQ/sC,KAAK2rD,mBAAmB,KAAMnvC,EAAAyE,KAAKc,MAAO,KAAMpiB,EAAOkrC,YAAY,UAG1F7pB,EAAQ8oC,aAAanqD,EAAO+uC,eAAe,IAAK,MAAO,aAG3D,IAAiC,IAAArf,EAAAnL,EAAAqI,EAAQ5M,oBAAkB2E,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAApD,IAAAqB,EAAAlB,EAAAD,EAAAhjB,MAAA,GAACV,EAAA6kB,EAAA,GAAMsmC,EAAAtmC,EAAA,GACdzlB,KAAKgsD,iBAAiBprD,EAAMmrD,EAAa1/C,2GAM3C,OAFIrM,KAAKgrD,mBAAmBtB,EAAAuC,oBAAoBjsD,MAEzCL,GAID2qD,EAAAroD,UAAA+pD,iBAAR,SAAyBprD,EAAcyL,EAAkBif,gCAAA,IAAAA,MAAA,IAGvD,IAAItb,EAAU3D,EAAQ2D,QACtB,GAAIA,EAAS,CACX,IAAIk8C,EAAY5gC,EAAS1qB,GAAQyL,EAAQtF,MAAQ00C,EAAAz8B,YAAYvH,MACzDhR,EAAA/D,mBACA+D,EAAA9D,kBAEJ,GAAI0J,EAAQtF,MAAQ00C,EAAAz8B,YAAYwN,cAC9B,IAAmB,IAAA2/B,EAAAjoC,EAAAlU,EAAQtC,UAAQ0+C,EAAAD,EAAA/nC,QAAAgoC,EAAA/nC,KAAA+nC,EAAAD,EAAA/nC,OAAE,EAA5B9J,EAAM8xC,EAAA9qD,OACDyG,GAAGtB,EAAApE,YAAY4X,SAC3Bja,KAAKgsD,iBAAiB1xC,EAAOuN,WAAYvN,EAAQ4xC,8GAGnD,IAAmB,IAAAG,EAAAnoC,EAAAlU,EAAQtC,UAAQ4+C,EAAAD,EAAAjoC,QAAAkoC,EAAAjoC,KAAAioC,EAAAD,EAAAjoC,OAAE,CAAhC,IAAI9J,KAAMgyC,EAAAhrD,OACFyG,GAAGtB,EAAApE,YAAYi+C,UAC1BtgD,KAAKgsD,iBAAiB1xC,EAAOuN,WAAYvN,EAAQ4xC,sGAKvD,OAAQ7/C,EAAQtF,MAGd,KAAK00C,EAAAz8B,YAAY5I,OAEf,GADc/J,EAAQtE,GAAGtB,EAAApE,YAAYgqB,QAAUhgB,EAAQtE,GAAGtB,EAAApE,YAAY+X,OAAS3T,EAAApE,YAAY4mB,WAC1EjpB,KAAKghB,QAAQwB,WAAU,GAStCxiB,KAAKL,OAAOquC,gBAAgB3hC,EAAQ0W,aAAcuI,EAAS1qB,QARvDiL,EAAuBQ,EAASR,cAElC7L,KAAKuG,MACHgW,EAAAzY,eAAeyoD,+BACf1gD,EAAYjL,KAAKwD,OAMvB,MAEF,KAAKq3C,EAAAz8B,YAAY0N,UAEb,IAAI7gB,EADN,GAAKpI,OAAO4I,EAAQzE,QAAQG,GAAGtB,EAAApE,YAAYgqB,QAAWrsB,KAAKghB,QAAQwB,WAAU,GAS3ExiB,KAAKL,OAAOquC,gBAAgB3hC,EAAQ0W,aAAcuI,EAAS1qB,QARvDiL,EAA0BQ,EAASR,cAErC7L,KAAKuG,MACHgW,EAAAzY,eAAeyoD,+BACf1gD,EAAYjL,KAAKwD,OAMvB,MAIF,KAAKq3C,EAAAz8B,YAAYnH,SACf,IACI5E,GADA4S,EAAqBxZ,GACA4G,UACrBA,EAAUyqC,mBAAqBzqC,EAAUqT,eAAehhB,SAE1DugB,EAAW7lB,KAAKwsD,iBAAiB3mC,GACjC7lB,KAAKysD,iBAEH5mC,EAAS9d,GAAGtB,EAAApE,YAAYqqD,WAAW1sD,KAAKL,OAAO6tC,kBAAkB3nB,EAAS9C,aAAcuI,EAAS1qB,GACrG,MAIF,KAAK66C,EAAAz8B,YAAYuL,SACf,IAAI1pB,EAAS4C,OAAkB4I,EAASme,iBACxCxqB,KAAKgsD,iBAAiBvlD,EAAAjE,cAAgB5B,EAAMC,EAAQyqB,GACpD,IAAIqhC,EAAoBtgD,EAASoe,gBAC7BkiC,GAAQ3sD,KAAKgsD,iBAAiBvlD,EAAAhE,cAAgB7B,EAAM+rD,EAAQrhC,GAChE,MAIF,KAAKmwB,EAAAz8B,YAAYoS,MACf,IAAIzxB,EAASK,KAAKL,OACd2I,EAAe+D,EAAS/D,KACxBskD,EAAatkD,EAAK2nB,eAClB0V,EAAiBt5B,EAASglB,aAC1B1P,EAAY3hB,KAAKghB,QAAQW,UACzBkrC,EAAiB7sD,KAAKghB,QAAQ6rC,eAG9BC,EAAaxhC,EAAS7kB,EAAAjE,cAAgB5B,EAgB1C,GAfAjB,EAAOotC,YACL+f,EACA9sD,KAAK2rD,mBAAmB,KAAMrjD,EAAMqZ,GACpC,KACAhiB,EAAOspC,WACL3gC,EAAKke,SACLle,EAAKP,GAAE,GACPpI,EAAOgpC,eAAe,EAAGkkB,GACzBD,EACAjnB,IAGJhmC,EAAO6tC,kBAAkBsf,EAAYA,IAGhCzgD,EAAQtE,GAAGtB,EAAApE,YAAY4mB,UAAW,CACrC,IAAI8jC,EAAazhC,EAAS7kB,EAAAhE,cAAgB7B,EAC1CjB,EAAOotC,YACLggB,EACA/sD,KAAK2rD,oBAAqBrjD,GAAQkU,EAAAyE,KAAKc,KAAMJ,GAC7C,KACAhiB,EAAO2pC,YACLhhC,EAAKke,SACL7mB,EAAOgpC,eAAe,EAAGkkB,GACzBltD,EAAOgpC,eAAe,EAAGikB,GACzBA,EACAjnB,IAGJhmC,EAAO6tC,kBAAkBuf,EAAYA,GAEvC,MAIF,KAAKtR,EAAAz8B,YAAYgH,uBACf,IAAsB,IAAAgnC,EAAA9oC,EAAoB7X,EAASkhB,UAAU7f,UAAQu/C,EAAAD,EAAA5oC,QAAA6oC,EAAA5oC,KAAA4oC,EAAAD,EAAA5oC,OAAE,CAAlE,IAAImJ,EAAS0/B,EAAA3rD,UAChB,IAAqB,IAAA4rD,EAAAhpC,EAAAqJ,EAAU7f,UAAQy/C,EAAAD,EAAA9oC,QAAA+oC,EAAA9oC,KAAA8oC,EAAAD,EAAA9oC,OAAE,CAApC,IACC0G,EAAelqB,EACnB,IAFOilB,EAAQsnC,EAAA7rD,OAEFyG,GAAGtB,EAAApE,YAAY6jB,SAE1B4E,IADIsiC,EAAWvnC,EAAS9C,cACCnd,UAAUwnD,EAAS7zC,YAAY,MAE1DvZ,KAAKgsD,iBAAiBlhC,EAAcjF,EAAUyF,wMAGlD,MAEF,KAAKmwB,EAAAz8B,YAAYmG,oBACf,IAAqB,IAAAkoC,EAAAnpC,EAAiB7X,EAASkhB,UAAU7f,UAAQ4/C,EAAAD,EAAAjpC,QAAAkpC,EAAAjpC,KAAAipC,EAAAD,EAAAjpC,OAAE,CAA9D,IAAIyB,EAGDunC,EAFFtiC,EAAelqB,EACnB,IAFOilB,EAAQynC,EAAAhsD,OAEFyG,GAAGtB,EAAApE,YAAY6jB,SAE1B4E,IADIsiC,EAAWvnC,EAAS9C,cACCnd,UAAUwnD,EAAS7zC,YAAY,MAE1D,IAAIg0C,EAAO1nC,EAAS4L,oBAChB87B,GAAMvtD,KAAKgsD,iBAAiBlhC,EAAerkB,EAAA/D,mBAAqB6qD,EAAK1lC,WAAY0lC,EAAMjiC,GAC3FtrB,KAAKgsD,iBAAiBlhC,EAAcjF,EAAUyF,qGAEhD,MAIF,KAAKmwB,EAAAz8B,YAAYyN,KACjB,KAAKgvB,EAAAz8B,YAAYvH,MACjB,KAAKgkC,EAAAz8B,YAAYwN,UAAW,MAE5B,QAAS/oB,QAAO,KAOpB6mD,EAAAroD,UAAAurD,oBAAA,SAAoB3sC,EAAwC4sC,GAC1D,IAAI3oD,EAAS9E,KAAKusB,QAAQ3L,mBAAmBC,GACzC/b,EAAQ9E,KAAKyrD,cAAc3mD,GAE7B9E,KAAKuG,MACHgW,EAAAzY,eAAe4pD,iBACfD,EAAWrpD,MAAOyc,IAMxBypC,EAAAroD,UAAAwpD,cAAA,SAAc3mD,GACZ,IAAIA,EAAOiD,GAAGtB,EAAApE,YAAYqqD,UAA1B,CACA5nD,EAAOoD,IAAIzB,EAAApE,YAAYqqD,UAQvB,IALA,IAAIvqC,EAAgBniB,KAAKghB,QAAQmB,cAC7BiG,EAAUtjB,EAAOsjB,QACjBmjC,EAAwBvrD,KAAKurD,sBAC7BC,EAAoBxrD,KAAKwrD,kBACzBj8C,EAAazK,EAAOyK,WACflP,EAAI,EAAGwK,EAAI0E,EAAWjK,OAAQjF,EAAIwK,IAAKxK,EAAG,CACjD,IAAIiQ,EAAYf,EAAWlP,GAC3B,OAAQiQ,EAAUvJ,MAChB,KAAK0V,EAAA5V,SAASsT,kBAETgI,GAAkBiG,GAAW9X,EAAUvI,GAAGtB,EAAApE,YAAY4X,WACnC3J,EAAWq9C,WAE/B3tD,KAAK4tD,wBAA0Ct9C,MAEjD,MAEF,KAAKmM,EAAA5V,SAAS2U,qBAAsB,MACpC,KAAKiB,EAAA5V,SAASgU,iBACRsH,GAAkBiG,GAAW9X,EAAUvI,GAAGtB,EAAApE,YAAY4X,UACxDja,KAAK6tD,uBAAwCv9C,GAE/C,MAEF,KAAKmM,EAAA5V,SAAS+R,qBAETuJ,GAAkBiG,GAAW9X,EAAUvI,GAAGtB,EAAApE,YAAY4X,WAChC3J,EAAWq9C,WAElC3tD,KAAK8tD,2BAAgDx9C,MAEvD,MAEF,KAAKmM,EAAA5V,SAAS0U,OACZvb,KAAKwtD,oBACel9C,EAAWvL,eACXuL,EAAWS,MAE/B,MAEF,KAAK0L,EAAA5V,SAASmT,sBACRmI,GAAkBiG,GAAW9X,EAAUvI,GAAGtB,EAAApE,YAAY4X,UACxDja,KAAK+tD,4BAAkDz9C,GAEzD,MAEF,KAAKmM,EAAA5V,SAASkT,SACZ,IAAIi0C,EAAehuD,KAAKiuD,yBAA4C39C,GAChE09C,GAAcxC,EAAkB3lD,KAAKmoD,GACzC,MAEF,KAAKvxC,EAAA5V,SAASoT,OACuC,MAA7B3J,EAAWvL,gBAC/B/E,KAAKwtD,oBACuBl9C,EAAWvL,eACMuL,EAAWS,OAGtDoR,GAAiBiG,IACnBpoB,KAAKkuD,uBAAwC59C,GAE/C,MAEF,QACE,IAAI69C,EAAmBnuD,KAAK6yB,gBAC5B7yB,KAAK6yB,gBAAkB04B,EACvBC,EAAkB3lD,KAAK7F,KAAKouD,iBAAiB99C,IAC7CtQ,KAAK6yB,gBAAkBs7B,MAS/B7D,EAAAroD,UAAAosD,yBAAA,SAAyBxiD,GAEvB,IAAIQ,EAAU5I,OAAOzD,KAAKusB,QAAQjN,eAAepe,IAAI2K,EAAY+b,wBAEjE,OADAnkB,OAAO4I,EAAQtF,MAAQ00C,EAAAz8B,YAAY5I,QAC9BpW,KAAKsuD,cAAsBjiD,GACjBA,EADkC,MAInDi+C,EAAAroD,UAAAqsD,cAAA,SAAc5nC,GACZ,GAAIA,EAAO3e,GAAGtB,EAAApE,YAAYqqD,UAAW,OAAO,EAC5ChmC,EAAOxe,IAAIzB,EAAApE,YAAYqqD,UAEvB,IAAI/sD,EAASK,KAAKL,OACdkM,EAAc6a,EAAO7a,YACrB0iD,EAA0B,EAE9B,IAAK7nC,EAAO3e,GAAGtB,EAAApE,YAAYwkB,UACzB,GAAIhb,EAGF,GAAIA,EAAYvD,KAAM,CACpB,IAAIkmD,EAAexuD,KAAKwgB,SAASiuC,YAAY5iD,EAAYvD,MACzD,IAAKkmD,EAAc,OAAO,EAC1B,GAAIA,GAAgBhyC,EAAAyE,KAAKc,KAKvB,OAJA/hB,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACf7iD,EAAYvD,KAAKlE,QAEZ,EAETsiB,EAAOpe,KAAOkmD,EACd9nC,EAAOxe,IAAIzB,EAAApE,YAAYwkB,cAGlB,KAAIhb,EAAY5C,YAsBrB,OAJAjJ,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACf7iD,EAAYjL,KAAKwD,MAAMuqD,QAElB,EAhBP,GALAJ,EAAWvuD,KAAK4uD,4BACd/iD,EAAY5C,YACZuT,EAAAyE,KAAKc,KAAI,GAGP/hB,KAAK0qD,aAAeluC,EAAAyE,KAAKc,KAK3B,OAJA/hB,KAAKuG,MACHgW,EAAAzY,eAAe+qD,mCACfhjD,EAAY5C,YAAY7E,MAAOpE,KAAK0qD,YAAY7lD,WAAY,WAEvD,EAET6hB,EAAOpe,KAAOtI,KAAK0qD,YACnBhkC,EAAOxe,IAAIzB,EAAApE,YAAYwkB,eAWzBpjB,QAAO,GAKX,GAAIijB,EAAO3e,GAAGtB,EAAApE,YAAY8jB,UAAYO,EAAOgB,aAAa+zB,EAAAx8B,eAAe/I,SAAU,OAAO,EAE1F,IAAI02C,EAAalmC,EAAOpe,KAAK2nB,eACzB6+B,EAAqBpoC,EAAO3e,GAAGtB,EAAApE,YAAYgqB,QAAU3F,EAAO3e,GAAGtB,EAAApE,YAAY+X,OAAS3T,EAAApE,YAAY4mB,UAGpG,GAAIvC,EAAO3e,GAAGtB,EAAApE,YAAY8jB,SAGxB,OAAI2oC,GAAsB9uD,KAAKghB,QAAQwB,WAAU,IAC/CkE,EAAOxe,IAAIzB,EAAApE,YAAY0sD,eACnBljD,EACFmjD,EAAiBtoC,EAAQ7a,IAEzBu+C,EAA8B,MAC9BC,EAA+B3jC,EAAOmB,YAExCloB,EAAOmvC,gBACLpoB,EAAO3D,aACPqnC,EACAC,EACAuC,GAEFlmC,EAAOxe,IAAIzB,EAAApE,YAAYqqD,WAChB,IAIP1sD,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfxkB,OAAOoI,GAAazH,QAGjB,GAKT,IAAI6qD,GAAoB,EAGxB,GAAoB,OAAhBpjD,GAAoD,OAA5BA,EAAY5C,aA0BtC,GAzBKslD,IACHA,EAAWvuD,KAAKkvD,kBACdrjD,EAAY5C,YACZyd,EAAOpe,KAAI,MAMXoU,EAAA2Y,gBAAgBk5B,IAAa7xC,EAAA4Y,aAAa+C,QACxCy2B,GACFP,EAAW5uD,EAAO8xC,qBAAqB8c,GACnC7xC,EAAA2Y,gBAAgBk5B,IAAa7xC,EAAA4Y,aAAa+C,QAC5Cr4B,KAAKsG,QACHiW,EAAAzY,eAAeqrD,4DACftjD,EAAYzH,OAEd6qD,GAAoB,IAGtBA,GAAoB,GAKpBvoC,EAAOgB,aAAa+zB,EAAAx8B,eAAe5I,UAChC44C,EAAmB,CAGtB,OAFAxrD,OAAOiZ,EAAA2Y,gBAAgBk5B,IAAa7xC,EAAA4Y,aAAa+C,OAClC3b,EAAAgd,kBAAkB60B,IAE/B,OACE7nC,EAAOoG,kBAAiB,EACxBpG,EAAOqG,qBAAuB9K,QAAQvF,EAAA4b,iBAAiBi2B,GAAW,GAClE,MAEF,OACE7nC,EAAOoG,kBAAiB,EACxBpG,EAAOqG,qBAAuB9K,QAC5BvF,EAAAid,oBAAoB40B,GACpB7xC,EAAA+4B,qBAAqB8Y,IAEvB,MAEF,OACE7nC,EAAOoG,kBAAiB,EACxBpG,EAAOuG,mBAAqBvQ,EAAAkd,iBAAiB20B,GAC7C,MAEF,OACE7nC,EAAOoG,kBAAiB,EACxBpG,EAAOuG,mBAAqBvQ,EAAAmd,iBAAiB00B,GAC7C,MAEF,QAEE,OADA9qD,QAAO,IACA,EAGXijB,EAAOxe,IAAIzB,EAAApE,YAAY2qB,eAM3BuhC,EAAW7nC,EAAOpe,KAAK00C,aAAar9C,GAGtC,IAAIojB,EAAe2D,EAAO3D,aAS1B,OAPIksC,GACFtvD,EAAO+sC,UAAU3pB,EAAc6pC,GAAY,EAAMlmC,EAAOpe,KAAK00C,aAAar9C,IAC1EK,KAAKwrD,kBAAkB3lD,KAAKlG,EAAOgrC,gBAAgB5nB,EAAcwrC,KAGjE5uD,EAAO+sC,UAAU3pB,EAAc6pC,GAAakC,EAAoBP,IAE3D,GAKTjE,EAAAroD,UAAA4rD,uBAAA,SAAuBhiD,GACrB,IAAIQ,EAAU5I,OAAOzD,KAAKusB,QAAQjN,eAAepe,IAAI2K,EAAY+b,wBAEjE,OADAnkB,OAAO4I,EAAQtF,MAAQ00C,EAAAz8B,YAAYyN,MAC9BzsB,KAAKovD,YAAkB/iD,GACfA,EADgC,MAI/Ci+C,EAAAroD,UAAAmtD,YAAA,SAAY/iD,WACV,GAAIA,EAAQtE,GAAGtB,EAAApE,YAAYqqD,UAAW,OAAO,EAC7CrgD,EAAQnE,IAAIzB,EAAApE,YAAYqqD,UAExB,IAAI/sD,EAASK,KAAKL,OAClBK,KAAKyqD,YAAcp+C,EACnB,IAAIgjD,EAAkC,KAClCC,GAAqB,EAEzB,GAAIjjD,EAAQ2D,YACV,IAAmB,IAAAqf,EAAAnL,EAAA7X,EAAQ2D,QAAQtC,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAAxC,IAAI9J,EAAMgK,EAAAhjB,MACb,GAAIgZ,EAAOvT,MAAQ00C,EAAAz8B,YAAY0N,UAA/B,CACA,IAAI6iC,GAAc,EACd/U,EAAiBlgC,EACjBk1C,EAAmBhV,EAAI3uC,YAC3B2uC,EAAItyC,IAAIzB,EAAApE,YAAYqqD,UACpB,IAAI6B,OAAQ,EACRiB,EAAiBluD,OACnBitD,EAAWvuD,KAAKkvD,kBACFM,EAAiBluD,MAC7Bkb,EAAAyE,KAAKG,IAAG,KAIN1E,EAAA2Y,gBAAgBk5B,IAAa7xC,EAAA4Y,aAAa+C,QACxChsB,EAAQtE,GAAGtB,EAAApE,YAAYgqB,QACzBkiC,EAAW5uD,EAAO8xC,qBAAqB8c,GACnC7xC,EAAA2Y,gBAAgBk5B,IAAa7xC,EAAA4Y,aAAa+C,QAC5Cr4B,KAAKuG,MACHgW,EAAAzY,eAAe2rD,0EACfD,EAAiBluD,MAAM8C,OAEzBmrD,GAAc,IAGhBA,GAAc,IAGQ,MAAjBF,EACTd,EAAW5uD,EAAO2nC,UAAU,IAExBgoB,GACFtvD,KAAKuG,MACHgW,EAAAzY,eAAe4rD,kCACfF,EAAiBprD,OAGrBmqD,EAAW5uD,EAAO0oC,aAAa3rB,EAAAwZ,SAASy5B,OACtChwD,EAAOopC,gBAAgBsmB,EAActsC,aAAY,GACjDpjB,EAAO2nC,UAAU,IAEnBinB,EAAW5uD,EAAO8xC,qBAAqB8c,GACnC7xC,EAAA2Y,gBAAgBk5B,IAAa7xC,EAAA4Y,aAAa+C,QACxChsB,EAAQtE,GAAGtB,EAAApE,YAAYgqB,QACzBrsB,KAAKuG,MACHgW,EAAAzY,eAAe2rD,0EACfD,EAAiBprD,OAGrBmrD,GAAc,IAGdA,GACF5vD,EAAO+sC,UAAU8N,EAAIz3B,aAAY,GAAkB,EAAMpjB,EAAO2nC,UAAU,IAC1EtnC,KAAKwrD,kBAAkB3lD,KAAKlG,EAAOgrC,gBAAgB6P,EAAIz3B,aAAcwrC,IACrEe,GAAqB,IAErB3vD,EAAO+sC,UAAU8N,EAAIz3B,aAAY,GAAmB1W,EAAQtE,GAAGtB,EAAApE,YAAYgqB,OAAQkiC,GACnFe,GAAqB,GAEvBD,EAA2B7U,qGAI/B,OADAx6C,KAAKyqD,YAAc,MACZ,GAMTH,EAAAroD,UAAA6rD,2BAAA,SACEjiD,EACAzD,GAEA,IAAIiE,EAAU5I,OAAOzD,KAAKusB,QAAQjN,eAAepe,IAAI2K,EAAY+b,wBAEjE,OADAnkB,OAAO4I,EAAQtF,MAAQ00C,EAAAz8B,YAAYgH,oBAC5BhmB,KAAK4vD,kCACSvjD,EACnBjE,EACAlF,EAAA2sD,UACA,KACoBxjD,EAASR,YAAYjL,OAK7C0pD,EAAAroD,UAAA2tD,kCAAA,SACE3tD,EACAmG,EACAslB,EACAY,EACAm/B,GAEA,IAAI5nC,EAAW7lB,KAAKwgB,SAASsvC,iCAC3B7tD,EACAmG,EACAslB,EACA+/B,GAEF,OAAK5nC,GACLA,EAASyI,WAAaA,EACjBtuB,KAAK+vD,gBAAgBlqC,GACnBA,EADqC,MAFtB,MAOxBykC,EAAAroD,UAAA0pD,mBAAA,SACErlC,EACAhd,EACA2lB,QAAA,IAAAA,MAAA,MAEA,IACI4X,EADAoX,EAAgB33B,EAAiBA,EAAehhB,OAAS,EAEzD8nB,EAAQ,EAQZ,GAPI6B,IACF4X,EAAa,IAAI1gC,MAAM,EAAI83C,IAChB,GAAKhvB,EAASgB,eACzB7C,EAAQ,GAERyZ,EAAa,IAAI1gC,MAAM83C,GAErB33B,EACF,IAAK,IAAIjmB,EAAI,EAAGA,EAAI49C,IAAiB59C,IAAK+sB,EACxCyZ,EAAWzZ,GAAS9G,EAAejmB,GAAG4vB,eAG1C,IAAI+/B,EAAa1mD,EAAW2mB,eACxBtwB,EAASK,KAAKL,OACd2tC,EAAU3tC,EAAOunC,2BAA2B8oB,EAAYnpB,GAC5D,IAAKyG,EAAS,CACZ,IAAI1sC,EAAO4b,EAAA+gC,UAAUe,oBAAoBh4B,EAAgBhd,EAAY2lB,GACrEqe,EAAU3tC,EAAOgnC,gBAAgB/lC,EAAMovD,EAAYnpB,GAErD,OAAOyG,GAITgd,EAAAroD,UAAA8tD,gBAAA,SAAgBlqC,GACd,GAAIA,EAAS9d,GAAGtB,EAAApE,YAAYqqD,UAAW,OAAO,EAC9CjpD,SAASoiB,EAAS9d,GAAGtB,EAAApE,YAAY8jB,UAAYN,EAAS6B,aAAa+zB,EAAAx8B,eAAe/I,WAClF2P,EAAS3d,IAAIzB,EAAApE,YAAYqqD,UAGzB,IAkBIv+B,EAlBAtiB,EAAcga,EAAS5jB,UAAU4J,YACjCqH,EAAOrH,EAAYqH,KACnBA,EACE2S,EAAS9d,GAAGtB,EAAApE,YAAY8jB,UAC1BnmB,KAAKuG,MACHgW,EAAAzY,eAAemsD,yDACfpkD,EAAYjL,KAAKwD,OAIhByhB,EAAS9d,GAAGtB,EAAApE,YAAY8jB,UAC3BnmB,KAAKuG,MACHgW,EAAAzY,eAAeosD,gFACfrkD,EAAYjL,KAAKwD,OAMvB,IAAI6O,EAAY4S,EAAS5S,UACrBq6B,EAAUttC,KAAK2rD,mBAAmB14C,EAAUqT,eAAgBrT,EAAU3J,WAAY2J,EAAUgc,UAC5FtvB,EAASK,KAAKL,OAClB,GAAIuT,EAAM,CACR,IAAIi9C,EAAgBtqC,EAAS9d,GAAGtB,EAAApE,YAAYsV,aACxCrO,EAAauc,EAAS5S,UAAU3J,WAGhC6kD,EAAmBnuD,KAAK6yB,gBAC5B7yB,KAAK6yB,gBAAkBhN,EACvB,IAAI8J,EAAO9J,EAAS8J,KAChB/lB,OAAI,EACR,GAAIsJ,EAAKnM,MAAQ0V,EAAA5V,SAASoU,WACxBxX,QAAQoiB,EAAS5d,MAAMxB,EAAApE,YAAYsV,YAAclR,EAAApE,YAAYomB,IAAMhiB,EAAApE,YAAYqmB,IAAMjiB,EAAApE,YAAY+jB,OACjG3iB,OAAOoiB,EAAS9d,GAAGtB,EAAApE,YAAYyK,QAC/BlD,EAAO5J,KAAKkvD,kBACYh8C,EAAMjI,WAC5B3B,EAAU,KAIZqmB,EAAKznB,IAAG,GACHynB,EAAKyF,YAAYxrB,EAAMN,IAAaqmB,EAAKznB,IAAG,GACjDynB,EAAKc,eACA,CACLhtB,OAAOyP,EAAKnM,MAAQ0V,EAAA5V,SAAS8R,OAC7B,IAAIy3C,EAAQpwD,KAAKqwD,kBAAmCn9C,EAAM3D,YAiB1D,GAhBIsW,EAAS9d,GAAGtB,EAAApE,YAAY+jB,QAC1BzmB,EAAO+sC,UAAU,WAAU,GAAkB,EAAM/sC,EAAO2nC,UAAU,IACpE8oB,EAAME,QACJ3wD,EAAO2rC,SACL3rC,EAAOuoC,YACLxrB,EAAA0c,QAAQC,OACR15B,EAAOopC,gBAAgB,WAAU,IAEnCppC,EAAOkrC,YAAY,MACjBlrC,EAAOwsC,WAAW,QAAS,KAAI,GAC/BxsC,EAAOgrC,gBAAgB,WAAYhrC,EAAO2nC,UAAU,SAK5D3X,EAAKc,WACD0/B,EAAe,CACjB,IAAItD,EAAiB7sD,KAAKghB,QAAQ6rC,eAIlC,GAHAppD,OAAOoiB,EAAS9d,GAAGtB,EAAApE,YAAY0sB,YAG1BY,EAAK5nB,GAAE,GAGV,GAAI4nB,EAAK5nB,GAAE,IACTqoD,EAAMvqD,KAAKlG,EAAOgpC,eAAe,EAAGkkB,QAG/B,CACL,IAAIjlD,EAASnE,OAAOoiB,EAASje,QAC7BnE,OAAOmE,EAAOb,MAAQ00C,EAAAz8B,YAAYvH,OAClC24C,EAAMvqD,KAAKlG,EAAOkpC,eAAe,EAC/B7oC,KAAKuwD,wBAA+B3oD,EAAQiE,EAAYjL,cAMrD0I,GAAckT,EAAAyE,KAAKc,MAAS4N,EAAK5nB,GAAE,IAC5C/H,KAAKuG,MACHgW,EAAAzY,eAAe0sD,+DACf3kD,EAAYoH,UAAU3J,WAAWlF,OAGrCwF,EAAQwmD,EAAM9qD,OAEM,GAAhB8qD,EAAM9qD,OACJ8qD,EAAM,GACNzwD,EAAOkrC,YAAY,KAAMulB,EAAO9mD,EAAW2mB,gBAH7CtwB,EAAO6rC,YAgBb,GAXAxrC,KAAK6yB,gBAAkBs7B,EAGvBhgC,EAAMxuB,EAAOotC,YACXlnB,EAAS9C,aACTuqB,EACA9wB,EAAA2gC,mBAAmBt3B,EAASmI,kBAC5BpkB,GAIEic,EAAS6B,aAAa+zB,EAAAx8B,eAAe9I,UAAW,CAClD,IAAIkG,EAAY5Y,OAAOgZ,EAAAL,cAAcK,EAAA1G,cAAcI,SAAUtK,EAAYoE,aACzEjQ,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf5L,EAAUjY,aAKdyhB,EAAS3d,IAAIzB,EAAApE,YAAY0sD,eACzBC,EAAiBnpC,EAAUha,GAG3BsiB,EAAMxuB,EAAOyuC,kBACXvoB,EAAS9C,aACTqnC,EACAC,EACA/c,GAKJ,OADAznB,EAAS4K,SAAS9wB,EAAQwuB,IACnB,GAKTm8B,EAAAroD,UAAA8rD,4BAAA,SAA4BliD,GAG1B,IAFA,IAAImE,EAAUnE,EAAYmE,QACtBmS,EAAgBniB,KAAKghB,QAAQmB,cACxB9hB,EAAI,EAAGwK,EAAImF,EAAQ1K,OAAQjF,EAAIwK,IAAKxK,EAAG,CAC9C,IAAIia,EAAStK,EAAQ3P,GACrB,OAAQia,EAAOvT,MACb,KAAK0V,EAAA5V,SAASsT,kBAETgI,IAAiB7H,EAAOvS,GAAGtB,EAAApE,YAAY4X,SACpBK,EAAQqzC,WAE5B3tD,KAAK4tD,wBAA0CtzC,MAEjD,MAEF,KAAKmC,EAAA5V,SAAS2U,sBAET2G,IAAiB7H,EAAOvS,GAAGtB,EAAApE,YAAY4X,SAChBK,EAAQqzC,WAEhC3tD,KAAKywD,4BAAkDn2C,MAEzD,MAEF,KAAKmC,EAAA5V,SAASgU,iBACRsH,GAAiB7H,EAAOvS,GAAGtB,EAAApE,YAAY4X,UACzCja,KAAK6tD,uBAAwCvzC,GAE/C,MAEF,KAAKmC,EAAA5V,SAAS+R,qBAETuJ,IAAiB7H,EAAOvS,GAAGtB,EAAApE,YAAY4X,SACjBK,EAAQqzC,WAE/B3tD,KAAK8tD,2BAAgDxzC,MAEvD,MAEF,KAAKmC,EAAA5V,SAASmT,sBACRmI,GAAiB7H,EAAOvS,GAAGtB,EAAApE,YAAY4X,UACzCja,KAAK+tD,4BAAkDzzC,GAEzD,MAEF,KAAKmC,EAAA5V,SAASkT,SACZ,GAAIoI,GAAiB7H,EAAOvS,GAAGtB,EAAApE,YAAY4X,QAAS,CAClD,IAAI+zC,EAAehuD,KAAKiuD,yBAA4C3zC,GAAQ,GACxE0zC,GAAchuD,KAAKwrD,kBAAkB3lD,KAAKmoD,GAEhD,MAEF,QAASvqD,QAAO,MAKtB6mD,EAAAroD,UAAAyuD,iBAAA,SAAiBhvD,WACf,GAAKA,EAAGsO,QAAR,CAEA,IAAImS,EAAgBniB,KAAKghB,QAAQmB,kBACjC,IAAoB,IAAAkN,EAAAnL,EAAAxiB,EAAGsO,QAAQtC,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAApC,IAAI/X,EAAOiY,EAAAhjB,MACd,OAAQ+K,EAAQtF,MACd,KAAK00C,EAAAz8B,YAAYmG,iBAGXhD,IACiB9V,EAAStE,GAAGtB,EAAApE,YAAY4X,SACpB5N,EAAStE,GAAGtB,EAAApE,YAAY6jB,UAE/ClmB,KAAK2wD,+BACatkD,KAEhBnJ,EAAA2sD,WAGJ,MAEF,KAAKpU,EAAAz8B,YAAYyN,KACfzsB,KAAKovD,YAAkB/iD,GACvB,MAEF,KAAKovC,EAAAz8B,YAAYgH,mBACf,IAEI7D,GAAqC9V,EAAStE,GAAGtB,EAAApE,YAAY4X,WACrC5N,EAAStE,GAAGtB,EAAApE,YAAY6jB,SAClD,CACA,GAAI7Z,EAAQqb,aAAa+zB,EAAAx8B,eAAe/I,SAAU,MAClDlW,KAAK4vD,kCACgBvjD,KAEnBnJ,EAAA2sD,UACA,KACoBxjD,EAASR,YAAYjL,MAG7C,MAEF,KAAK66C,EAAAz8B,YAAY5I,OACfpW,KAAKsuD,cAAsBjiD,GAC3B,MAEF,KAAKovC,EAAAz8B,YAAYwN,UACfxsB,KAAK0wD,iBAA4BrkD,yGASzCi+C,EAAAroD,UAAAisD,uBAAA,SAAuB59C,GACrB,IAAIoP,EAAmB1f,KAAKusB,QAAQ7M,iBAChC1P,EAAUM,EAAUN,QACxB,GAAKA,EACL,IAAK,IAAI3P,EAAI,EAAGwK,EAAImF,EAAQ1K,OAAQjF,EAAIwK,IAAKxK,EAAG,CAC9C,IAAIia,EAAStK,EAAQ3P,GACjBgM,EAAUqT,EAAiBxe,IAC7BoP,EAAUlM,MAAMU,OAAOsM,aAAe3K,EAAAnE,eAAiBgY,EAAO/I,aAAanM,MAE7E,GAAKiH,EACL,OAAQA,EAAQtF,MACd,KAAK00C,EAAAz8B,YAAYmG,gBACO9Y,EAAStE,GAAGtB,EAAApE,YAAY6jB,UAC5ClmB,KAAK2wD,+BACatkD,KAEhBnJ,EAAA2sD,WAGJ,MAEF,KAAKpU,EAAAz8B,YAAYyN,KACfzsB,KAAKovD,YAAkB/iD,GACvB,MAEF,KAAKovC,EAAAz8B,YAAYgH,oBAEQ3Z,EAAStE,GAAGtB,EAAApE,YAAY6jB,UAC7C5V,EAAUlM,MAAMU,OAAOsjB,SAEvBpoB,KAAK4vD,kCACgBvjD,KAEnBnJ,EAAA2sD,UACA,KACoBxjD,EAASR,YAAYjL,MAG7C,MAEF,KAAK66C,EAAAz8B,YAAY5I,OACfpW,KAAKsuD,cAAsBjiD,GAC3B,MAEF,KAAKovC,EAAAz8B,YAAYwN,UACfxsB,KAAK0wD,iBAA4BrkD,MASzCi+C,EAAAroD,UAAA2rD,wBAAA,SACE/hD,EACAzD,GAEA,IAAIiE,EAAU5I,OAAOzD,KAAKusB,QAAQjN,eAAepe,IAAI2K,EAAY+b,wBACjEnkB,OAAO4I,EAAQtF,MAAQ00C,EAAAz8B,YAAYmG,iBACnCnlB,KAAK2wD,+BACatkD,EAChBjE,EACAlF,EAAA2sD,UACAhkD,IAIJy+C,EAAAroD,UAAA0uD,+BAAA,SACE1uD,EACAmG,EACAslB,EACAkjC,QAAA,IAAAA,MAAA,MAEA,IAAI/qC,EAAW7lB,KAAKwgB,SAASqwC,8BAC3B5uD,EACAmG,EACAslB,EACAkjC,GAAyB3uD,EAAU4J,aAEhCga,GACL7lB,KAAK8wD,aAAajrC,IAGpBykC,EAAAroD,UAAA6uD,aAAA,SAAajrC,eACX,GAAIA,EAAS9d,GAAGtB,EAAApE,YAAYqqD,UAAW,OAAO,EAC9C7mC,EAAS3d,IAAIzB,EAAApE,YAAYqqD,UAEzB,IAAIqE,EAAgBlrC,EAAS5jB,UAAU+N,QACvC,GAAI+gD,MACF,IAAoB,IAAAzsC,EAAAJ,EAAA6sC,EAAcrjD,UAAQ+X,EAAAnB,EAAAF,QAAAqB,EAAApB,KAAAoB,EAAAnB,EAAAF,OAAE,CAC1C,QADO/X,EAAOoZ,EAAAnkB,OACEyF,MACd,KAAK00C,EAAAz8B,YAAY5I,OACfpW,KAAKsuD,cAAsBjiD,GAC3B,MAEF,KAAKovC,EAAAz8B,YAAYgH,mBAEQ3Z,EAAStE,GAAGtB,EAAApE,YAAY6jB,UAE7ClmB,KAAK4vD,kCACgBvjD,KAEnBnJ,EAAA2sD,UACA,KACoBxjD,EAASR,YAAYjL,MAG7C,MAEF,KAAK66C,EAAAz8B,YAAYuL,UACX1pB,EAAoBwL,EAASme,kBAE/BxqB,KAAK4vD,kCACH/uD,KAEAqC,EAAA2sD,UACA,KACAhvD,EAAOgL,YAAYjL,OAGnB+rD,EAAoBtgD,EAASoe,kBAE/BzqB,KAAK4vD,kCACHjD,KAEAzpD,EAAA2sD,UACA,KACAlD,EAAO9gD,YAAYjL,yGAQ/B,IAAIowD,EAAenrC,EAAS4L,oBACxBu/B,GAAchxD,KAAK+vD,gBAAgBiB,GACvC,IAAI7nC,EAAkBtD,EAAS7V,QAC/B,GAAImZ,MACF,IAAoB,IAAA8nC,EAAA/sC,EAAAiF,EAAgBzb,UAAQy+C,EAAA8E,EAAA7sC,QAAA+nC,EAAA9nC,KAAA8nC,EAAA8E,EAAA7sC,OAAE,CAAzC,IAAI/X,EACP,QADOA,EAAO8/C,EAAA7qD,OACEyF,MACd,KAAK00C,EAAAz8B,YAAYgH,mBAEQ3Z,EAAStE,GAAGtB,EAAApE,YAAY6jB,UAE7ClmB,KAAK4vD,kCACgBvjD,KAEnBnJ,EAAA2sD,QAAqBhqC,EAAS6H,yBAC9B,KACoBrhB,EAASR,YAAYjL,MAG7C,MAEF,KAAK66C,EAAAz8B,YAAYoS,MACf/kB,EAAQnE,IAAIzB,EAAApE,YAAYqqD,UACxB,MAEF,KAAKjR,EAAAz8B,YAAYuL,SACf,IAAI1pB,EAUA8rD,GAVA9rD,EAAoBwL,EAASme,kBAE/BxqB,KAAK4vD,kCACH/uD,KAEAqC,EAAA2sD,QAAqBhqC,EAAS6H,yBAC9B,KACA7sB,EAAOgL,YAAYjL,OAGnB+rD,EAAoBtgD,EAASoe,kBAE/BzqB,KAAK4vD,kCACHjD,KAEAzpD,EAAA2sD,QAAqBhqC,EAAS6H,yBAC9B,KACAi/B,EAAO9gD,YAAYjL,yGAQ/B,OAAO,GAGT0pD,EAAAroD,UAAAwuD,4BAAA,SACE5kD,EACAzD,EACAslB,EACAkjC,QADA,IAAAljC,MAAA,WACA,IAAAkjC,MAAA,MAGA5wD,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfpc,EAAYzH,QAOhBkmD,EAAAroD,UAAAivD,iBAAA,SAAiBxrB,EAAoByrB,QAAA,IAAAA,MAAA,GACnC,IAAI9/B,EAAeu6B,UAAU5rD,KAAKqxB,aAAc8/B,GAC5CvrB,EAAUlpB,EAAA+oB,cAAc9jC,OAAO+jC,EAAQrU,GAG3C,OAFArxB,KAAK2qD,eAAe9kD,KAAK+/B,GACzB5lC,KAAKqxB,aAAe+2B,QAAQ/2B,EAAcpP,QAAQyjB,EAAOpgC,OAAQ,IAC1DsgC,GAMT0kB,EAAAroD,UAAAmvD,yBAAA,SAAyBhhB,GAEvB,GADA3sC,OAAO2sC,EAAKroC,GAAGtB,EAAApE,YAAYqqD,WACvBtc,EAAKhiB,oBAAsB,EAC7B,OAAOgiB,EAAKhiB,mBAEd,IAAIy8B,EAAgB7qD,KAAK6qD,cACrBz9B,EAAQy9B,EAAcvlD,OAO1B,OANK8qC,EAAKroC,GAAGtB,EAAApE,YAAYgvD,aAAejhB,EAAKn9B,UAAUyqC,mBAAqBtN,EAAKn9B,UAAUqT,eAAehhB,SAExG8qC,EAAOpwC,KAAKwsD,iBAAiBpc,IAE/Bya,EAAchlD,KAAKuqC,EAAKrtB,cACxBqtB,EAAKhiB,mBAAqBhB,EACnBA,GAKTk9B,EAAAroD,UAAAmsD,iBAAA,SAAiB99C,GACf,IACI1G,EADAjK,EAASK,KAAKL,OAElB,OAAQ2Q,EAAUvJ,MAChB,KAAK0V,EAAA5V,SAAS8R,MACZ/O,EAAO5J,KAAKsxD,sBAAsChhD,GAClD,MAEF,KAAKmM,EAAA5V,SAAS4T,MACZ7Q,EAAO5J,KAAKuxD,sBAAsCjhD,GAClD,MAEF,KAAKmM,EAAA5V,SAAS6T,SACZ9Q,EAAO5J,KAAKwxD,yBAA4ClhD,GACxD,MAEF,KAAKmM,EAAA5V,SAAS8T,GACZ/Q,EAAO5J,KAAKyxD,mBAAgCnhD,GAC5C,MAEF,KAAKmM,EAAA5V,SAAS+T,MACZhR,EAAO5J,KAAK0xD,sBAAsCphD,GAClD,MAEF,KAAKmM,EAAA5V,SAASoU,WACZrR,EAAO5J,KAAK2xD,2BAAgDrhD,GAC5D,MAEF,KAAKmM,EAAA5V,SAASuU,IACZxR,EAAO5J,KAAK4xD,oBAAkCthD,GAC9C,MAEF,KAAKmM,EAAA5V,SAASwU,GACZzR,EAAO5J,KAAK6xD,mBAAgCvhD,GAC5C,MAEF,KAAKmM,EAAA5V,SAAS4U,OACZ7R,EAAO5J,KAAK8xD,uBAAwCxhD,GACpD,MAEF,KAAKmM,EAAA5V,SAAS8U,OACZ/R,EAAO5J,KAAK+xD,uBAAwCzhD,GACpD,MAEF,KAAKmM,EAAA5V,SAAS+U,MACZhS,EAAO5J,KAAKgyD,sBAAsC1hD,GAClD,MAEF,KAAKmM,EAAA5V,SAASgV,IACZjS,EAAO5J,KAAKiyD,oBAAkC3hD,GAC9C,MAEF,KAAKmM,EAAA5V,SAASkT,UACZnQ,EAAO5J,KAAKiuD,yBAA4C39C,MAC7C1G,EAAOjK,EAAO6rC,aACzB,MAEF,KAAK/uB,EAAA5V,SAASmV,KACZpS,EAAO5J,KAAKkyD,qBAAoC5hD,GAChD,MAEF,KAAKmM,EAAA5V,SAASoV,MACZrS,EAAO5J,KAAKmyD,sBAAsC7hD,GAClD,MAEF,KAAKmM,EAAA5V,SAASiV,gBAGZ,GAAI9b,KAAK6yB,iBAAmB7yB,KAAKurD,sBAC/B,OAAO5rD,EAAO6rC,YAIlB,QACE/nC,QAAO,GACPmG,EAAOjK,EAAO6sC,oBAIlB,OADIxsC,KAAKghB,QAAQ0P,WAAW1wB,KAAKoyD,iBAAiBxoD,EAAM0G,EAAUlM,OAC3DwF,GAGT0gD,EAAAroD,UAAAouD,kBAAA,SAAkB9gD,GAChB,IAAI8iD,EAAgB9iD,EAAWjK,OAC3B8qD,EAAQ,IAAIjqD,MAAqBksD,GACrCjC,EAAM9qD,OAAS,EAEf,IADA,IAAIqqB,EAAO3vB,KAAK6yB,gBAAgBlD,KACvBtvB,EAAI,EAAGA,EAAIgyD,IAAiBhyD,EAAG,CACtC,IAAIuJ,EAAO5J,KAAKouD,iBAAiB7+C,EAAWlP,IAC5C,OAAQqc,EAAA2Y,gBAAgBzrB,IACtB,KAAK8S,EAAA4Y,aAAa8E,MAChB,IAAK1d,EAAA2d,aAAazwB,GAAO,CACvB,IAAK,IAAIqZ,EAAI,EAAGpY,EAAI6R,EAAA4d,mBAAmB1wB,GAAOqZ,EAAIpY,IAAKoY,EAAGmtC,EAAMvqD,KAAK6W,EAAA8d,cAAc5wB,EAAMqZ,IACzF,MAIJ,QAASmtC,EAAMvqD,KAAK+D,GACpB,KAAK8S,EAAA4Y,aAAag9B,KAEpB,GAAI3iC,EAAK1nB,MAAK,IAA6B,CACrCyU,EAAA2+B,yBAAyBzxC,IAAOwmD,EAAMvqD,KAAK7F,KAAKL,OAAO6sC,qBAC3D,OAGJ,OAAO4jB,GAGT9F,EAAAroD,UAAAqvD,sBAAA,SAAsBhhD,GACpB,IAAIf,EAAae,EAAUf,WACvBujB,EAAa9yB,KAAK6yB,gBAAgBlD,KAClCA,EAAOmD,EAAWO,OACtBrzB,KAAK6yB,gBAAgBlD,KAAOA,EAE5B,IAAIygC,EAAQpwD,KAAKqwD,kBAAkB9gD,GAC/B3F,EAAuB,GAAhBwmD,EAAM9qD,OACbtF,KAAKL,OAAO6rC,YACI,GAAhB4kB,EAAM9qD,OACJ8qD,EAAM,GACNpwD,KAAKL,OAAOkrC,YAAY,KAAMulB,EAAM1zC,EAAAgd,kBAAkB02B,EAAMA,EAAM9qD,OAAS,KAIjF,OAFAtF,KAAK6yB,gBAAgBlD,KAAOA,EAAK6D,OACjCV,EAAW6B,QAAQhF,GACZ/lB,GAGT0gD,EAAAroD,UAAAsvD,sBAAA,SAAsBjhD,GACpB,IAAI3Q,EAASK,KAAKL,OAClB,GAAI2Q,EAAUZ,MAKZ,OAJA1P,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf3X,EAAUZ,MAAMtL,OAEXzE,EAAO6sC,oBAEhB,IAAI7c,EAAO3vB,KAAK6yB,gBAAgBlD,KAC5BqD,EAAarD,EAAKqD,WACtB,OAAkB,MAAdA,GACFhzB,KAAKuG,MACHgW,EAAAzY,eAAeyuD,qFACfjiD,EAAUlM,OAELzE,EAAO6sC,sBAEhB7c,EAAKznB,IAAG,GACDvI,EAAOqrC,YAAYhY,KAG5Bs3B,EAAAroD,UAAAuvD,yBAAA,SAAyBlhD,GACvB,IAAI3Q,EAASK,KAAKL,OACd+P,EAAQY,EAAUZ,MACtB,GAAIA,EAKF,OAJA1P,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfvY,EAAMtL,OAEDzE,EAAO6sC,oBAGhB,IAAI7c,EAAO3vB,KAAK6yB,gBAAgBlD,KAC5BoD,EAAgBpD,EAAKoD,cACzB,OAAqB,MAAjBA,GACF/yB,KAAKuG,MACHgW,EAAAzY,eAAe0uD,8EACfliD,EAAUlM,OAELzE,EAAO6sC,sBAEhB7c,EAAKznB,IAAG,IACDvI,EAAOqrC,YAAYjY,KAG5Bu3B,EAAAroD,UAAAwvD,mBAAA,SAAmBnhD,GACjB,IAAIuiB,EAAkB7yB,KAAK6yB,gBACvBlzB,EAASK,KAAKL,OAEd+P,EAAQmjB,EAAgBvC,oBACxBwC,EAAaD,EAAgBlD,KAC7BA,EAAOmD,EAAWO,OACtBR,EAAgBlD,KAAOA,EACvB,IAAIqD,EAAa,SAAWtjB,EAC5BigB,EAAKqD,WAAaA,EAClB,IAAID,EAAgB,YAAcrjB,EAClCigB,EAAKoD,cAAgBA,EAErB,IAAI7f,EAAOlT,KAAKouD,iBAAiB99C,EAAUA,WACvCmiD,EAAWzyD,KAAK0yD,cAClB1yD,KAAKkvD,kBAAkB5+C,EAAUjC,UAAWmO,EAAAyE,KAAKG,IAAG,KACpDphB,KAAK0qD,aAKP73B,EAAgBlD,KAAOA,EAAK6D,OAC5BX,EAAgBrC,oBAChB,IAAImiC,EAAahjC,EAAK1nB,MAAK,IAC3B0nB,EAAKyD,MACH,KAKFN,EAAW6B,QAAQhF,GAEnB,IAAIijC,GACFjzD,EAAOyrC,WAAWrY,EAChB4/B,EACIz/C,EACAvT,EAAOkrC,YAAY,MACjB33B,EACAvT,EAAOqrC,YAAYjY,EAAe0/B,IACnC,KAIT,OADIE,GAAYC,EAAM/sD,KAAKlG,EAAO6sC,qBAC3B7sC,EAAOkrC,YAAY7X,EAAY4/B,IAGxCtI,EAAAroD,UAAAyvD,sBAAA,SAAsBphD,GACpB,OAAOtQ,KAAKL,OAAO6rC,aAGrB8e,EAAAroD,UAAA0vD,2BAAA,SAA2BrhD,GACzB,IAAIjG,EAAOrK,KAAKkvD,kBAAkB5+C,EAAUrF,WAAYuR,EAAAyE,KAAKc,KAAI,KAKjE,OAJI/hB,KAAK0qD,aAAeluC,EAAAyE,KAAKc,OAC3B1X,EAAOrK,KAAKL,OAAOurC,WAAW7gC,GAC9BrK,KAAK0qD,YAAcluC,EAAAyE,KAAKc,MAEnB1X,GAGTigD,EAAAroD,UAAA2vD,oBAAA,SAAoBthD,GAGlB,IAAIuiB,EAAkB7yB,KAAK6yB,gBACvBnjB,EAAQmjB,EAAgBvC,oBACxBwC,EAAaD,EAAgBlD,KAC7BA,EAAOmD,EAAWO,OACtBR,EAAgBlD,KAAOA,EACvB,IAAIqD,EAAarD,EAAKqD,WAAa,SAAWtjB,EAC9CigB,EAAKqD,WAAaA,EAClB,IAAID,EAAgB,YAAcrjB,EAClCigB,EAAKoD,cAAgBA,EACrB,IAAI8/B,EAAc,UAAYnjD,EAG1B/P,EAASK,KAAKL,OACd4uD,EAAWj+C,EAAUrH,YACrBjJ,KAAKouD,iBAA4B99C,EAAUrH,aAC3C,EACAwpD,EAA0B,EAC1BK,GAAa,EACjB,GAAIxiD,EAAUjC,UAAW,CACvBokD,EAAWzyD,KAAK0yD,cACd1yD,KAAK4uD,4BAAwCt+C,EAAUjC,UAAWmO,EAAAyE,KAAKW,KAAI,GAC3E5hB,KAAK0qD,aAGP,IAAIqI,EAAUpzD,EAAO8xC,qBAAqBghB,GACtC/1C,EAAA2Y,gBAAgB09B,IAAYr2C,EAAA4Y,aAAa+C,QAC3C50B,OAAiC,GAA1BiZ,EAAAgd,kBAAkBq5B,IACQ,GAA7Br2C,EAAA4b,iBAAiBy6B,KAAeD,GAAa,IAKnDL,EAAWzyD,KAAK0yD,cACd1yD,KAAK4uD,4BAAwCt+C,EAAUjC,UAAWmO,EAAAyE,KAAKW,KAAI,GAC3E5hB,KAAK0qD,kBAIP+H,EAAW9yD,EAAO2nC,UAAU,GAC5BwrB,GAAa,EAEf,IAAIE,EAAW1iD,EAAUwC,YACrB9S,KAAKkvD,kBAA8B5+C,EAAUwC,YAAa0J,EAAAyE,KAAKc,KAAI,KACnE,EACAkxC,EAAgB3iD,EAAUA,UAC1B4iD,EAAWD,EAAclsD,MAAQ0V,EAAA5V,SAAS8R,OAA8D,GAApCs6C,EAAe1jD,WAAWjK,OAC9FtF,KAAKouD,iBAAkC6E,EAAe1jD,WAAW,IACjEvP,KAAKouD,iBAAiB6E,GAG1BpgC,EAAgBlD,KAAOA,EAAK6D,OAC5BX,EAAgBrC,oBAChB,IAAI2iC,EAAexjC,EAAK1nB,MAAM,KAC9B0nB,EAAKyD,MACH,KAKE0/B,EAAYhgC,EAAW6B,QAAQhF,GAC9BmD,EAAW+B,mBAAmBlF,GAEnC,IAAIyjC,EAAa,IAAIjtD,MACjBooD,GAAU6E,EAAWvtD,KAAK0oD,GAE9B,IAAI8E,EAAc,IAAIltD,MAuBtB,OAtBIgtD,EACFE,EAAYxtD,KACVlG,EAAOkrC,YAAY9X,GACjBpzB,EAAOqrC,YAAYhY,EAAYrzB,EAAOuoC,YAAYxrB,EAAA0c,QAAQC,OAAQo5B,IAClES,GACD,KAGHG,EAAYxtD,KACVlG,EAAOqrC,YAAYhY,EAAYrzB,EAAOuoC,YAAYxrB,EAAA0c,QAAQC,OAAQo5B,KAEpEY,EAAYxtD,KAAKqtD,IAEfF,GAAUK,EAAYxtD,KAAKmtD,GAC/BK,EAAYxtD,KACVlG,EAAOqrC,YAAY6nB,IAGrBO,EAAWvtD,KACTlG,EAAOyrC,WAAWynB,EAAalzD,EAAOkrC,YAAY,KAAMwoB,EAAW,KAG9D1zD,EAAOkrC,YAAY7X,EAAYogC,IAGxC9I,EAAAroD,UAAA4vD,mBAAA,SAAmBvhD,GACjB,IAAI3Q,EAASK,KAAKL,OACdkzB,EAAkB7yB,KAAK6yB,gBACvB/gB,EAASxB,EAAUwB,OACnBC,EAAUzB,EAAUyB,QAGpB0gD,EAAWzyD,KAAK0yD,cAClB1yD,KAAK4uD,4BAA4Bt+C,EAAUjC,UAAWmO,EAAAyE,KAAKW,KAAI,GAC/D5hB,KAAK0qD,aAGP,IACG1qD,KAAKghB,QAAQmB,eACdniB,KAAK6yB,gBAAgB5qB,MAAMxB,EAAApE,YAAY6jB,QAAUzf,EAAApE,YAAYixD,iBAC7D,CAEA,IAAIC,EAAkB5zD,EAAO8xC,qBAAqBghB,GAClD,GACE/1C,EAAA2Y,gBAAgBk+B,IAAoB72C,EAAA4Y,aAAa+C,OACf,GAAlC3b,EAAAgd,kBAAkB65B,GAElB,OAAO72C,EAAA4b,iBAAiBi7B,GACpBvzD,KAAKouD,iBAAiBt8C,GACtBC,EACE/R,KAAKouD,iBAAiBr8C,GACtBpS,EAAO6rC,YAIbinB,EAAWzyD,KAAK0yD,cACd1yD,KAAK4uD,4BAA4Bt+C,EAAUjC,UAAWmO,EAAAyE,KAAKW,KAAI,GAC/D5hB,KAAK0qD,aAMX,IAAI53B,EAAaD,EAAgBlD,KAC7B6jC,EAAa1gC,EAAWO,OAC5BR,EAAgBlD,KAAO6jC,EACvB,IAAIC,EAAazzD,KAAKouD,iBAAiBt8C,GACvC+gB,EAAgBlD,KAAO6jC,EAAWhgC,OAElC,IAAIkgC,EAA6B,EACjC,GAAI3hD,EAAS,CACX,IAAI4hD,EAAc7gC,EAAWO,OAC7BR,EAAgBlD,KAAOgkC,EACvBD,EAAc1zD,KAAKouD,iBAAiBr8C,GACpC8gB,EAAgBlD,KAAOgkC,EAAYngC,OACnCV,EAAWgC,cAAc0+B,EAAYG,QAErC7gC,EAAW+B,mBAAmB2+B,GAEhC,OAAO7zD,EAAO2rC,SAASmnB,EAAUgB,EAAYC,IAG/CpJ,EAAAroD,UAAA6vD,uBAAA,SAAuBxhD,GACrB,IAAI3Q,EAASK,KAAKL,OACdkzB,EAAkB7yB,KAAK6yB,gBACvBxoB,EAAsB,EACtBslB,EAAOkD,EAAgBlD,KAK3B,GAFAA,EAAKznB,IAAG,GAEJoI,EAAUhP,MAAO,CACnB,IAAIgI,EAAaqmB,EAAKrmB,WACtB,GAAIA,GAAckT,EAAAyE,KAAKc,KAOrB,OANA/hB,KAAK4uD,4BAA4Bt+C,EAAUhP,MAAOgI,EAAU,GAC5DtJ,KAAKuG,MACHgW,EAAAzY,eAAe+qD,mCACfv+C,EAAUhP,MAAM8C,MAAOpE,KAAK0qD,YAAY7lD,WAAYyE,EAAWzE,YAEjE7E,KAAK0qD,YAAcluC,EAAAyE,KAAKc,KACjBpiB,EAAO6sC,oBAEhBniC,EAAOrK,KAAKkvD,kBACV5+C,EAAUhP,MACVgI,EAAU,EAEVupB,EAAgB9qB,GAAGtB,EAAApE,YAAY6lB,eAC5B,EACA,GAIAyH,EAAKyF,YAAY/qB,EAAMf,IAAaqmB,EAAKznB,IAAG,GAInD,OAAIuU,EAAA/D,gBAAgBpI,GAAmBjG,GAAc1K,EAAO6rC,YAGrD7b,EAAK5nB,GAAE,MACVpI,EAAOqrC,YAAYvnC,OAAOksB,EAAKsD,aAAc,EAAG5oB,GAChD1K,EAAO+rC,aAAarhC,IAG1BigD,EAAAroD,UAAA8vD,uBAAA,SAAuBzhD,GACrB,IAAI3Q,EAASK,KAAKL,OACdkzB,EAAkB7yB,KAAK6yB,gBAEvB9e,EAAQzD,EAAUyD,MAClB6/C,EAAW7/C,EAAMzO,OACrB,IAAKsuD,EACH,OAAO5zD,KAAKkvD,kBAAkB5+C,EAAUjC,UAAWmO,EAAAyE,KAAKc,KAAI,KAI9D,IAAI8xC,EAAUhhC,EAAgBvC,oBAC1BwC,EAAaD,EAAgBlD,KAG7BmkC,EAAYjhC,EAAgB/C,aAAatT,EAAAyE,KAAKQ,KAAK,GACnDsyC,EAAiBD,EAAU1mC,MAG3B4mC,EAAS,IAAI7tD,MAAqB,EAAIytD,GAC1CI,EAAO,GAAKr0D,EAAO8qC,eACjBspB,EACA/zD,KAAKkvD,kBAAkB5+C,EAAUjC,UAAWmO,EAAAyE,KAAKQ,IAAG,MAMtD,IAFA,IAAIwyC,EAAa,EACbC,GAAgB,EACX7zD,EAAI,EAAGA,EAAIuzD,IAAYvzD,EAAG,CACjC,IACIqP,EADQqE,EAAM1T,GACAqP,MACdA,EACFskD,EAAOC,KAAgBt0D,EAAOqrC,YAAY,OAAS3qC,EAAEwE,SAAS,IAAM,IAAMgvD,EACxEl0D,EAAO0oC,aAAa3rB,EAAAwZ,SAASC,MAC3Bx2B,EAAOgpC,eAAeorB,EAAc,GACpC/zD,KAAKkvD,kBAAkBx/C,EAAO8M,EAAAyE,KAAKQ,IAAG,OAI1CyyC,EAAe7zD,EAInBwyB,EAAgBzC,cAAc0jC,GAG9BE,EAAOC,GAAct0D,EAAOqrC,aAAakpB,GAAgB,EACnD,OAASA,EAAarvD,SAAS,IAC/B,SACA,IAAMgvD,GAGZ,IAAIM,EAAex0D,EAAOkrC,YAAY,SAAWgpB,EAASG,EAAM,GAC5DI,GAAgB,EAChBC,GAAuB,EACvBC,GAAe,EACfC,GAAkB,EACtB,IAASl0D,EAAI,EAAGA,EAAIuzD,IAAYvzD,EAAG,CACjC,IACIkP,EADQwE,EAAM1T,GACKkP,WACnB8iD,EAAgB9iD,EAAWjK,OAG3BqqB,EAAOmD,EAAWO,OACtBR,EAAgBlD,KAAOA,EACvB,IAAIqD,EAAa,SAAW6gC,EAC5BlkC,EAAKqD,WAAaA,EAElB,IAAIwhC,EAASn0D,GAAKuzD,EAAW,EACzBa,EAAYD,EAASxhC,EAAa,QAAU3yB,EAAI,GAAGwE,SAAS,IAAM,IAAMgvD,EACxEzD,EAAQ,IAAIjqD,MAAqB,EAAIksD,GACzCjC,EAAM,GAAK+D,EAGX,IAFA,IAAIO,EAAQ,EACR/B,GAAa,EACR1vC,EAAI,EAAGA,EAAIovC,IAAiBpvC,EAAG,CACtC,IAAIrZ,EAAO5J,KAAKouD,iBAAiB7+C,EAAW0T,IAC5C,GAAIvG,EAAA2Y,gBAAgBzrB,IAAS8S,EAAA4Y,aAAag9B,MACxClC,EAAMsE,KAAW9qD,EACb+lB,EAAK1nB,MAAK,KAA6B,CACzC0qD,GAAa,EACb,OAINvC,EAAM9qD,OAASovD,GACX/B,GAAc6B,KACX7kC,EAAK5nB,GAAE,KAAqBqsD,GAAgB,GAC5CzkC,EAAK5nB,GAAE,KAA6BssD,GAAuB,GAC3D1kC,EAAK5nB,GAAE,KAAoBusD,GAAe,GAC1C3kC,EAAK5nB,GAAE,MAAuBwsD,GAAkB,IAIvD5kC,EAAKyD,MACH,KAGFP,EAAgBlD,KAAOA,EAAK6D,OAC5B2gC,EAAex0D,EAAOkrC,YAAY4pB,EAAWrE,EAAK,GAWpD,OATAv9B,EAAgBrC,oBAGZ0jC,GAAgB,IACdE,GAAethC,EAAW5qB,IAAG,GAC7BmsD,GAAsBvhC,EAAW5qB,IAAG,GACpCosD,GAAcxhC,EAAW5qB,IAAG,GAC5BqsD,GAAiBzhC,EAAW5qB,IAAG,KAE9BisD,GAGT7J,EAAAroD,UAAA+vD,sBAAA,SAAsB1hD,GACpB,IAAIqf,EAAO3vB,KAAK6yB,gBAAgBlD,KAShC,OANAA,EAAKznB,IAAG,GAGRynB,EAAKznB,IAAG,GAGDwhD,EAAAiL,aAAa30D,KAAM,KAAMsQ,IAGlCg6C,EAAAroD,UAAAgwD,oBAAA,SAAoB3hD,GAQlB,OAJAtQ,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf3X,EAAUlM,OAELpE,KAAKL,OAAO6sC,qBAOrB8d,EAAAroD,UAAAgsD,yBAAA,SAAyB39C,EAA8BskD,QAAA,IAAAA,OAAA,GACrD,IAAIroC,EAAUvsB,KAAKusB,QACfsG,EAAkB7yB,KAAK6yB,gBACvBzgB,EAAe9B,EAAU8B,aACzByiD,EAAkBziD,EAAa9M,OAGnC,GAAIsvD,GACF/hC,GAAmB7yB,KAAKurD,uBACxBj7C,EAAU1I,QAAU0I,EAAU1I,OAAOb,MAAQ0V,EAAA5V,SAASoS,OACrD,CAMD,IAAK,IAAI5Y,EAAI,EAAGA,EAAIw0D,IAAmBx0D,EACrCL,KAAKquD,yBAAyBj8C,EAAa/R,IAE7C,OAAO,EAIT,IAAIy0D,EAAe,IAAI3uD,MACnBwpB,EAAO3vB,KAAK6yB,gBAAgBlD,KAC5BnP,EAAWxgB,KAAKwgB,SACpB,IAASngB,EAAI,EAAGA,EAAIw0D,IAAmBx0D,EAAG,CACxC,IAAIwL,EAAcuG,EAAa/R,GAC3BO,EAAOiL,EAAYjL,KAAKwE,KACxBkD,EAAoB,KACpBimD,EAA0B,EAC9B,GAAI1iD,EAAYvD,KAAM,CAKpB,KAJAA,EAAOkY,EAASiuC,YACd5iD,EAAYvD,KACZqnB,EAAKjC,0BAEI,SACP7hB,EAAY5C,cACdslD,EAAWvuD,KAAKkvD,kBACdrjD,EAAY5C,YACZX,EAAI,UAKH,KAAIuD,EAAY5C,YAchB,CACLjJ,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACf7iD,EAAYjL,KAAKwD,MAAMuqD,OAEzB,SAbA,GALAJ,EAAWvuD,KAAK4uD,4BACd/iD,EAAY5C,YACZuT,EAAAyE,KAAKc,KAAI,GAGP/hB,KAAK0qD,aAAeluC,EAAAyE,KAAKc,KAAM,CACjC/hB,KAAKuG,MACHgW,EAAAzY,eAAe+qD,mCACfhjD,EAAYzH,MAAOpE,KAAK0qD,YAAY7lD,WAAY,UAElD,SAEFyD,EAAOtI,KAAK0qD,YAQd,IAAIqK,GAAY,EAChB,GAAIlpD,EAAY9D,GAAGtB,EAAApE,YAAYgqB,OAC7B,GAAIkiC,EAEF,GADAA,EAAWvuD,KAAKL,OAAO8xC,qBAAqB8c,GACxC7xC,EAAA2Y,gBAAgBk5B,IAAa7xC,EAAA4Y,aAAa+C,MAAO,CACnD,IAAIrJ,EAAQ,IAAIysB,EAAAtuB,MAAMZ,EAAS3rB,GAAO,EAAG0H,GACzC,OAAQoU,EAAAgd,kBAAkB60B,IACxB,OACEv/B,EAAQA,EAAMpI,yBACZ3E,QACEvF,EAAA4b,iBAAiBi2B,GACjB,IAGJ,MAEF,OACEv/B,EAAQA,EAAMpI,yBACZ3E,QACEvF,EAAAid,oBAAoB40B,GACpB7xC,EAAA+4B,qBAAqB8Y,KAGzB,MAEF,OACEv/B,EAAQA,EAAMjI,uBAA4BrK,EAAAkd,iBAAiB20B,IAC3D,MAEF,OACEv/B,EAAQA,EAAMjI,uBAAuBrK,EAAAmd,iBAAiB00B,IACtD,MAEF,QAEE,OADA9qD,QAAO,GACAzD,KAAKL,OAAO6sC,oBAIvB,IAAI5Z,EAAeC,EAAgBlD,KAAKiD,aACxC,GAAKA,GACA,GAAIA,EAAajN,IAAI/kB,GAKxB,OAJAZ,KAAKuG,MACHgW,EAAAzY,eAAegiB,uBACfja,EAAYjL,KAAKwD,MAAOxD,GAEnBZ,KAAKL,OAAO6sC,yBANF3Z,EAAgBlD,KAAKiD,aAAeA,EAAe,IAAIzT,IAQ1EyT,EAAa1qB,IAAItH,EAAMouB,GACvB+lC,GAAY,OAEZ/0D,KAAKsG,QACHiW,EAAAzY,eAAeqrD,4DACftjD,EAAYzH,YAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAekxD,wCACfnpD,EAAYzH,OAIlB,IAAK2wD,EAAW,CACV/lC,OAAK,EAKPA,EAHAnjB,EAAY5D,MAAMxB,EAAApE,YAAY69C,IAAMz5C,EAAApE,YAAYgqB,QAChDsD,EAAK5nB,GAAE,MAEC4nB,EAAKgE,eAAerrB,EAAM1H,GAAM,EAAOiL,GAEvCgnB,EAAgBhD,SAASvnB,EAAM1H,EAAMiL,GAE3C0iD,GACFuG,EAAajvD,KAAK7F,KAAKi1D,2BAA2BppD,EAAYjL,KAAM2tD,IAChEv/B,EAAM1mB,KAAKP,GAAG,KAChB4nB,EAAKQ,gBAAgBnB,EAAM5B,OAAQuC,EAAKyF,YAAYm5B,EAAUjmD,KAEvD0mB,EAAM1mB,KAAKP,GAAG,KACvB4nB,EAAKQ,gBAAgBnB,EAAM5B,OAAO,IAIxC,OAAO0nC,EAAaxvD,OACO,GAAvBwvD,EAAaxvD,OACXwvD,EAAa,GACb90D,KAAKL,OAAOkrC,YAAY,KAAMiqB,EAAY,GAC5C,GAGNxK,EAAAroD,UAAAiwD,qBAAA,SAAqB5hD,GACnB,OAAOtQ,KAAKkvD,kBAAkB5+C,EAAUrF,WAAYuR,EAAAyE,KAAKc,KAAI,MAG/DuoC,EAAAroD,UAAAkwD,sBAAA,SAAsB7hD,GACpB,IAAI3Q,EAASK,KAAKL,OAGd8yD,EAAWzyD,KAAK0yD,cAClB1yD,KAAK4uD,4BAA4Bt+C,EAAUjC,UAAWmO,EAAAyE,KAAKW,KAAI,GAC/D5hB,KAAK0qD,aAGP,IACG1qD,KAAKghB,QAAQmB,eACdniB,KAAK6yB,gBAAgB5qB,MAAMxB,EAAApE,YAAY6jB,QAAUzf,EAAApE,YAAYixD,iBAC7D,CAEA,IAAIC,EAAkB5zD,EAAO8xC,qBAAqBghB,GAClD,GACE/1C,EAAA2Y,gBAAgBk+B,IAAoB72C,EAAA4Y,aAAa+C,OACf,GAAlC3b,EAAAgd,kBAAkB65B,IAElB,IAAK72C,EAAA4b,iBAAiBi7B,GAAkB,OAAO5zD,EAAO6rC,iBAItDinB,EAAWzyD,KAAK0yD,cACd1yD,KAAK4uD,4BAA4Bt+C,EAAUjC,UAAWmO,EAAAyE,KAAKW,KAAI,GAC/D5hB,KAAK0qD,aAMX,IAAI73B,EAAkB7yB,KAAK6yB,gBACvBnjB,EAAQmjB,EAAgBvC,oBACxBwC,EAAaD,EAAgBlD,KAC7BA,EAAOmD,EAAWO,OACtBR,EAAgBlD,KAAOA,EACvB,IAAIqD,EAAa,SAAWtjB,EAC5BigB,EAAKqD,WAAaA,EAClB,IAAID,EAAgB,YAAcrjB,EAClCigB,EAAKoD,cAAgBA,EAErB,IAAI7f,EAAOlT,KAAKouD,iBAAiB99C,EAAUA,WAEvCqiD,EAAahjC,EAAK1nB,MAAK,IAc3B,OAXA4qB,EAAgBlD,KAAOA,EAAK6D,OAC5BX,EAAgBrC,oBAChBb,EAAKyD,MACH,KAMGN,EAAW+B,mBAAmBlF,GAE5BhwB,EAAOkrC,YAAY7X,GACxBrzB,EAAOyrC,WAAWrY,EAChBpzB,EAAO2rC,SAASmnB,EACdE,EACIz/C,EACAvT,EAAOkrC,YAAY,MACjB33B,EACAvT,EAAOqrC,YAAYjY,IACpB,QAabu3B,EAAAroD,UAAAizD,sBAAA,SACE7oD,EACA8oD,EACAC,GAEA3xD,OAAO4I,EAAQtE,GAAGtB,EAAApE,YAAY2qB,UAC9B,IAAI1kB,EAAO+D,EAAQ/D,KACnB,QACG8sD,GACD9sD,EAAKP,GAAE,IACPotD,EAAeptD,GAAE,IACjBO,EAAKswB,KAAOu8B,EAAev8B,MACtB54B,KAAK0qD,YAAcyK,GAAgBpuD,MACnC/G,KAAK0qD,YAAcpiD,GAAMvB,MAE9B,OACA,OACE,IAAI4xB,EAAQrwB,EAAK+zC,yBAAyB7/B,EAAAyE,KAAKG,KAC/C,OAAOphB,KAAKL,OAAO2nC,UACQ,GAAzBj7B,EAAQygB,kBACJ4iB,QAAQrjC,EAAQ0gB,uBAAyB4L,GAASA,EAClD,GAGR,OACA,OACA,QACE,IAAI08B,EAAOhpD,EAAQ/D,KAAKmwB,wBAAwBjc,EAAAyE,KAAKG,KACrD,OAAOphB,KAAKL,OAAO2nC,UACQ,GAAzBj7B,EAAQygB,kBACJ4iB,QAAQrjC,EAAQ0gB,sBAAwBsoC,EACxC,GAGR,OACA,OACE,OAAOr1D,KAAKL,OAAO2nC,UACQ,GAAzBj7B,EAAQygB,kBACJ4iB,QAAQrjC,EAAQ0gB,sBAChB,GAGR,OACA,OACE,IAAK1gB,EAAQkgB,QAAQvL,QAAQkB,SAC3B,OAAOliB,KAAKL,OAAO2nC,UACQ,GAAzBj7B,EAAQygB,kBACJ4iB,QAAQrjC,EAAQ0gB,sBAChB,GAKV,OACA,OACE,OAAgC,GAAzB1gB,EAAQygB,kBACX9sB,KAAKL,OAAO+nC,UACVgI,QAAQrjC,EAAQ0gB,sBAChB4iB,SAAStjC,EAAQ0gB,uBAEnB/sB,KAAKL,OAAO+nC,UAAU,GAE5B,QAEE,IAAMr7B,EAAQqb,aAAa+zB,EAAAx8B,eAAe/I,UAAYi/C,GAAkB34C,EAAAyE,KAAKY,IAC3E,OAAO7hB,KAAKL,OAAOqoC,UAAgC37B,EAAS4gB,oBAG9DjtB,KAAK0qD,YAAcluC,EAAAyE,KAAKY,IAE1B,QACE,OAAO7hB,KAAKL,OAAOmoC,UAAgCz7B,EAAS4gB,oBAE9D,QAEE,OADAxpB,QAAO,GACAzD,KAAKL,OAAO6sC,sBAKzB8d,EAAAroD,UAAAitD,kBAAA,SACEjkD,EACAkqD,EACAG,EACAC,GAIA,IAAIlrD,EACJ,OAHArK,KAAK0qD,YAAcyK,EAGXlqD,EAAWlE,MACjB,KAAK0V,EAAA5V,SAAS0Q,UACZlN,EAAOrK,KAAKw1D,2BAAgDvqD,EAAYkqD,GACxE,MAEF,KAAK14C,EAAA5V,SAAS2Q,OACZnN,EAAOrK,KAAKy1D,wBAA0CxqD,EAAYkqD,GAClE,MAEF,KAAK14C,EAAA5V,SAASS,KACZ+C,EAAOrK,KAAK01D,sBAAsCzqD,EAAYkqD,GAC9D,MAEF,KAAK14C,EAAA5V,SAAS6Q,MACZrN,EAAOrK,KAAK21D,uBAAwC1qD,EAAYkqD,GAChE,MAEF,KAAK14C,EAAA5V,SAASU,cACZ8C,EAAOrK,KAAK41D,+BAAwD3qD,EAAYkqD,GAChF,MAEF,KAAK14C,EAAA5V,SAASgR,SACZxN,EAAOrK,KAAK61D,0BAA8C5qD,EAAYkqD,GACtE,MAEF,KAAK14C,EAAA5V,SAASQ,WACd,KAAKoV,EAAA5V,SAASM,MACd,KAAKsV,EAAA5V,SAASI,KACd,KAAKwV,EAAA5V,SAASyR,KACd,KAAKmE,EAAA5V,SAASwR,MACd,KAAKoE,EAAA5V,SAASK,KACZmD,EAAOrK,KAAK81D,4BACY7qD,EACtBkqD,EACc,GAAdG,GAEF,MAEF,KAAK74C,EAAA5V,SAASiR,WACZzN,EAAOrK,KAAK+1D,4BAAkD9qD,EAAYkqD,GAC1E,MAEF,KAAK14C,EAAA5V,SAASG,QACZqD,EAAOrK,KAAKg2D,yBAA4C/qD,EAAYkqD,GACpE,MAEF,KAAK14C,EAAA5V,SAASmR,IACZ3N,EAAOrK,KAAKi2D,qBAAoChrD,EAAYkqD,GAC5D,MAEF,KAAK14C,EAAA5V,SAASY,cACZ4C,EAAOrK,KAAKk2D,+BAAwDjrD,EAAYkqD,GAChF,MAEF,KAAK14C,EAAA5V,SAASW,eACZ6C,EAAOrK,KAAKm2D,gCACgBlrD,EAC1BkqD,EACc,GAAdG,GAEF,MAEF,KAAK74C,EAAA5V,SAASsR,QACZ9N,EAAOrK,KAAKo2D,yBAA4CnrD,EAAYkqD,GACpE,MAEF,KAAK14C,EAAA5V,SAAS2R,aACZnO,EAAOrK,KAAKq2D,8BAAsDprD,EAAYkqD,GAC9E,MAEF,KAAK14C,EAAA5V,SAAS4R,YACZpO,EAAOrK,KAAKs2D,6BAAoDrrD,EAAYkqD,GAC5E,MAEF,QACEn1D,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAEbiG,EAAOrK,KAAKL,OAAO6sC,oBAIvB,IAAIke,EAAc1qD,KAAK0qD,YASvB,OARkB,GAAd4K,GAAyC5K,GAAeyK,GAC1D9qD,EAAOrK,KAAKu2D,kBAAkBlsD,EAAMqgD,EAAayK,EAAgBG,EAAgBC,EAAUtqD,GAC3FjL,KAAK0qD,YAAcyK,GACF,GAARI,IACTlrD,EAAOrK,KAAKw2D,uBAAuBnsD,EAAMqgD,IAGvC1qD,KAAKghB,QAAQ0P,WAAW1wB,KAAKoyD,iBAAiB/nD,EAAMY,EAAW7G,OAC5DiG,GAGTigD,EAAAroD,UAAA2sD,4BAAA,SACE3jD,EACAkqD,EACAI,GAEA,OAAOv1D,KAAKkvD,kBACVjkD,EACAkqD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAc,EAElBI,IAIJjL,EAAAroD,UAAAwvC,qBAAA,SACExmC,EACAkqD,EACAG,EACAC,GAEA,OAAOv1D,KAAKL,OAAO8xC,qBACjBzxC,KAAKkvD,kBAAkBjkD,EAAYkqD,EAAgBG,EAAgBC,KAIvEjL,EAAAroD,UAAAs0D,kBAAA,SACElsD,EACA4vB,EACA/uB,EACAoqD,EACAC,EACA9H,GAEAhqD,OAAqB,GAAd6xD,GACP,IAAI31D,EAASK,KAAKL,OAGlB,OAAiB,IAAbs6B,EAASlzB,MACXtD,OAAkB,IAAXyH,EAAOnE,MACd/G,KAAKuG,MACHgW,EAAAzY,eAAe+qD,mCACfpB,EAAWrpD,MAAO61B,EAASp1B,WAAYqG,EAAOrG,YAEzClF,EAAO6sC,qBAID,IAAXthC,EAAOnE,KAA8BpH,EAAOurC,WAAW7gC,IAEtD4vB,EAASlI,eAAe7mB,IACT,GAAdoqD,GACFt1D,KAAKuG,MACHgW,EAAAzY,eAAe2yD,sDACfhJ,EAAWrpD,MAAO61B,EAASp1B,WAAYqG,EAAOrG,YAKhDo1B,EAASlyB,GAAE,GAGTmD,EAAOnD,GAAE,GACM,IAAbkyB,EAASlzB,KAGI,IAAXmE,EAAOnE,OACTsD,EAAO1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQs9B,WAAYrsD,IAM5B,IAAXa,EAAOnE,OAChBsD,EAAO1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQu9B,UAAWtsD,IAMtCa,EAAOnD,GAAE,GAGD,IAAbkyB,EAASlzB,KACPmE,GAAUsR,EAAAyE,KAAKW,MACjBvX,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASO,MAAOpsB,EAAM1K,EAAOmoC,UAAU,IAClEytB,EAAQ,GAGNlrD,EAFOa,EAAOnD,GAAE,GACdmD,EAAOnD,GAAE,IACJpI,EAAOuoC,YAAYxrB,EAAA0c,QAAQw9B,cAAevsD,GAE1C1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQy9B,cAAexsD,GAG/Ca,EAAOnD,GAAE,IACJpI,EAAOuoC,YAAYxrB,EAAA0c,QAAQ09B,cAAezsD,GAE1C1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQ29B,cAAe1sD,GAMjDa,GAAUsR,EAAAyE,KAAKW,MACjBvX,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASQ,MAAOrsB,EAAM1K,EAAOqoC,UAAU,IAClEutB,EAAQ,GAGNlrD,EAFOa,EAAOnD,GAAE,GACdmD,EAAOnD,GAAE,IACJpI,EAAOuoC,YAAYxrB,EAAA0c,QAAQ49B,cAAe3sD,GAE1C1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQ69B,cAAe5sD,GAG/Ca,EAAOnD,GAAE,IACJpI,EAAOuoC,YAAYxrB,EAAA0c,QAAQ89B,cAAe7sD,GAE1C1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQ+9B,cAAe9sD,IAOvD5G,OAAmB,GAAZyH,EAAOrD,MAAyB,sBACvCwC,EAAO1K,EAAOurC,WAAW7gC,IAIlB4vB,EAASlyB,GAAE,IAAuBmD,EAAOnD,GAAE,GAKhDsC,EAFW,IAAXa,EAAOnE,KACLkzB,EAASlyB,GAAE,IACNpI,EAAOuoC,YACZjO,EAASlyB,GAAE,GACP2U,EAAA0c,QAAQg+B,gBACR16C,EAAA0c,QAAQi+B,gBACZhtD,GAGK1K,EAAOuoC,YACZjO,EAASlyB,GAAE,GACP2U,EAAA0c,QAAQk+B,gBACR56C,EAAA0c,QAAQm+B,gBACZltD,GAMA4vB,EAASlyB,GAAE,IACNpI,EAAOuoC,YACZjO,EAASlyB,GAAE,GACP2U,EAAA0c,QAAQo+B,gBACR96C,EAAA0c,QAAQq+B,gBACZptD,GAGK1K,EAAOuoC,YACZjO,EAASlyB,GAAE,GACP2U,EAAA0c,QAAQs+B,gBACRh7C,EAAA0c,QAAQu+B,gBACZttD,GAQF4vB,EAASlyB,GAAE,IAGTmD,GAAUsR,EAAAyE,KAAKW,MACjBvX,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASM,MAAOnsB,EAAM1K,EAAO+nC,UAAU,IAClE6tB,EAAQ,GACErqD,EAAOnD,GAAE,MACnBsC,EAAO1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQw+B,QAASvtD,IAIpCa,EAAOnD,GAAE,KAClBsC,EAAO1K,EAAOuoC,YACZjO,EAASlyB,GAAE,GAAqB2U,EAAA0c,QAAQy+B,UAAYn7C,EAAA0c,QAAQ0+B,UAC5D93D,KAAKw2D,uBAAuBnsD,EAAM4vB,IAEpCs7B,EAAQ,GAKJt7B,EAASlyB,GAAE,KAETkyB,EAASrB,KAAO1tB,EAAO0tB,OACzBvuB,EAAOrK,KAAKw2D,uBAAuBnsD,EAAM4vB,GACzCs7B,EAAQ,GAMhBv1D,KAAK0qD,YAAcx/C,EACJ,GAARqqD,EACHv1D,KAAKw2D,uBAAuBnsD,EAAMa,GAClCb,IAGNigD,EAAAroD,UAAAuzD,2BAAA,SAA2BvqD,EAAiCkqD,GAC1D,IAAIjqD,EAASlL,KAAKwgB,SAASiuC,YACzBxjD,EAAWC,OACXlL,KAAK6yB,gBAAgBlD,KAAKjC,yBAE5B,OAAKxiB,EACElL,KAAKkvD,kBAAkBjkD,EAAWA,WAAYC,EAAM,KADvClL,KAAKL,OAAO6sC,qBASlC8d,EAAAroD,UAAAwzD,wBAAA,SACExqD,EACAkqD,GAEA,IAII4C,EACAC,EACAC,EACAC,EACAC,EAEA9tD,EAVA1K,EAASK,KAAKL,OACd2L,EAAOL,EAAWK,KAClBC,EAAQN,EAAWM,MASnB6sD,GAAW,EAEX/sD,EAAWJ,EAAWI,SAC1B,OAAQA,GACN,KAAK3E,EAAAC,MAAMs6C,SAKT,GAJA8W,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAa8B,IAC5C,CACZ/T,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAKrB,GAFAyrB,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAEhB,OAxBEurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAUI4sD,EAAWpxD,MACjB,OACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASS,MAAOohC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASW,MAAOkhC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASW,MACTna,EAAAwZ,SAASS,MACbohC,EACAE,GAEF,MAEF,OACA,OACA,OACA,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASU,MAAOmhC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASY,MACTpa,EAAAwZ,SAASU,MACbmhC,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASY,MAAOihC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASa,MAAOghC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASc,MAAO+gC,EAAUE,GACrD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlBxsC,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACxB,MAEF,KAAKlb,EAAAC,MAAMu6C,YAKT,GAJA6W,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAa0B,IAC5C,CACZ3T,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAKrB,GAFAyrB,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAEhB,OAxBEurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAUI4sD,EAAWpxD,MACjB,OACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASqB,MAAOwgC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASuB,MACT/a,EAAAwZ,SAASqB,MACbwgC,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASuB,MAAOsgC,EAAUE,GACrD,MAEF,OACA,OACA,OACA,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASsB,MAAOugC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASwB,MACThb,EAAAwZ,SAASsB,MACbugC,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASwB,MAAOqgC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASyB,MAAOogC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS0B,MAAOmgC,EAAUE,GACrD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlBxsC,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACxB,MAEF,KAAKlb,EAAAC,MAAMw6C,gBAKT,GAJA4W,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAa+B,IAC5C,CACZhU,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAKrB,GAFAyrB,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,KAAM4zD,EAASnzD,WAAYqzD,EAAUrzD,YAEzD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAEhB,OAxBEurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAUI4sD,EAAWpxD,MACjB,OACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASe,MAAO8gC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASiB,MACTza,EAAAwZ,SAASe,MACb8gC,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASiB,MAAO4gC,EAAUE,GACrD,MAEF,OACA,OACA,OACA,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASgB,MAAO6gC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASkB,MACT1a,EAAAwZ,SAASgB,MACb6gC,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASkB,MAAO2gC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASmB,MAAO0gC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASoB,MAAOygC,EAAUE,GACrD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlBxsC,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACxB,MAEF,KAAKlb,EAAAC,MAAMy6C,mBAKT,GAJA2W,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAa2B,IAC5C,CACZ5T,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAKrB,GAFAyrB,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,KAAM4zD,EAASnzD,WAAYqzD,EAAUrzD,YAEzD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAEhB,OAxBEurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAUI4sD,EAAWpxD,MACjB,OACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS2B,MAAOkgC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS6B,MACTrb,EAAAwZ,SAAS2B,MACbkgC,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS6B,MAAOggC,EAAUE,GACrD,MAEF,OACA,OACA,OACA,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4B,MAAOigC,EAAUE,GACrD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS8B,MACTtb,EAAAwZ,SAAS4B,MACbigC,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS8B,MAAO+/B,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS+B,MAAO8/B,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASgC,MAAO6/B,EAAUE,GACrD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlBxsC,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACxB,MAGF,KAAKlb,EAAAC,MAAM46C,qBACX,KAAK76C,EAAAC,MAAM06C,cAUT,GAJA0W,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZr/C,GAAY3E,EAAAC,MAAM06C,eAAiBrhD,KAAK0qD,YAAY3iD,GAAE,KAExD,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAawB,IAC5C,CACZzT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAQN,GAFAgtD,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAW2sD,EAASnzD,WAAYqzD,EAAUrzD,YAE/F7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAEhB,OAxBEurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAUI4sD,EAAWpxD,MACjB,OACA,OACA,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASC,MAAO4hC,EAAUE,GACrD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASE,MACT1Z,EAAAwZ,SAASC,MACb4hC,EACAE,GAEF,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASE,MAAO2hC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASG,MAAO0hC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASI,MAAOyhC,EAAUE,GACrD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlBxsC,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACxB,MAEF,KAAKlb,EAAAC,MAAM66C,0BACX,KAAK96C,EAAAC,MAAM26C,mBAKT,GAJAyW,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZr/C,GAAY3E,EAAAC,MAAM26C,oBAAsBthD,KAAK0qD,YAAY3iD,GAAE,KAE7D,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAayB,IAC5C,CACZ1T,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAQN,GAFAgtD,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAW2sD,EAASnzD,WAAYqzD,EAAUrzD,YAE/F7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAEhB,OAxBEurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAUI4sD,EAAWpxD,MACjB,OACA,OACA,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASK,MAAOwhC,EAAUE,GACrD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASM,MACT9Z,EAAAwZ,SAASK,MACbwhC,EACAE,GAEF,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASM,MAAOuhC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASO,MAAOshC,EAAUE,GACrD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASQ,MAAOqhC,EAAUE,GACrD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlBxsC,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACxB,MAEF,KAAKlb,EAAAC,MAAM87C,OACT,OAAOziD,KAAKu4D,kBAAkBjtD,EAAMC,EAAO4pD,GAE7C,KAAKzuD,EAAAC,MAAM+7C,YAAa0V,GAAW,EACnC,KAAK1xD,EAAAC,MAAM4X,KAKT,GAJAw5C,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAae,KAC5C,CACZhT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFH,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,SAC7C,CAGL,GAFAC,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,QACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASy5B,OAAQoI,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASsiC,OACT97C,EAAAwZ,SAASy5B,OACboI,EACAE,GAEF,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASsiC,OAAQT,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASuiC,OAAQV,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASwiC,OAAQX,EAAUE,GACtD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMg8C,aAAcyV,GAAW,EACpC,KAAK1xD,EAAAC,MAAM8X,MAKT,GAJAs5C,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAagB,KAC5C,CACZjT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFH,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,gBACZ,CAGL,GAFAuN,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,QACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASyiC,OAAQZ,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS0iC,OACTl8C,EAAAwZ,SAASyiC,OACbZ,EACAE,GAEF,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS0iC,OAAQb,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS2iC,OAAQd,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4iC,OAAQf,EAAUE,GACtD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMi8C,gBAAiBwV,GAAW,EACvC,KAAK1xD,EAAAC,MAAM+6C,SAKT,GAJAqW,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAaiB,KAC5C,CACZlT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFL,EAAW/3D,KAAKw2D,uBAAuBuB,EAAUC,GACjDC,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,SAC7C,CAGL,GAFAC,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,QACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASiC,OAAQ4/B,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS6iC,OACTr8C,EAAAwZ,SAASiC,OACb4/B,EACAE,GAEF,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS6iC,OAAQhB,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS8iC,OAAQjB,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS+iC,OAAQlB,EAAUE,GACtD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMk8C,yBAA0BuV,GAAW,EAChD,KAAK1xD,EAAAC,MAAM86C,kBAKT,GAJAsW,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAakB,KAC5C,CACZnT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,IAAI3mB,OAAQ,EAGZ,GAAyB,IAArB7lB,KAAK0qD,YAAY3jD,MAGnB,GAFAkxD,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOiR,EAAAyE,KAAKY,IAAG,KAClDq2C,EAAYl4D,KAAK0qD,cACX7kC,EAAW7lB,KAAKmrD,gBAAiB,CAErC,KADIxjC,EAAY3nB,KAAKusB,QAAQjN,eAAepe,IAAI,UAChC,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,SAEpBiG,EAAO1K,EAAO6sC,oBACd,MAGF,KADIvqC,EAAY0lB,EAAU3X,QAAU2X,EAAU3X,QAAQ9O,IAAI,OAAS,MACnD,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,aAEpBiG,EAAO1K,EAAO6sC,oBACd,MAEF/oC,OAAOxB,EAAU8E,MAAQ00C,EAAAz8B,YAAYgH,oBACrChmB,KAAKmrD,eAAiBtlC,EAAW7lB,KAAKwgB,SAAS6F,gBAAmCpkB,EAAW,YAsB/F,GAhBA81D,EAAW/3D,KAAKu2D,kBACdwB,EACA/3D,KAAK0qD,YACLluC,EAAAyE,KAAKa,IAAG,IAGRxW,GAEF0sD,EAAWh4D,KAAK0qD,YAChBuN,EAAYj4D,KAAKkvD,kBACf3jD,EACAiR,EAAAyE,KAAKa,IAAG,KAIVo2C,EAAYl4D,KAAK0qD,cACX7kC,EAAW7lB,KAAKorD,gBAAiB,CAErC,KADIzjC,EAAY3nB,KAAKusB,QAAQjN,eAAepe,IAAI,SAChC,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,QAEpBiG,EAAO1K,EAAO6sC,oBACd,MAGF,KADIvqC,EAAY0lB,EAAU3X,QAAU2X,EAAU3X,QAAQ9O,IAAI,OAAS,MACnD,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,YAEpBiG,EAAO1K,EAAO6sC,oBACd,MAEF/oC,OAAOxB,EAAU8E,MAAQ00C,EAAAz8B,YAAYgH,oBACrChmB,KAAKorD,eAAiBvlC,EAAW7lB,KAAKwgB,SAAS6F,gBAAmCpkB,EAAW,MAM/FoI,EAHIwb,GAAY7lB,KAAK+vD,gBAAgBlqC,GAG9B7lB,KAAKk5D,eAAerzC,GAAYkyC,EAAUE,IAF1Ct4D,EAAO6sC,oBAIhB,MAEF,KAAK9lC,EAAAC,MAAMm8C,aAAcsV,GAAW,EACpC,KAAK1xD,EAAAC,MAAMg7C,MAKT,GAJAoW,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAamB,KAC5C,CACZpT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFL,EAAW/3D,KAAKw2D,uBAAuBuB,EAAUC,GACjDC,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,gBACZ,CAGL,GAFAuN,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASijC,OAAQpB,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASkjC,OACT18C,EAAAwZ,SAASijC,OACbpB,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASkjC,OAAQrB,EAAUE,GACtD,MAEF,OACA,OACA,QAIA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS6C,OAAQg/B,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASmjC,OACT38C,EAAAwZ,SAAS6C,OACbg/B,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASmjC,OAAQtB,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASojC,OAAQvB,EAAUE,GACtD,MAEF,QACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASqjC,OAAQxB,EAAUE,GACtD,MAEF,QACEx0D,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMo8C,eAAgBqV,GAAW,EACtC,KAAK1xD,EAAAC,MAAMi7C,QAKT,GAJAmW,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAaoB,KAC5C,CACZrT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFL,EAAW/3D,KAAKw2D,uBAAuBuB,EAAUC,GACjDC,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,gBACZ,CAGL,GAFAuN,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OAIA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS8C,OAAQ++B,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASsjC,OACT98C,EAAAwZ,SAAS8C,OACb++B,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASsjC,OAAQzB,EAAUE,GACtD,MAEF,OACA,OACA,QAIA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS+C,OAAQ8+B,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASujC,OACT/8C,EAAAwZ,SAAS+C,OACb8+B,EACAE,GAEF,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASujC,OAAQ1B,EAAUE,GACtD,MAEF,QAEE,KADIpyC,EAAW7lB,KAAKirD,gBACL,CAEb,KADItjC,EAAY3nB,KAAKusB,QAAQjN,eAAepe,IAAI,UAChC,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,SAEpBiG,EAAO1K,EAAO6sC,oBACd,MAGF,KADIvqC,EAAY0lB,EAAU3X,QAAU2X,EAAU3X,QAAQ9O,IAAI,OAAS,MACnD,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,aAEpBiG,EAAO1K,EAAO6sC,oBACd,MAEF/oC,OAAOxB,EAAU8E,MAAQ00C,EAAAz8B,YAAYgH,oBACrChmB,KAAKirD,eAAiBplC,EAAW7lB,KAAKwgB,SAAS6F,gBAAmCpkB,EAAW,MAK7FoI,EAHIwb,GAAY7lB,KAAK+vD,gBAAgBlqC,GAG9B7lB,KAAKk5D,eAAerzC,GAAYkyC,EAAUE,IAF1Ct4D,EAAO6sC,oBAIhB,MAEF,QAEE,KADI3mB,EAAW7lB,KAAKkrD,gBACL,CACb,IAAIvjC,EASA1lB,EARJ,KADI0lB,EAAY3nB,KAAKusB,QAAQjN,eAAepe,IAAI,SAChC,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,QAEpBiG,EAAO1K,EAAO6sC,oBACd,MAGF,KADIvqC,EAAY0lB,EAAU3X,QAAU2X,EAAU3X,QAAQ9O,IAAI,OAAS,MACnD,CACdlB,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACf5Z,EAAW7G,MAAO,YAEpBiG,EAAO1K,EAAO6sC,oBACd,MAEF/oC,OAAOxB,EAAU8E,MAAQ00C,EAAAz8B,YAAYgH,oBACrChmB,KAAKkrD,eAAiBrlC,EAAW7lB,KAAKwgB,SAAS6F,gBAAmCpkB,EAAW,MAK7FoI,EAHIwb,GAAY7lB,KAAK+vD,gBAAgBlqC,GAG9B7lB,KAAKk5D,eAAerzC,GAAYkyC,EAAUE,IAF1Ct4D,EAAO6sC,oBAIhB,MAEF,QACE/oC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMq8C,yBAA0BoV,GAAW,EAChD,KAAK1xD,EAAAC,MAAMo7C,kBAKT,GAJAgW,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAeuE,QAAO,GACxE1B,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAagC,aAC5C,CACZjU,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAKrB,OAFAyrB,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,YACT1qD,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,QACA,OACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASwC,OAAQq/B,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASyjC,OAAQ5B,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASyjC,OACTj9C,EAAAwZ,SAASwC,OACbq/B,EACAE,GAEF,MAEF,QACA,QAKE,OAJAj4D,KAAKuG,MACHgW,EAAAzY,eAAe81D,2CACf3uD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAWrL,KAAK0qD,YAAY7lD,YAE1ElF,EAAO6sC,oBAEhB,QACE/oC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMs8C,+BAAgCmV,GAAW,EACtD,KAAK1xD,EAAAC,MAAMq7C,wBAKT,GAJA+V,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAeuE,QAAO,GACxE1B,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAa4B,aAC5C,CACZ7T,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAMrB,OAHAurB,EAAW/3D,KAAKw2D,uBAAuBuB,EAAUC,GACjDC,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,YACT1qD,KAAK0qD,YAAY3jD,MACvB,OACA,OAIA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS2C,OAAQk/B,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS2jC,OAAQ9B,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS2jC,OACTn9C,EAAAwZ,SAAS2C,OACbk/B,EACAE,GAEF,MAEF,OACA,OACA,QAIA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4C,OAAQi/B,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4jC,OAAQ/B,EAAUE,GACtD,MAEF,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS4jC,OACTp9C,EAAAwZ,SAAS4C,OACbi/B,EACAE,GAEF,MAEF,QACA,QAKE,OAJAj4D,KAAKuG,MACHgW,EAAAzY,eAAe81D,2CACf3uD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAWrL,KAAK0qD,YAAY7lD,YAE1ElF,EAAO6sC,oBAEhB,QACE/oC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMu8C,2CAA4CkV,GAAW,EAClE,KAAK1xD,EAAAC,MAAMs7C,oCAKT,GAJA8V,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAeuE,QAAO,GACxE1B,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAa6B,eAC5C,CACZ9T,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAMrB,OAHAurB,EAAW/3D,KAAKw2D,uBAAuBuB,EAAUC,GACjDC,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,YACT1qD,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4C,OAAQi/B,EAAUE,GAExD,OACA,OACA,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4C,OAAQi/B,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4jC,OAAQ/B,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS4jC,OACTp9C,EAAAwZ,SAAS4C,OACbi/B,EACAE,GAEF,MAEF,QACA,QAKE,OAJAj4D,KAAKuG,MACHgW,EAAAzY,eAAe81D,2CACf3uD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAWrL,KAAK0qD,YAAY7lD,YAE1ElF,EAAO6sC,oBAEhB,QACE/oC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMw8C,iBAAkBiV,GAAW,EACxC,KAAK1xD,EAAAC,MAAMu7C,UAKT,GAJA6V,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAeuE,QAAO,GACxE1B,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAaqB,aAC5C,CACZtT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFH,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,gBACZ,CAGL,GAFAuN,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,OACA,QACA,OACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASsC,OAAQu/B,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS6jC,OAAQhC,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS6jC,OACTr9C,EAAAwZ,SAASsC,OACbu/B,EACAE,GAEF,MAEF,QACA,QAKE,OAJAj4D,KAAKuG,MACHgW,EAAAzY,eAAe81D,2CACf3uD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAWrL,KAAK0qD,YAAY7lD,YAE1ElF,EAAO6sC,oBAEhB,QACE/oC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMy8C,WAAYgV,GAAW,EAClC,KAAK1xD,EAAAC,MAAMw7C,IAKT,GAJA4V,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAeuE,QAAO,GACxE1B,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAasB,YAC5C,CACZvT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFH,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,gBACZ,CAGL,GAFAuN,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS8jC,MAAOjC,EAAUE,GACrD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS8jC,MAAOjC,EAAUE,GACrD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS+jC,MAAOlC,EAAUE,GACrD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS+jC,MACTv9C,EAAAwZ,SAAS8jC,MACbjC,EACAE,GAEF,MAEF,QACA,QAKE,OAJAj4D,KAAKuG,MACHgW,EAAAzY,eAAe81D,2CACf3uD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAWrL,KAAK0qD,YAAY7lD,YAE1ElF,EAAO6sC,oBAEhB,QACE/oC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAM08C,aAAc+U,GAAW,EACpC,KAAK1xD,EAAAC,MAAMy7C,MAKT,GAJA2V,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAeuE,QAAO,GACxE1B,EAAWh4D,KAAK0qD,YAGZ1qD,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAC5C,IAAI+zC,EAEEzpB,EADN,GADIypB,EAAiBkc,EAASlc,eAG5B,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAauB,aAC5C,CACZxT,EAAOrK,KAAKq4D,sBAAsBhmC,EAAU/mB,EAAMysD,EAAUxsD,EAAON,GACnE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAGrB,GAAI4rB,EACFH,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,gBACZ,CAGL,GAFAuN,EAAYj4D,KAAK4uD,4BAA4BrjD,EAAOysD,EAAQ,GAC5DE,EAAYl4D,KAAK0qD,cACbyN,EAAa37C,EAAAyE,KAAK47B,iBAAiBmb,EAAUE,GAAW,IAuB1D,OALAl4D,KAAKuG,MACHgW,EAAAzY,eAAew0D,8CACfrtD,EAAW7G,MAAO,IAAK4zD,EAASnzD,WAAYqzD,EAAUrzD,YAExD7E,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,oBAtBdurB,EAAW/3D,KAAKu2D,kBACdwB,EACAC,EACAA,EAAWG,EAAU,IAGrB7sD,GAEF2sD,EAAYj4D,KAAKu2D,kBACf0B,EACAC,EACAA,EAAYC,EAAU,IAGtB5sD,GAWN,OAAQvL,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASgkC,OAAQnC,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASgkC,OAAQnC,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASikC,OAAQpC,EAAUE,GACtD,MAEF,OACA,OACE5tD,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASikC,OACTz9C,EAAAwZ,SAASgkC,OACbnC,EACAE,GAEF,MAEF,QACA,QAKE,OAJAj4D,KAAKuG,MACHgW,EAAAzY,eAAe81D,2CACf3uD,EAAW7G,MAAOsC,EAAAq6C,sBAAsB91C,EAAWI,UAAWrL,KAAK0qD,YAAY7lD,YAE1ElF,EAAO6sC,oBAEhB,QACE/oC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAKF,KAAK9lC,EAAAC,MAAM47C,oBAOT,GANAwV,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAChBuN,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,YAGbrgD,EAAO1K,EAAO6zC,gBAAgBukB,GAAU,EAAM,GAChD/3D,KAAK0yD,cAAcqF,EAAU/3D,KAAK0qD,aAClCrgD,EAAO1K,EAAO2rC,SACZtrC,KAAK0yD,cAAcqF,EAAU/3D,KAAK0qD,aAClCuN,EACA5tD,OAIG,CACL,IAAIslB,EAAO3vB,KAAK6yB,gBAAgBlD,KAC5BmkC,EAAY9zD,KAAK6yB,gBAAgBxC,oBACnCrwB,KAAK0qD,aACJ/6B,EAAKyF,YAAY2iC,EAAU/3D,KAAK0qD,cAEnCrgD,EAAO1K,EAAO2rC,SACZtrC,KAAK0yD,cACH/yD,EAAOkpC,eAAeirB,EAAU1mC,MAAO2qC,GACvC/3D,KAAK0qD,aAEPuN,EACAt4D,EAAOgpC,eACLllC,OAAOqwD,GAAW1mC,MAClBptB,KAAK0qD,YAAYz6B,iBAIvB,MAEF,KAAKvpB,EAAAC,MAAM67C,QAOT,GANAuV,EAAW/3D,KAAK4uD,4BAA4BtjD,EAAM6pD,EAAc,GAChE6C,EAAWh4D,KAAK0qD,YAChBuN,EAAYj4D,KAAKkvD,kBAAkB3jD,EAAOysD,EAAQ,KAClDE,EAAYl4D,KAAK0qD,YAGbrgD,EAAOrK,KAAKL,OAAO6zC,gBAAgBukB,GAAU,EAAM,GACrD1tD,EAAOrK,KAAKL,OAAO2rC,SACjBtrC,KAAK0yD,cAAcqF,EAAU/3D,KAAK0qD,aAClCrgD,EACA4tD,OAIG,CACDtoC,EAAO3vB,KAAK6yB,gBAAgBlD,KAC5BmkC,EAAY9zD,KAAK6yB,gBAAgBxC,oBACnCrwB,KAAK0qD,aACJ/6B,EAAKyF,YAAY2iC,EAAU/3D,KAAK0qD,cAEnCrgD,EAAO1K,EAAO2rC,SACZtrC,KAAK0yD,cACH/yD,EAAOkpC,eAAeirB,EAAU1mC,MAAO2qC,GACvC/3D,KAAK0qD,aAEP/qD,EAAOgpC,eACLllC,OAAOqwD,GAAW1mC,MAClBptB,KAAK0qD,YAAYz6B,gBAEnBgoC,GAGJ,MAEF,QACEx0D,QAAO,GACP4G,EAAOrK,KAAKL,OAAO6sC,oBAGvB,OAAO4rB,EACHp4D,KAAKi1D,2BAA2B3pD,EAAMjB,EAAM8qD,GAAkB34C,EAAAyE,KAAKc,MACnE1X,GAGNigD,EAAAroD,UAAAm4D,qBAAA,SACEC,EACA/4D,EACAg5D,EACA7M,GAEA,IAAI8M,EACAC,EAAyB,EAO7B,OANIH,EAAiBtyD,GAAGtB,EAAApE,YAAY0sB,WAClCyrC,EAAUF,EACVC,MAEAA,GAAwBj5D,GAEnBtB,KAAKy6D,kBACVJ,EACAE,EACA9M,EACA+M,EACAH,EAAiB3yC,aAAa+zB,EAAAx8B,eAAe5I,UAIjDi0C,EAAAroD,UAAAo2D,sBAAA,SACEgC,EACA/uD,EACAysD,EACAxsD,EACAkiD,GAEA,IAAI8M,EACAC,EAAyB,EAC7B,GAAIH,EAAiBtyD,GAAGtB,EAAApE,YAAY0sB,UAAW,CAC7C,IAAInnB,EAASnE,OAAO42D,EAAiBzyD,QACrCnE,OAAOmE,EAAOb,MAAQ00C,EAAAz8B,YAAYvH,OAClC+iD,EAAUzC,EACVwC,GAAwBhvD,QAExBgvD,GAAwBjvD,EAAMC,GAShC,OAPUvL,KAAKy6D,kBACbJ,EACAE,EACA9M,EACA+M,EACAH,EAAiB3yC,aAAa+zB,EAAAx8B,eAAe5I,UAKjDi0C,EAAAroD,UAAAs2D,kBAAA,SAAkBttD,EAAwByvD,EAA6BvF,GACrE,IAOI7Y,EANA97B,EADUxgB,KAAKusB,QACI/L,SACnBqS,EAAkB7yB,KAAK6yB,gBACvBb,EAASxR,EAASm6C,kBAAkB1vD,EAAY4nB,GACpD,IAAKb,EAAQ,OAAOhyB,KAAKL,OAAO6sC,oBAIhC,OAAQxa,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAY5I,OACf,IAAKpW,KAAKsuD,cAAsBt8B,GAC9B,OAAOhyB,KAAKL,OAAO6sC,oBAErB/oC,OAAgBuuB,EAAQ1pB,MAAQkU,EAAAyE,KAAKc,MAGvC,KAAK05B,EAAAz8B,YAAYqO,MACjB,KAAKouB,EAAAz8B,YAAYoS,MACfkrB,EAAmCtqB,EAAQ1pB,KAC3C,MAEF,KAAKmzC,EAAAz8B,YAAYuL,SACf,IAAIE,EAA6BuH,EAAQvH,gBACzC,GAAIA,EAAiB,CACnB,IAAI5E,EAAW7lB,KAAKwgB,SAAS6F,gBAAgBoE,EAAiB,MAC9D,IAAK5E,EAAU,OAAO7lB,KAAKL,OAAO6sC,oBAClC/oC,OAAmD,GAA5CoiB,EAAS5S,UAAUqT,eAAehhB,QACzCg3C,EAAaz2B,EAAS5S,UAAUqT,eAAe,GAC/C,MAMF,OAJAtmB,KAAKuG,MACHgW,EAAAzY,eAAe82D,oEACf3vD,EAAW7G,MAAkB4tB,EAAQjP,cAEhC/iB,KAAKL,OAAO6sC,oBAErB,KAAKiP,EAAAz8B,YAAYvH,MACf,GAAI+I,EAASq6C,yBAA0B,CACrC,IAAIC,EAAcjoC,EAAgBlD,KAAK5nB,GAAE,MACrCgzD,EAAqB/oC,EAAQE,eAAeupB,EAAAn/B,aAAaY,YAAa49C,GAC1E,IAAKC,EAaH,OAZyB/oC,EAAQE,eAAeupB,EAAAn/B,aAAaW,YAAa69C,GAOxE96D,KAAKuG,MACHgW,EAAAzY,eAAek3D,+CACf/vD,EAAW7G,MAAe4tB,EAAQjP,cAPpC/iB,KAAKuG,MACHgW,EAAAzY,eAAem3D,qCACfhwD,EAAW7G,MAAe4tB,EAAQjP,cAQ/B/iB,KAAKL,OAAO6sC,oBAErB/oC,OAAqD,GAA9Cs3D,EAAW9nD,UAAUqT,eAAehhB,QAC3Cg3C,EAAaye,EAAW9nD,UAAUqT,eAAe,GACjD,MAIJ,QAKE,OAJAtmB,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,oBAKvB/oC,OAAO64C,GAAc9/B,EAAAyE,KAAKc,MAC1B,IAAIu4C,EAAYt6D,KAAKkvD,kBAAkBwL,EAAiBpe,EAAU,KAClE,OAAOt8C,KAAKi1D,2BACVhqD,EACAqvD,EACAnF,GAAkB34C,EAAAyE,KAAKc,OAI3BuoC,EAAAroD,UAAAgzD,2BAAA,SACEhqD,EACAiwD,EACAC,QAAA,IAAAA,OAAA,GAEA,IAAIx7D,EAASK,KAAKL,OACdqyB,EAAShyB,KAAKwgB,SAASm6C,kBAAkB1vD,EAAYjL,KAAK6yB,iBAC9D,IAAKb,EAAQ,OAAOryB,EAAO6sC,oBAE3B,OAAQxa,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAYqO,MACf,IAAI/kB,EAAe0pB,EAAQ1pB,KAG3B,GAFA7E,OAAO6E,GAAQkU,EAAAyE,KAAKc,MACpB/hB,KAAK0qD,YAAcyQ,EAAM7yD,EAAOkU,EAAAyE,KAAKc,KACzBiQ,EAAQjqB,GAAGtB,EAAApE,YAAYgqB,OAKjC,OAJArsB,KAAKuG,MACHgW,EAAAzY,eAAe82D,oEACf3vD,EAAW7G,MAAO4tB,EAAOjP,cAEpBpjB,EAAO6sC,oBAEhB,IAAI7c,EAAO3vB,KAAK6yB,gBAAgBlD,KAIhC,OAHIrnB,EAAKP,GAAG,KACV4nB,EAAKQ,gBAAwB6B,EAAQ5E,OAAQuC,EAAKyF,YAAY8lC,EAAsB5yD,IAE/E6yD,EACHx7D,EAAOkpC,eAAuB7W,EAAQ5E,MAAO8tC,GAC7Cv7D,EAAO8qC,eAAuBzY,EAAQ5E,MAAO8tC,GAEnD,KAAKzf,EAAAz8B,YAAY5I,OACf,IAAKpW,KAAKsuD,cAAsBt8B,GAAS,OAAOryB,EAAO6sC,oBACnDlkC,EAAgB0pB,EAAQ1pB,KAG5B,GAFA7E,OAAO6E,GAAQkU,EAAAyE,KAAKc,MACpB/hB,KAAK0qD,YAAcyQ,EAAM7yD,EAAOkU,EAAAyE,KAAKc,KACzBiQ,EAAQjqB,GAAGtB,EAAApE,YAAYgqB,OAMjC,OALArsB,KAAKuG,MACHgW,EAAAzY,eAAe82D,oEACf3vD,EAAW7G,MACX4tB,EAAOjP,cAEFpjB,EAAO6sC,oBAGhB,GADA0uB,EAAuBl7D,KAAKw2D,uBAAuB0E,EAAsB5yD,GACrE6yD,EAAK,CACP,IAAIvO,EAAatkD,EAAK2nB,eAClBlN,EAAeiP,EAAOjP,aAC1B,OAAOpjB,EAAOkrC,YAAY,MACxBlrC,EAAOgrC,gBAAgB5nB,EAAcm4C,GACrCv7D,EAAOopC,gBAAgBhmB,EAAc6pC,IACpCA,GAEH,OAAOjtD,EAAOgrC,gBAAgB3Y,EAAOjP,aAAcm4C,GAGvD,KAAKzf,EAAAz8B,YAAYoS,MACf,IAAMvlB,EAAsBmmB,EAAQnmB,YACpC,GACUmmB,EAAQjqB,GAAGtB,EAAApE,YAAY4mB,YAE7BjpB,KAAK6yB,gBAAgB9qB,GAAGtB,EAAApE,YAAYsV,cACrB,MAAf9L,GAC2B,MAA3BA,EAAY5C,YAOd,OAJAjJ,KAAKuG,MACHgW,EAAAzY,eAAe82D,oEACf3vD,EAAW7G,MAAe4tB,EAAQjP,cAE7BpjB,EAAO6sC,oBAEhB,IAAI4uB,EAAiB33D,OAAOzD,KAAKwgB,SAAS66C,uBACtCC,EAAWt7D,KAAK4uD,4BAClBwM,EACAp7D,KAAKghB,QAAQW,UAAS,GAGpBrZ,EAAe0pB,EAAQ1pB,KAC3BtI,KAAK0qD,YAAcyQ,EAAM7yD,EAAOkU,EAAAyE,KAAKc,KACjC6qC,EAAatkD,EAAK2nB,eAKtB,GAJa,IAAT3nB,EAAKvB,OAEPm0D,EAAuBl7D,KAAKw2D,uBAAuB0E,EAAsB5yD,IAEvE6yD,EAAK,CAEHxrC,GADAkD,EAAkB7yB,KAAK6yB,iBACAlD,KAD3B,IAMIokC,EAJYlhC,EAAgBxC,oBAC9B/nB,GACCqnB,EAAKyF,YAAY8lC,EAAsB5yD,IAEX8kB,MAG/B,OAAOztB,EAAOkrC,YAAY,MACxBlrC,EAAO8qC,eAAespB,EAAgBmH,GACtCv7D,EAAO2pC,YACLhhC,EAAKke,SACL80C,EACA37D,EAAOgpC,eAAeorB,EAAgBnH,GACtCA,EACQ56B,EAAQX,cAElB1xB,EAAOgpC,eAAeorB,EAAgBnH,IACrCA,GAGH,OAAOjtD,EAAO2pC,YACZhhC,EAAKke,SACL80C,EACAJ,EACAtO,EACQ56B,EAAQX,cAItB,KAAKoqB,EAAAz8B,YAAYuL,SACf,IAAIE,EAA6BuH,EAAQvH,gBACzC,GAAIA,EAAiB,CACnB,IAAI8wC,EAAiBv7D,KAAKwgB,SAAS6F,gBAAgBoE,EAAiB,MACpE,IAAK8wC,EAAgB,OAAO57D,EAAO6sC,oBAGnC,IAAK2uB,EAAK,CACR,GAAII,EAAexzD,GAAGtB,EAAApE,YAAY0sB,UAAW,CACvCqsC,EAAiB33D,OAAOzD,KAAKwgB,SAAS66C,uBACtCC,EAAWt7D,KAAK4uD,4BAClBwM,EACAp7D,KAAKghB,QAAQW,UAAS,GAGxB,OAAO3hB,KAAKk5D,eAAeqC,GAAkBD,EAAUJ,IAEvD,OAAOl7D,KAAKk5D,eAAeqC,GAAkBL,IAKjD,IAAI1wC,EAA6BwH,EAAQxH,gBACzC/mB,OAA0B,MAAnB+mB,GACP,IAAIgxC,EAAiBx7D,KAAKwgB,SAAS6F,gBAAmCmE,EAAiB,MACvF,IAAKgxC,EAAgB,OAAO77D,EAAO6sC,oBACnC,IACIivB,GADAnyD,EAAakyD,EAAevoD,UAAU3J,YACR2mB,eAClC,GAAIsrC,EAAexzD,GAAGtB,EAAApE,YAAY0sB,UAAW,CACvCqsC,EAAiB33D,OAAOzD,KAAKwgB,SAAS66C,uBACtCC,EAAWt7D,KAAK4uD,4BAClBwM,EACAp7D,KAAKghB,QAAQW,UAAS,GAIpBoyC,EADY/zD,KAAK6yB,gBAAgBxC,oBAAoB/mB,GAAY,GACtC8jB,MAC/B,OAAOztB,EAAOkrC,YAAY,MACxB7qC,KAAKk5D,eAAeqC,GAClB57D,EAAOkpC,eAAekrB,EAAgBuH,GACtCJ,IAEFl7D,KAAKk5D,eAAesC,GAClB77D,EAAOgpC,eAAeorB,EAAgB0H,MAEvCA,GAGH,OAAO97D,EAAOkrC,YAAY,MACxB7qC,KAAKk5D,eAAeqC,GAAkBL,IACtCl7D,KAAKk5D,eAAesC,IACnBC,GAQP,OALEz7D,KAAKuG,MACHgW,EAAAzY,eAAe82D,oEACf3vD,EAAW7G,MAAO4tB,EAAOjP,cAGtBpjB,EAAO6sC,oBAEhB,KAAKiP,EAAAz8B,YAAYvH,MACf,IAAIlL,EAAoBvM,KAAKwgB,SAASq6C,yBACtC,GAAItuD,EAAmB,CACrB,IAAIuuD,EAAc96D,KAAK6yB,gBAAgBlD,KAAK5nB,GAAE,MAC1C2zD,EAAqB1pC,EAAQE,eAAeupB,EAAAn/B,aAAaW,YAAa69C,GAC1E,IAAKY,EAKH,OAJA17D,KAAKuG,MACHgW,EAAAzY,eAAem3D,qCACfhwD,EAAW7G,MAAO4tB,EAAOjP,cAEpBpjB,EAAO6sC,oBAEhB,IAAIuuB,EAAqB/oC,EAAQE,eAAeupB,EAAAn/B,aAAaY,YAAa49C,GAC1E,IAAKC,EAMH,OALA/6D,KAAKuG,MACHgW,EAAAzY,eAAek3D,+CACf/vD,EAAW7G,MAAO4tB,EAAOjP,cAE3B/iB,KAAK0qD,YAAcyQ,EAAMO,EAAWzoD,UAAU3J,WAAakT,EAAAyE,KAAKc,KACzDpiB,EAAO6sC,oBAEhB,IAAI8P,EAAqBtqB,EAAQ1pB,KAO7BqzD,GANAP,EAAiB33D,OAAOzD,KAAKwgB,SAAS66C,uBACtCC,EAAWt7D,KAAK4uD,4BAClBwM,EACAp7D,KAAKghB,QAAQW,UAAS,GAGN3hB,KAAKkvD,kBACrB3iD,EACAiQ,EAAAyE,KAAKG,IAAG,MAIV,GAAI+5C,EAAK,CACP,IAAItoC,EACA+oC,GADA/oC,EAAkB7yB,KAAK6yB,iBACW/C,aAAawsB,GAAY,GAC3Duf,EAAmBhpC,EAAgBxC,oBAAoBrwB,KAAK0qD,aAAa,GACzEphD,EAAaoyD,EAAWzoD,UAAU3J,WAEtC,OADAtJ,KAAK6yB,gBAAgBzC,cAAcwrC,GAC5Bj8D,EAAOkrC,YAAY,MACxB7qC,KAAKk5D,eAAe6B,GAClBp7D,EAAOkpC,eAAe+yB,EAAgBxuC,MAAOkuC,GAC7C37D,EAAOkpC,eAAegzB,EAAiBzuC,MAAOuuC,GAC9CT,IAEFl7D,KAAKk5D,eAAewC,GAClB/7D,EAAOgpC,eAAeizB,EAAgBxuC,MAAOwuC,EAAgBtzD,KAAK2nB,gBAClEtwB,EAAOgpC,eAAekzB,EAAiBzuC,MAAOyuC,EAAiBvzD,KAAK2nB,mBAErE3mB,EAAW2mB,gBAEd,OAAOjwB,KAAKk5D,eAAe6B,GACzBO,EACAK,EACAT,KAWV,OAJAl7D,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,qBAGhB8d,EAAAroD,UAAAyzD,sBAAA,SAAsBzqD,EAA4BkqD,GAChD,IAKIliD,EACA6oD,EANAn8D,EAASK,KAAKL,OACdkzB,EAAkB7yB,KAAK6yB,gBACvBb,EAAShyB,KAAKwgB,SAASm6C,kBAAkB1vD,EAAWA,WAAY4nB,GACpE,IAAKb,EAAQ,OAAOryB,EAAO6sC,oBAI3B,OAAQxa,EAAOjrB,MAGb,KAAK00C,EAAAz8B,YAAYgH,mBACf,IAAI/jB,EAA+B+vB,EAC/B5pB,EAAgB6C,EAAW7C,cAG/B,GAAInG,EAAUylB,aAAa+zB,EAAAx8B,eAAe/I,SACxC,OAAOlW,KAAK+7D,6BAA6B95D,EAAWgJ,EAAYkqD,GAGlE,IAAItvC,EAA4B,KAGhC,GAAIzd,EAAe,CACjB,IAAKnG,EAAU8F,GAAGtB,EAAApE,YAAY6jB,SAK5B,OAJAlmB,KAAKuG,MACHgW,EAAAzY,eAAek4D,sBACf/wD,EAAWA,WAAW7G,MAAOnC,EAAU8gB,cAElCpjB,EAAO6sC,oBAEhB3mB,EAAW7lB,KAAKwgB,SAASsvC,iCACvB7tD,EACAmG,EACAlF,EAAA2sD,QAAqB7vD,KAAK6yB,gBAAgBlD,KAAKjC,yBAC/CziB,OAIG,IAAIhJ,EAAU8F,GAAGtB,EAAApE,YAAY6jB,SAAU,CAI5C,IAHA,IAAI+1C,EAAgB,IAAI98C,IACpBrP,EAAiBrM,OAAOxB,EAAU4J,YAAYiE,gBAC9CosD,EAAoBpsD,EAAexK,OAC9BjF,EAAI,EAAGA,EAAI67D,IAAqB77D,EACvC47D,EAAc/zD,IAAI4H,EAAezP,GAAGO,KAAKwE,KAAM,MAGjD,IAAIkhB,EAAiBrkB,EAAU4J,YAAYoH,UAAU5J,WACjD8yD,EAAoB71C,EAAehhB,OACnCi1D,EAAsBtvD,EAAWnB,UACjCsyD,EAAe7B,EAAoBj1D,OACnC+2D,EAAgB,IAAIl2D,MAAqBi2D,GAC7C,IAAS/7D,EAAI,EAAGA,EAAI87D,IAAqB97D,EAAG,CAC1C,IAAIi8D,EAAWh2C,EAAejmB,GAAGiI,KAC7B1H,EAAO07D,EAASv1D,MAAQ0V,EAAA5V,SAAS6O,KAAkB4mD,EAAU17D,KAAKwE,KAAO,KACzEm3D,EAAqBl8D,EAAI+7D,EACzB7B,EAAoBl6D,GACpB4B,EAAU4J,YAAYoH,UAAU5J,WAAWhJ,GAAG4I,YAClD,IAAKszD,EAKH,OAJAv8D,KAAKuG,MACHgW,EAAAzY,eAAeomB,+BACfjf,EAAW7G,MAAO+3D,EAAkBt3D,SAAS,IAAKu3D,EAAav3D,SAAS,KAEnElF,EAAO6sC,oBAEhB,GAAa,OAAT5rC,GAAiBq7D,EAAct2C,IAAI/kB,GAAO,CAE5C,GADI47D,EAAeP,EAAc/6D,IAAIN,GACnB,CAChBy7D,EAAch8D,GAAKL,KAAK4uD,4BAA4B2N,EAAoBC,EAAY,GACpF,IAAIrE,OAAU,EACd,KAAMA,EAAa37C,EAAAyE,KAAK47B,iBAAiB2f,EAAcx8D,KAAK0qD,aAAa,OACjEyN,EAAa37C,EAAAyE,KAAK47B,iBAAiB2f,EAAcx8D,KAAK0qD,aAAa,IAKvE,OAJA1qD,KAAKuG,MACHgW,EAAAzY,eAAe+qD,mCACfvoC,EAAejmB,GAAGiI,KAAKlE,MAAOpE,KAAK0qD,YAAY7lD,WAAY23D,EAAa33D,YAEnElF,EAAO6sC,oBAGlBgwB,EAAerE,OAEfkE,EAAch8D,GAAKL,KAAK4uD,4BAA4B2N,EAAoB//C,EAAAyE,KAAKG,IAAG,GAChFo7C,EAAex8D,KAAK0qD,YAGtBuR,EAAc/zD,IAAItH,EAAM47D,OACnB,CACL,IAAIC,EAAez8D,KAAKwgB,SAASiuC,YAC/BnoC,EAAejmB,GAAGiI,KAClBtI,KAAK6yB,gBAAgBlD,KAAKjC,yBAE5B,IAAK+uC,EAAc,OAAO98D,EAAO6sC,oBACjC6vB,EAAch8D,GAAKL,KAAKkvD,kBACtBqN,EACAE,EAAY,MAMlB,IAAIC,EAAwB,IAAIv2D,MAAY+1D,GAC5C,IAAS77D,EAAI,EAAGA,EAAI67D,IAAqB77D,EAAG,CAC1C,IAAIm8D,EAAe/4D,OAAOw4D,EAAc/6D,IAAI4O,EAAezP,GAAGO,KAAKwE,OACnEs3D,EAAsBr8D,GAAKm8D,EAO7B,OALA32C,EAAW7lB,KAAKwgB,SAAS6F,gBACvBpkB,EACAy6D,EACAx5D,EAAA2sD,QAAqB7vD,KAAK6yB,gBAAgBlD,KAAKjC,2BAG1C1tB,KAAKk5D,eAAerzC,EAAUw2C,GADfr8D,KAAKL,OAAO6sC,oBAQlC3mB,EAAW7lB,KAAKwgB,SAAS6F,gBAAgBpkB,EAAW,MAEtD,IAAK4jB,EAAU,OAAO7lB,KAAKL,OAAO6sC,oBAGlC,IAAI8uB,EAA0B,EAS9B,OARIz1C,EAAS9d,GAAGtB,EAAApE,YAAY0sB,YAC1BusC,EAAWt7D,KAAK4uD,4BACdnrD,OAAOzD,KAAKwgB,SAAS66C,uBACrBr7D,KAAKghB,QAAQW,UAAS,IAKnB3hB,KAAKy6D,kBACV50C,EACA5a,EAAWnB,UACXmB,EACAqwD,EACAz1C,EAAS6B,aAAa+zB,EAAAx8B,eAAe5I,SAKzC,KAAKolC,EAAAz8B,YAAYqO,MACf,GAAIpa,EAAoB+e,EAAQ1pB,KAAKie,mBAAoB,CAErDu1C,EADU9pC,EAAQjqB,GAAGtB,EAAApE,YAAY2qB,SACtBrtB,EAAO2nC,UAAUoI,QAAgB1d,EAAQjF,uBAEzCptB,EAAOgpC,eAAuB3W,EAAQ5E,MAAK,GAExD,MAMA,OAJAptB,KAAKuG,MACHgW,EAAAzY,eAAe64D,uGACf1xD,EAAW7G,MAAe4tB,EAAQ1pB,KAAKzD,YAElClF,EAAO6sC,oBAGlB,KAAKiP,EAAAz8B,YAAY5I,OACf,GAAInD,EAAqB+e,EAAQ1pB,KAAKie,mBAAoB,CACxDu1C,EAAWn8D,EAAOopC,gBAAyB/W,EAAQjP,aAAuBiP,EAAQ1pB,KAAK2nB,gBACvF,MAMA,OAJAjwB,KAAKuG,MACHgW,EAAAzY,eAAe64D,uGACf1xD,EAAW7G,MAAgB4tB,EAAQ1pB,KAAKzD,YAEnClF,EAAO6sC,oBAGlB,KAAKiP,EAAAz8B,YAAYoS,MAEf,GAAIne,GADA3K,EAAe0pB,EAAQ1pB,MACNie,mBAAoB,CACvC,IAAI60C,EAAiB33D,OAAOzD,KAAKwgB,SAAS66C,uBACtCC,EAAWt7D,KAAK4uD,4BAClBwM,EACAp7D,KAAKghB,QAAQW,UAAS,GAGxBm6C,EAAWn8D,EAAOspC,WAChB,GACA,EACAqyB,EAAQ,EAEAtpC,EAAQX,cAElB,MAMA,OAJArxB,KAAKuG,MACHgW,EAAAzY,eAAe64D,uGACf1xD,EAAW7G,MAAOkE,EAAKzD,YAElBlF,EAAO6sC,oBAGlB,KAAKiP,EAAAz8B,YAAY+R,gBACf9d,EAA6B+e,EAAQ/e,UACrC6oD,EAAW97D,KAAKkvD,kBACdjkD,EAAWA,WACM+mB,EAAQ1pB,KAAI,KAI/B,MAGF,KAAKmzC,EAAAz8B,YAAYuL,SAEf,IAAIjiB,EAEJ,GAHAwzD,EAAW97D,KAAK48D,cAAwB5qC,EAAQ/mB,EAAWA,cAE3DgI,GADI3K,EAAOtI,KAAK0qD,aACCnkC,oBAMf,OAJAvmB,KAAKuG,MACHgW,EAAAzY,eAAe64D,uGACf1xD,EAAW7G,MAAOkE,EAAKzD,YAElBlF,EAAO6sC,oBAEhB,MAIF,QAKE,OAJAxsC,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAGlB,OAAOxsC,KAAK68D,oBACV5pD,EACA6oD,EACA7wD,EAAWnB,UACXmB,IAIIq/C,EAAAroD,UAAA85D,6BAAR,SACE95D,EACAgJ,EACAkqD,GAEA,IAAI/sD,EAA+B,KAI/B00D,EAAoB7xD,EAAW7C,cAC/B6C,EAAW7C,gBACRnG,EAAU8F,GAAGtB,EAAApE,YAAY6jB,UAC5BlmB,KAAKuG,MACHgW,EAAAzY,eAAek4D,sBACf/wD,EAAW7G,MAAOnC,EAAU8gB,cAGhC3a,EAAgBpI,KAAKwgB,SAASu8C,qBAC5Bt5D,OAAOxB,EAAU4J,YAAYiE,gBAC7BgtD,EACA55D,EAAA2sD,QAAqB7vD,KAAK6yB,gBAAgBlD,KAAKjC,yBAC/CziB,IAKJ,IAAIZ,EAAOq/C,EAAAsT,YACTh9D,KACAiC,EACAmG,EACA6C,EAAWnB,UACXqrD,EACAlqD,GAEF,OAAKZ,IACHrK,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,sBASvB8d,EAAAroD,UAAAg7D,mBAAA,SACEhqD,EACAmpD,EACAc,EACAzP,GAKA,GAAIyP,IAAwB,MADbjqD,EAAUgc,UAMvB,OAJAjvB,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,QAEN,EAIT,IAAIu5C,EAAU1qC,EAAU0qC,QACxB,GAAIA,EAKF,OAJA39C,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,QAEN,EAGT,IAAI+4D,EAAUlqD,EAAUyqC,mBACpBvO,EAAUl8B,EAAUqT,eAAehhB,OAGvC,OAAI82D,EAAee,GACjBn9D,KAAKuG,MACH42D,EAAUhuB,EACN5yB,EAAAzY,eAAes5D,wCACf7gD,EAAAzY,eAAeomB,+BACnBujC,EAAWrpD,MAAO+4D,EAAQt4D,WAAYu3D,EAAav3D,aAE9C,KAILu3D,EAAejtB,IAAYwO,KAC7B39C,KAAKuG,MACHgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO+qC,EAAQtqC,WAAYu3D,EAAav3D,aAE9C,IAOXylD,EAAAroD,UAAAw4D,kBAAA,SACE50C,EACA00C,EACA9M,EACA+M,EACA6C,QADA,IAAA7C,MAAA,QACA,IAAA6C,OAAA,GAEA,IAAIjB,EAAe7B,EAAoBj1D,OACnC2N,EAAY4S,EAAS5S,UAEzB,IAAKjT,KAAKi9D,mBACRhqD,EACAmpD,EACW,GAAX5B,EACA/M,GAEA,OAAOztD,KAAKL,OAAO6sC,oBAIrB,GAAI6wB,EAAQ,CAEV,GADA55D,QAAQoiB,EAAS9d,GAAGtB,EAAApE,YAAYgvD,cAC5BrxD,KAAKwqD,uBAAuB8S,SAASz3C,GAKlC,CACL7lB,KAAKwqD,uBAAuB3kD,KAAKggB,GACjC,IAAIxb,EAAOrK,KAAKu9D,2BAA2B13C,EAAU00C,EAAqB9M,EAAY+M,GAEtF,OADAx6D,KAAKwqD,uBAAuBt6B,MACrB7lB,EARPrK,KAAKsG,QACHiW,EAAAzY,eAAe05D,yCACf/P,EAAWrpD,MAAOyhB,EAAS9C,cAWjC,IAAI06C,EAAuBjD,EAAU4B,EAAe,EAAIA,EACpD5zB,EAAW,IAAIriC,MAAqBs3D,GACpCrwC,EAAQ,EACRotC,IACFhyB,EAAS,GAAKgyB,EACdptC,EAAQ,GAGV,IADA,IAAI9G,EAAiBrT,EAAUqT,eACtBjmB,EAAI,EAAGA,EAAI+7D,IAAgB/7D,IAAK+sB,EACvCob,EAASpb,GAASptB,KAAKkvD,kBACrBqL,EAAoBl6D,GACpBimB,EAAejmB,GAAE,KAMrB,OADAoD,OAAO2pB,GAASqwC,GACTz9D,KAAKk5D,eAAerzC,EAAU2iB,IAI/B8hB,EAAAroD,UAAAs7D,2BAAR,SACE13C,EACA00C,EACA9M,EACA+M,gBAAA,IAAAA,MAAA,GAEA,IAAI4B,EAAe7B,EAAoBj1D,OACnC2N,EAAY4S,EAAS5S,UACrB4f,EAAkB7yB,KAAK6yB,gBACvBlzB,EAASK,KAAKL,OACdkM,EAAcga,EAAS5jB,UAAU4J,YAGjC6xD,EAAe7qC,EAAgBlD,KAC/BsD,EAAcpN,EAAS9C,aAAe,aAAe8C,EAAS4I,gBAAgB5pB,SAAS,IACvFyE,EAAauc,EAAS5S,UAAU3J,WAChCqmB,EAAO8rB,EAAA7rB,KAAKjuB,OAAOkxB,GACvBlD,EAAKznB,IAAG,MACRynB,EAAKsD,YAAcA,EACnBtD,EAAKrmB,WAAaA,EAClBqmB,EAAKjC,wBAA0B7H,EAAS6H,wBAIxC,IAAIxa,KACJ,GAAIsnD,EAAS,CACX,IAAI5yD,EAASnE,OAAOoiB,EAASje,QAE7B,GADAnE,OAAOmE,EAAOb,MAAQ00C,EAAAz8B,YAAYvH,OAC9BiF,EAAA2Y,gBAAgBmlC,IAAY99C,EAAA4Y,aAAaC,SAAU,CACrD5F,EAAKkE,oBACHnX,EAAA8Y,iBAAiBglC,GACT5yD,EAAQU,KAChB,SAEEq1D,EAAqB/1D,EAAQ2pB,OAE/B5B,EAAKkE,oBACHnX,EAAA8Y,iBAAiBglC,GACjBmD,EAAWr1D,KACX,aAGC,CACL,IAIIq1D,EAJAC,EAAYjuC,EAAKgE,eAAuB/rB,EAAQU,KAAM,QAAQ,GAClE4K,EAAKrN,KACHlG,EAAO8qC,eAAemzB,EAAUxwC,MAAOotC,KAErCmD,EAAqB/1D,EAAQ2pB,OAE/B5B,EAAKkE,oBACH+pC,EAAUxwC,MACVuwC,EAAWr1D,KACX,UAMR,IADA,IAAIge,EAAiBrT,EAAUqT,eACtBjmB,EAAI,EAAGA,EAAI+7D,IAAgB/7D,EAAG,CACrC,IAAIw9D,EAAY79D,KAAKkvD,kBACnBqL,EAAoBl6D,GACpBimB,EAAejmB,GAAE,KAInB,GAAIqc,EAAA2Y,gBAAgBwoC,IAAcnhD,EAAA4Y,aAAaC,SAC7C5F,EAAKkE,oBACHnX,EAAA8Y,iBAAiBqoC,GACjBv3C,EAAejmB,GACf4S,EAAUyc,iBAAiBrvB,QAGxB,CACL,IAAIy9D,EAAgBnuC,EAAKgE,eACvBrN,EAAejmB,GACf4S,EAAUyc,iBAAiBrvB,IAC1BsvB,EAAKyF,YAAYyoC,EAAWv3C,EAAejmB,KAE9C6S,EAAKrN,KACHlG,EAAO8qC,eAAeqzB,EAAc1wC,MAAOywC,KAMjDhrC,EAAgBlD,KAAOA,EACvB,IAAIsuB,EAAgBhrC,EAAUqT,eAAehhB,OAC7C,IAASjF,EAAI+7D,EAAc/7D,EAAI49C,IAAiB59C,EAAG,CACjD,IAAIkuD,EAAWvuD,KAAKkvD,kBAClBzrD,OAAOoI,EAAYoH,UAAU5J,WAAWhJ,GAAG4I,aAC3Cqd,EAAejmB,GAAE,KAIfy9D,EAAgBnuC,EAAKgE,eACvBrN,EAAejmB,GACf4S,EAAUyc,iBAAiBrvB,IAC1BsvB,EAAKyF,YAAYm5B,EAAUjoC,EAAejmB,KAE7C6S,EAAKrN,KACHlG,EAAO8qC,eAAeqzB,EAAc1wC,MAAOmhC,IAK/C,IAAI0E,EAAgBxvD,OAAOoI,EAAYqH,MACvC,GAAI+/C,EAAclsD,MAAQ0V,EAAA5V,SAAS8R,MAEjC,IADA,IAAIpJ,EAA8B0jD,EAAe1jD,WACjC1E,GAAPxK,EAAI,EAAOkP,EAAWjK,QAAQjF,EAAIwK,IAAKxK,EAAG,CACjD,IAAIuJ,EAAO5J,KAAKouD,iBAAiB7+C,EAAWlP,IAC5C,GAAIqc,EAAA2Y,gBAAgBzrB,IAAS8S,EAAA4Y,aAAag9B,MACxCp/C,EAAKrN,KAAK+D,GACN+lB,EAAK1nB,MAAK,KAA6B,WAI/CiL,EAAKrN,KAAK7F,KAAKouD,iBAAiB6E,IAIlC,IAAIrgC,EAAejD,EAAKiD,aACxB,GAAIA,EAAc,KAChB,IAAwB,IAAAvD,EAAAnL,EAAA0O,EAAallB,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAA1C,IAAIqP,EAAWnP,EAAAhjB,MACdmyB,EAAY1rB,GAAGtB,EAAApE,YAAYqxB,SAC7Bb,EAAgBzC,cAAcqD,qGAGlC9D,EAAKiD,aAAe,KAOtB,OALAjD,EAAKc,WACLzwB,KAAK6yB,gBAAgBlD,KAAO+tC,EAC5B19D,KAAK0qD,YAAcphD,EAGfA,GAAckT,EAAAyE,KAAKc,MAAS4N,EAAK1nB,MAAK,IAOnC0nB,EAAK5nB,GAAE,GACVpI,EAAOkrC,YAAY5X,EAAa/f,EAAM5J,EAAW2mB,gBACjD/c,EAAK5N,OAAS,EACZ3F,EAAOkrC,YAAY,KAAM33B,EAAM5J,EAAW2mB,gBAC1C/c,EAAK5N,OACH4N,EAAK,GACLvT,EAAO6rC,aAZbxrC,KAAKuG,MACHgW,EAAAzY,eAAe0sD,+DACf3kD,EAAYoH,UAAU3J,WAAWlF,OAE5BzE,EAAO6sC,sBAYlB8d,EAAAroD,UAAAuqD,iBAAA,SAAiBuR,GAQf,IAAI1vC,EAAa0vC,EAAS1vC,WAC1B,GAAIA,EAAY,OAAOA,EAEvB,IAAI2vC,EAAoBD,EAAS9qD,UAC7BgrD,EAAeF,EAASh7C,aACxBm7C,EAAyBF,EAAkB13C,eAC3C63C,EAAgCJ,EAAS97D,UAAU4J,YAAYoH,UAAU5J,WACzE+0D,EAAmBJ,EAAkB10D,WACrC+0D,EAAiBL,EAAkB/uC,SACnCqvC,EAAaP,EAASh2D,GAAGtB,EAAApE,YAAY0sB,UAGrCwvC,EAAeP,EAAkBtgB,mBACjC8gB,EAAcD,EACdE,EAAeP,EAAuB54D,OACtCo5D,EAAcD,EACdH,MACAE,IACAE,GAEJ,IAAIC,EAAcl7D,OAAOi7D,EAAcF,GAEnCI,EAAoB,IAAIz4D,MAAqBq4D,GAC7CK,EAAe,EAGfl/D,EAASK,KAAKL,OACd2+D,IACFM,EAAkB,GAAKj/D,EAAOgpC,eAAe,EAAG3oC,KAAKghB,QAAQ6rC,gBAC7DgS,EAAe,GAIjB,IAAK,IAAIx+D,EAAI,EAAGA,EAAIk+D,IAAgBl+D,IAAKw+D,EACvCD,EAAkBC,GAAgBl/D,EAAOgpC,eAAek2B,EAAcX,EAAuB79D,GAAG4vB,gBAElGxsB,OAAOo7D,GAAgBL,GAGvB,IAAIM,EAAsB,IAAItiD,EAAA+gC,UAAU2gB,EAAwBE,EAAkBC,GAC9EU,EAAiBd,EAAe,cACpCa,EAAoBphB,mBAAqB+gB,GACzCpwC,EAAa,IAAIotB,EAAA5tB,SACfkwC,EAAS97D,UACT88D,EACAD,EACAf,EAASn2D,OACTm2D,EAASrwC,0BAEAxlB,IAAI61D,EAASl2D,MAAQpB,EAAApE,YAAYgvD,WAAa5qD,EAAApE,YAAYqqD,UACrEqR,EAAS1vC,WAAaA,EAItB,IAAI8/B,EAAmBnuD,KAAK6yB,gBAC5B7yB,KAAK6yB,gBAAkBxE,EAGvB,IAAI2d,EAAW2yB,EAAc,EACzBlxD,EAAQ,IAAItH,MAAc6lC,GAC1BgzB,EAAM,KAAOL,EAAY95D,SAAS,IACtC,IAASxE,EAAI,EAAGA,EAAI2rC,IAAY3rC,EAAG,CACjC,IAAIqP,EAAQrP,EAAEwE,SAAS,IAAMm6D,EAC7BvxD,EAAMpN,GAAKqP,EAEb,IAAIwD,EAAOvT,EAAOkrC,YAAYp9B,EAAM,IAClC9N,EAAOkrC,YAAY,cACjBlrC,EAAOmsC,aAAar+B,EAAO,aAEzB8wD,EACI5+D,EAAO0oC,aACL3rB,EAAAwZ,SAASyiC,OACTh5D,EAAOopC,gBAAgB,QAAO,GAC9BppC,EAAO2nC,UAAUi3B,IAEnB5+D,EAAOopC,gBAAgB,QAAO,MAGtCppC,EAAO6sC,sBAET,IAASnsC,EAAI,EAAGA,EAAIs+D,IAAet+D,IAAKw+D,EAAc,CACpD,IAAIv2D,EAAO41D,EAAuBK,EAAel+D,GAC7CwL,EAAcsyD,EAA8BI,EAAel+D,GAC3D4I,EAAc4C,EAAY5C,YAC1BslD,OAAQ,EACRtlD,EACFslD,EAAW5uD,EAAO8qC,eAAeo0B,EAC/B7+D,KAAKkvD,kBACHjmD,EACAX,EAAI,OAMRtI,KAAKuG,MACHgW,EAAAzY,eAAem7D,4CACfpzD,EAAYzH,OAEdmqD,EAAW5uD,EAAO6sC,qBAEpBt5B,EAAOvT,EAAOkrC,YAAYp9B,EAAMpN,EAAI,IAClC6S,EACAq7C,IAEFqQ,EAAkBC,GAAgBl/D,EAAOgpC,eAAek2B,EAAcv2D,EAAK2nB,gBAE7EjwB,KAAK6yB,gBAAkBs7B,EACvB1qD,OAAOo7D,GAAgBH,GAEvB,IAAIhT,EAAU/rD,EAAOotC,YACnBgyB,EACA/+D,KAAK2rD,mBACHmT,EAAoBx4C,eACpBw4C,EAAoBx1D,WACpBw1D,EAAoB7vC,UAEtBzS,EAAA2gC,mBAAmB9uB,EAAWL,kBAC9BruB,EAAOkrC,YAAY,MACjB33B,EACAvT,EAAOwsC,WACL8xB,EACAW,EACAR,EAAiBnuC,iBAElBmuC,EAAiBnuC,iBAGtB,OADA5B,EAAWoC,SAAS9wB,EAAQ+rD,GACrBr9B,GAIDi8B,EAAAroD,UAAAi9D,cAAR,WAEE,IAAKl/D,KAAK8qD,QAAS,CACjB,IAAInrD,EAASK,KAAKL,OAClBK,KAAK8qD,QAAUnrD,EAAO+sC,UAHL,QAIH,GAEZ,EACA/sC,EAAO2nC,UAAU,IAGrB,MAVmB,SAcbgjB,EAAAroD,UAAAwqD,cAAR,WAEE,IAAKzsD,KAAK+qD,QAAS,CACjB,IAAIprD,EAASK,KAAKL,OAClBK,KAAK+qD,QAAUprD,EAAOotC,YAHL,WAIf/sC,KAAK2rD,oBAAqBnvC,EAAAyE,KAAKQ,KAAOjF,EAAAyE,KAAKc,MAC3C,KACApiB,EAAOgrC,gBAAgB3qC,KAAKk/D,gBAC1Bv/D,EAAOgpC,eAAe,EAAC,KAG3BhpC,EAAO6tC,kBAVU,WAUsB,YAEzC,MAZmB,YAgBrB8c,EAAAroD,UAAAi3D,eAAA,SACErzC,EACA2iB,QAAA,IAAAA,MAAA,MAEA,IAAI22B,EAAc32B,EAAWA,EAASljC,OAAS,EAC3C82D,EAAe+C,EAEfX,EADe34C,EAAS5S,UAAUyqC,mBAElC+gB,EAAe54C,EAAS5S,UAAUqT,eAAehhB,OACjDo5D,EAAcD,EACd54C,EAAS9d,GAAGtB,EAAApE,YAAY0sB,cACxByvC,IACAE,IACAtC,GAEJ34D,OAAO07D,GAAeX,GAEtB,IAAI7+D,EAASK,KAAKL,OAClB,IAAKK,KAAK+vD,gBAAgBlqC,GAAW,OAAOlmB,EAAO6sC,oBACnD,IAAIljC,EAAauc,EAAS5S,UAAU3J,WAChC81D,EAAev5C,EAAS9d,GAAGtB,EAAApE,YAAY0sD,eAG3C,GAAIoQ,EAAcT,EAAa,CACxBl2B,KACHA,EAAW,IAAIriC,MAAMu4D,IACZp5D,OAAS,GAKpB,IAHA,IAAIghB,EAAiBT,EAAS5S,UAAUqT,eACpC+4C,EAAiBx5C,EAAS5jB,UAAU4J,YAAYoH,UAAU5J,WAC1Di2D,GAA0B,EACrBj/D,EAAI+7D,EAAc/7D,EAAIo+D,IAAgBp+D,EAAG,CAChD,IAAI4I,EAAco2D,EAAeh/D,GAAG4I,YACpC,GAAsB,OAAhBA,IAAwBwT,EAAA3V,oBAAoBmC,EAAYlC,MAAQ,CACpEu4D,GAA0B,EAC1B,OAGJ,GAAIA,EACF,IAASj/D,EAAI+7D,EAAc/7D,EAAIo+D,IAAgBp+D,EAC7CmoC,EAAS3iC,KACP7F,KAAKkvD,kBACSmQ,EAAeh/D,GAAG4I,YAC9Bqd,EAAejmB,GAAE,UAMlB,CACL,IAASA,EAAI+7D,EAAc/7D,EAAIo+D,IAAgBp+D,EAC7CmoC,EAAS3iC,KAAKygB,EAAejmB,GAAG28C,aAAar9C,IAE/C,IAAKy/D,EAAc,CACjB,IAAIrB,EAAWl4C,EAEf,GADAA,EAAW7lB,KAAKwsD,iBAAiB3mC,IAC5B7lB,KAAK+vD,gBAAgBlqC,GAAW,OAAOlmB,EAAO6sC,oBACnD3mB,EAAS8J,KAAK9nB,MAAQk2D,EAASpuC,KAAK9nB,MACpC7H,KAAKusB,QAAQhN,gBAAgBrX,IAAI2d,EAAS9C,aAAc8C,GACxD,IAAI41C,EAAmBnyD,EAAW2mB,eAElC,OADAjwB,KAAK0qD,YAAcphD,EACZ3J,EAAOkrC,YAAY,MACxBlrC,EAAOgrC,gBAAgB3qC,KAAKk/D,gBAAiBv/D,EAAO2nC,UAAU80B,IAC9Dz8D,EAAOwsC,WAAWtmB,EAAS9C,aAAcylB,EAAUizB,IAClDA,KAOT,OADAz7D,KAAK0qD,YAAcphD,EACZ3J,EAAOwsC,WAAWtmB,EAAS9C,aAAcylB,EAAUl/B,EAAW2mB,iBAIvEq6B,EAAAroD,UAAA46D,oBAAA,SACE5pD,EACA6oD,EACAvB,EACA9M,EACA+M,QAAA,IAAAA,MAAA,GAEA,IAAI4B,EAAe7B,EAAoBj1D,OAEvC,IAAKtF,KAAKi9D,mBACRhqD,EACAmpD,EACW,GAAX5B,EACA/M,GAEA,OAAOztD,KAAKL,OAAO6sC,oBAGrB,IAAIixB,EAAuBjD,EAAU4B,EAAe,EAAIA,EACpD5zB,EAAW,IAAIriC,MAAqBs3D,GACpCrwC,EAAQ,EACRotC,IACFhyB,EAAS,GAAKgyB,EACdptC,EAAQ,GAGV,IADA,IAAI9G,EAAiBrT,EAAUqT,eACtBjmB,EAAI,EAAGA,EAAI+7D,IAAgB/7D,IAAK+sB,EACvCob,EAASpb,GAASptB,KAAKkvD,kBACrBqL,EAAoBl6D,GACpBimB,EAAejmB,GAAE,KAMrB,OADAoD,OAAO2pB,GAASqwC,GACTz9D,KAAKu/D,iBAAiBtsD,EAAW6oD,EAAUtzB,IAIpD8hB,EAAAroD,UAAAs9D,iBAAA,SACEtsD,EACA6oD,EACAtzB,QAAA,IAAAA,MAAA,MAEA,IAAI22B,EAAc32B,EAAWA,EAASljC,OAAS,EAC3C82D,EAAe+C,EAEfX,EADevrD,EAAUyqC,mBAEzB+gB,EAAexrD,EAAUqT,eAAehhB,OACxCo5D,EAAcD,EACdxrD,EAAUgc,aACVuvC,IACAE,IACAtC,GAEJ34D,OAAO07D,GAAeX,GAEtBx+D,KAAK2rD,mBAAmB14C,EAAUqT,eAAgBrT,EAAU3J,WAAY2J,EAAUgc,UAClF,IAAItvB,EAASK,KAAKL,OAGlB,GAAIw/D,EAAcT,EAAa,CACxBl2B,KACHA,EAAW,IAAIriC,MAAMu4D,IACZp5D,OAAS,GAGpB,IADA,IAAIghB,EAAiBrT,EAAUqT,eACtBjmB,EAAI+7D,EAAc/7D,EAAIo+D,IAAgBp+D,EAC7CmoC,EAAS3iC,KAAKygB,EAAejmB,GAAG28C,aAAar9C,IAIjD,IAAI2J,EAAa2J,EAAU3J,WAE3B,OADAtJ,KAAK0qD,YAAcphD,EACZ3J,EAAOkrC,YAAY,MACxBlrC,EAAOgrC,gBAAgB3qC,KAAKk/D,gBAC1Bv/D,EAAO2nC,UAAU80B,IAEnBz8D,EAAO0sC,mBAAmByvB,EAAUtzB,EAAUv1B,EAAU+d,sBACvD1nB,EAAW2mB,iBAGhBq6B,EAAAroD,UAAA0zD,uBAAA,SAAuB1qD,EAA6BkqD,GAIlD,IAHA,IAAInpD,EAAcf,EAAWe,YACzBwzD,EAAiBxzD,EAAY1G,OAC7Bm6D,EAAQ,IAAIt5D,MAAqBq5D,KAC5Bn/D,EAAI,EAAGA,EAAIm/D,IAAkBn/D,EACpCo/D,EAAMp/D,GAAKL,KAAKkvD,kBACdljD,EAAY3L,GACZmc,EAAAyE,KAAKc,UAWT,OANA09C,EAAMD,GAAkBx/D,KAAKkvD,kBAC3BljD,EAAYwzD,GACZrK,OAIKn1D,KAAKL,OAAOkrC,YAAY,KAAM40B,EAAOz/D,KAAK0qD,YAAYz6B,iBAG/Dq6B,EAAAroD,UAAA2zD,+BAAA,SAA+B3qD,EAAqCkqD,GAClE,IAAInjC,EAAShyB,KAAKwgB,SAASk/C,qBAAqBz0D,EAAYjL,KAAK6yB,iBACjE,IAAKb,EAAQ,OAAOhyB,KAAKL,OAAO6sC,oBAChC,OAAQxa,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAYvH,MACf,IAAIqjD,EAAc96D,KAAK6yB,gBAAgBlD,KAAK5nB,GAAE,MAC1C2zD,EAAqB1pC,EAAQE,eAAeupB,EAAAn/B,aAAaW,YAAa69C,GAC1E,IAAKY,EAKH,OAJA17D,KAAKuG,MACHgW,EAAAzY,eAAem3D,qCACfhwD,EAAWA,WAAW7G,MAAe4tB,EAAQjP,cAExC/iB,KAAKL,OAAO6sC,oBAErB,IAAIguB,EAAUx6D,KAAKkvD,kBACjBjkD,EAAWA,WACH+mB,EAAQ1pB,KAAI,KAItB,OAAOtI,KAAKy6D,kBAAkBiB,GAC5BzwD,EAAWsB,mBACVtB,EAAYuvD,GAOnB,OAJAx6D,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,qBAGrB8d,EAAAroD,UAAA4zD,0BAAA,SAA0B5qD,EAAgCkqD,GACxD,IAAItpD,EAAcZ,EAAWY,YACzBjL,EAAOiL,EAAYjL,KACnBinB,GAAcjnB,EAAKwE,KAAKE,OACxB1E,EAAKwE,KACL,aAAe,IAAMpF,KAAK6qD,cAAcvlD,OAAOT,SAAS,IACxDguB,EAAkB7yB,KAAK6yB,gBACvB5wB,EAAY,IAAIw5C,EAAAlyB,kBAClBvpB,KAAKusB,QACL1E,EACAgL,EAAgB9P,aAAetc,EAAA7D,gBAAkBilB,EACjDhc,EACA,KACA4vC,EAAAx8B,eAAenX,MAEb6nB,EAAOkD,EAAgBlD,KACvB9J,EAAW7lB,KAAK4vD,kCAClB3tD,KAEAiB,EAAA2sD,QAAqBlgC,EAAKjC,yBAC1BiC,EACA9jB,GAEF,IAAKga,EAAU,OAAO7lB,KAAKL,OAAO6sC,oBAClCxsC,KAAK0qD,YAAc7kC,EAAS5S,UAAU3K,KAGtC,IAAI8kB,EAAQptB,KAAKoxD,yBAAyBvrC,GAC1C,OAAOuH,EAAQ,EACXptB,KAAKL,OAAO6sC,oBACZxsC,KAAKL,OAAO2nC,UAAUla,IAQ5Bk9B,EAAAroD,UAAA6zD,4BAAA,SACE7qD,EACAkqD,EACAwK,GAEA,IAAIhgE,EAASK,KAAKL,OACdkzB,EAAkB7yB,KAAK6yB,gBAG3B,OAAQ5nB,EAAWlE,MACjB,KAAK0V,EAAA5V,SAASI,KACZ,IAAI+Z,EAAUhhB,KAAKghB,QAInB,OAHKm0C,EAAerZ,iBAClB97C,KAAK0qD,YAAc1pC,EAAQW,WAEtBX,EAAQkB,SACXviB,EAAO+nC,UAAU,GACjB/nC,EAAO2nC,UAAU,GAEvB,KAAK7qB,EAAA5V,SAASK,KAEZ,OADAlH,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACjBjiB,EAAO2nC,UAAU,GAE1B,KAAK7qB,EAAA5V,SAASM,MAEZ,OADAnH,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACjBjiB,EAAO2nC,UAAU,GAE1B,KAAK7qB,EAAA5V,SAASyR,KAEZ,IADIqX,EAAOkD,EAAgBlD,MAClB5nB,GAAE,MAET,GADI63D,EAAajwC,EAAKoE,eAAe,QAGnC,OADA/zB,KAAK0qD,YAAckV,EAAWt3D,KACvB3I,EAAOgpC,eAAei3B,EAAWxyC,MAAOwyC,EAAWt3D,KAAK2nB,gBAGnE,GAAI4C,EAAgB9qB,GAAGtB,EAAApE,YAAY0sB,UAAW,CAC5C,IAAInnB,EAASnE,OAAOovB,EAAgBjrB,QACpCnE,OAAOmE,EAAOb,MAAQ00C,EAAAz8B,YAAYvH,OAClC,IAAIwX,EAAmBrnB,EAAQU,KAC/B,OAAIuqB,EAAgB9qB,GAAGtB,EAAApE,YAAYsV,eAC5BgY,EAAK5nB,GAAE,KACV4nB,EAAKznB,IAAG,IAERlI,KAAK0qD,YAAcz7B,EACZtvB,EAAOkpC,eAAe,EAC3B7oC,KAAKuwD,wBAA+B3oD,EAAQqD,MAIlDjL,KAAK0qD,YAAcz7B,EACZtvB,EAAOgpC,eAAe,EAAG1Z,EAASgB,iBAO3C,OALAjwB,KAAKuG,MACHgW,EAAAzY,eAAe+7D,+CACf50D,EAAW7G,OAEbpE,KAAK0qD,YAAc1qD,KAAKghB,QAAQW,UACzBhiB,EAAO6sC,oBAEhB,KAAK/vB,EAAA5V,SAASwR,MACZ,IAAIsX,EAEEiwC,EADN,IADIjwC,EAAOkD,EAAgBlD,MAClB5nB,GAAE,MAET,GADI63D,EAAajwC,EAAKoE,eAAe,QAInC,GADIxC,EADkB9tB,OAAOm8D,EAAWt3D,KAAKwzC,gBAClBvqB,KAGzB,OADAvxB,KAAK0qD,YAAcn5B,EAAKjpB,KACjB3I,EAAOgpC,eAAei3B,EAAWxyC,MAAOmE,EAAKjpB,KAAK2nB,gBAI/D,GAAI4C,EAAgB9qB,GAAGtB,EAAApE,YAAY0sB,UAAW,CAC5C,IAEIwC,EAFA3pB,EAASnE,OAAOovB,EAAgBjrB,QAGpC,GAFAnE,OAAOmE,EAAOb,MAAQ00C,EAAAz8B,YAAYvH,OAC9B8Z,EAAe3pB,EAAQ2pB,KACjB,CACR,IAAIuuC,EAAYvuC,EAAKjpB,KAErB,OADAtI,KAAK0qD,YAAcoV,EACZngE,EAAOgpC,eAAe,EAAGm3B,EAAU7vC,iBAQ9C,OALAjwB,KAAKuG,MACHgW,EAAAzY,eAAei8D,iDACf90D,EAAW7G,OAEbpE,KAAK0qD,YAAc1qD,KAAKghB,QAAQW,UACzBhiB,EAAO6sC,oBAKlB,IAAIxa,EAAShyB,KAAKwgB,SAAS0E,kBACzBja,EACAjL,KAAKyqD,aAAe53B,GAEtB,IAAKb,EAAQ,OAAOryB,EAAO6sC,oBAE3B,OAAQxa,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAYqO,MACf,IAAI2yC,EAAoBhuC,EAAQ1pB,KAEhC,GADA7E,OAAOu8D,GAAaxjD,EAAAyE,KAAKc,MACbiQ,EAAQjqB,GAAGtB,EAAApE,YAAY2qB,SACjC,OAAOhtB,KAAKk1D,sBAA6BljC,EAAQmjC,EAAgBwK,GAEnE,IAAI7wC,EAAqBkD,EAAQ5E,MAGjC,OAFA3pB,OAAOqrB,GAAc,GACrB9uB,KAAK0qD,YAAcsV,EACZhgE,KAAKL,OAAOgpC,eAAe7Z,EAAYkxC,EAAU/vC,gBAE1D,KAAKwrB,EAAAz8B,YAAY5I,OACf,IAAKpW,KAAKsuD,cAAsBt8B,GAC9B,OAAOhyB,KAAKL,OAAO6sC,oBAErB,IAAIuC,EAAsB/c,EAAQ1pB,KAElC,OADA7E,OAAOsrC,GAAcvyB,EAAAyE,KAAKc,MACbiQ,EAAQjqB,GAAGtB,EAAApE,YAAY2qB,SAC3BhtB,KAAKk1D,sBAA8BljC,EAAQmjC,EAAgBwK,IAEpE3/D,KAAK0qD,YAAc3b,EACZ/uC,KAAKL,OAAOopC,gBAAyB/W,EAAQjP,aAAcgsB,EAAW9e,iBAE/E,KAAKwrB,EAAAz8B,YAAY0N,UACf,OAAKsF,EAAOjqB,GAAGtB,EAAApE,YAAYqqD,WAQ3B1sD,KAAK0qD,YAAcluC,EAAAyE,KAAKG,IACR4Q,EAAQjqB,GAAGtB,EAAApE,YAAY2qB,SAC9BhtB,KAAKL,OAAO2nC,UAAsBtV,EAAQrF,eAE5C3sB,KAAKL,OAAOopC,gBAA4B/W,EAAQjP,aAAY,KAXjE/iB,KAAKuG,MACHgW,EAAAzY,eAAem8D,+HACfh1D,EAAW7G,OAEbpE,KAAK0qD,YAAcluC,EAAAyE,KAAKG,IACjBphB,KAAKL,OAAO6sC,qBAQvB,KAAKiP,EAAAz8B,YAAYgH,mBACf,IAAIH,EAAW7lB,KAAKwgB,SAAS6F,gBACR2L,EACnB,KACA9uB,EAAA2sD,QAAqBh9B,EAAgBlD,KAAKjC,0BAE5C,IAAM7H,IAAY7lB,KAAK+vD,gBAAgBlqC,GAAY,OAAOlmB,EAAO6sC,oBACjE,IAAIpf,EAAQptB,KAAKoxD,yBAAyBvrC,GAE1C,OADA7lB,KAAK0qD,YAAc7kC,EAAS5S,UAAU3K,KAC/BtI,KAAKL,OAAO2nC,UAAUla,GAOjC,OAJAptB,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENpE,KAAKL,OAAO6sC,qBAGrB8d,EAAAroD,UAAA8zD,4BAAA,SACE9qD,EACAkqD,GAEA,IAAIx1D,EAASK,KAAKL,OAId0K,EAAOrK,KAAK4uD,4BAA4B3jD,EAAWA,WAAYjL,KAAKghB,QAAQW,UAAS,GACrFrZ,EAAOtI,KAAK0qD,YACZ19C,EAAShN,KAAKwgB,SAASiuC,YAAYxjD,EAAW+B,QAElD,OADAhN,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACnB5U,EACE1E,EAAKP,GAAE,OAAyBiF,EAAOjF,GAAE,KAC5CO,EAAKyzC,gBAAgBhqB,eAAe/kB,GAClCrN,EAAO0oC,aACL//B,EAAKP,GAAE,IACH2U,EAAAwZ,SAASM,MACT9Z,EAAAwZ,SAASK,MACblsB,EACA/B,EAAK00C,aAAar9C,IAEpBA,EAAO2nC,UAAU,GACnB3nC,EAAO2nC,UAAUh/B,EAAKypB,eAAe/kB,GAAQ,GAAQ,EAAI,GAXzCrN,EAAO6sC,qBAc7B8d,EAAAroD,UAAA+zD,yBAAA,SACE/qD,EACAkqD,EACA+K,QAAA,IAAAA,OAAA,GAEA,IAAIvgE,EAASK,KAAKL,OAElB,OAAQsL,EAAWmM,aACjB,KAAKqF,EAAAvF,YAAYG,MACf5T,QAAQy8D,GACR,IAAI3jB,EAAY4Y,EAAerZ,eAC/B,OACES,GACAA,EAAUt6C,WAAajC,KAAKusB,QAAQ1M,eAE7B7f,KAAKmgE,oBACV18D,OAAO84C,EAAUn0C,eAAe,GACP6C,EAAYN,oBACrC,EACAM,IAGJjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,qBAEhB,KAAK/vB,EAAAvF,YAAYU,MACf,IAAIwoD,EAAsCn1D,EAAY3J,MAItD,OAHI4+D,IACFE,GAAcA,GAEZjL,GAAkB34C,EAAAyE,KAAKY,IAClBliB,EAAOmoC,UAAes4B,IAE/BpgE,KAAK0qD,YAAcluC,EAAAyE,KAAKa,IACjBniB,EAAOqoC,UAAUo4B,IAE1B,KAAK3jD,EAAAvF,YAAYa,QACf,IAAIsoD,EAAsCp1D,EAAY3J,MAOtD,OANI4+D,IACFG,EAAWC,QACTr+C,QAAQ,GACRo+C,IAGIlL,EAAepuD,MAIrB,OACE,GAAIw5D,UAAUF,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IACzD,MAEF,OACE,GAAIG,UAAUH,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IACzD,MAEF,OACE,GAAII,WAAWJ,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IAC1D,MAEF,OACE,GAAIK,WAAWL,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IAC1D,MAEF,OACE,GAAIM,WAAWN,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IAC1D,MAEF,OACE,GAAIO,WAAWP,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IAC1D,MAEF,QACE,GAAIQ,YAAYR,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IAC3D,MAEF,OACE,IAAKrgE,KAAKghB,QAAQkB,SAAU,CAC1B,GAAIy+C,WAAWN,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IAC1D,MAEF,OAAO1gE,EAAO+nC,UAAUgI,QAAQ2wB,GAAW1wB,SAAS0wB,IAEtD,OACE,IAAKrgE,KAAKghB,QAAQkB,SAAU,CAC1B,GAAI0+C,WAAWP,GAAW,OAAO1gE,EAAO2nC,UAAUoI,QAAQ2wB,IAC1D,MAEF,OAAO1gE,EAAO+nC,UAAUgI,QAAQ2wB,GAAW1wB,SAAS0wB,IAEtD,OACA,OACE,OAAO1gE,EAAO+nC,UAAUgI,QAAQ2wB,GAAW1wB,SAAS0wB,IAEtD,QACE,GAAIS,WAAWT,GAAW,OAAO1gE,EAAOmoC,UAAUi5B,WAAWV,IAC7D,MAEF,QACE,GAAIW,WAAWX,GAAW,OAAO1gE,EAAOqoC,UAAUi5B,WAAWZ,IAC7D,MAEF,QACE,MAEF,QAEE,OADA58D,QAAO,GACA9D,EAAO6sC,oBAMlB,OAAIm0B,WAAWN,IACbrgE,KAAK0qD,YAAcluC,EAAAyE,KAAKG,IACjBzhB,EAAO2nC,UAAUoI,QAAQ2wB,KACvBO,WAAWP,IACpBrgE,KAAK0qD,YAAcluC,EAAAyE,KAAKQ,IACjB9hB,EAAO2nC,UAAUoI,QAAQ2wB,MAEhCrgE,KAAK0qD,YAAcluC,EAAAyE,KAAKI,IACjB1hB,EAAO+nC,UAAUgI,QAAQ2wB,GAAW1wB,SAAS0wB,KAGxD,KAAK5jD,EAAAvF,YAAYkB,OAEf,OADA3U,QAAQy8D,GACDlgE,KAAKkhE,qBAA8Cj2D,GAE5D,KAAKwR,EAAAvF,YAAYe,OAEf,OADAxU,QAAQy8D,GACDlgE,KAAKmhE,qBAA8Cl2D,EAAYkqD,GAS1E,OALAn1D,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAEbpE,KAAK0qD,YAAcyK,EACZx1D,EAAO6sC,qBAIhB8d,EAAAroD,UAAAm/D,mBAAA,SAAmBC,GACjB,IAKIC,EALA/0C,EAAUvsB,KAAKusB,QACfrM,EAAQqM,EAAQrM,MAChBI,EAAeiM,EAAQjM,aAEvBR,EAAiBrc,OAAO8oB,EAAQzM,gBAIhCsvB,EAAWpvC,KAAK4qD,eACpB,GAAIxb,EAASzpB,IAAI07C,GACfC,EAA+BlyB,EAASluC,IAAImgE,OAGvC,CACL,IAAI/7D,EAAS+7D,EAAY/7D,OACrBi8D,EAAczhD,EAAe0R,oBAAsB,GAAK,EACxDgwC,EAAYD,EAAsB,EAATj8D,EAEzBm8D,OAAG,EACHnoD,OAAG,EAEH4G,GACFuhD,EAAM,IAAI3uB,WAAWxyB,EAAekhD,GACpCloD,EAAMgH,EACNpd,EAAAw+D,SAAShY,EAAAiY,aAAa3hE,KAAM8f,GAAiB2hD,EAAKl1C,EAAQhM,gBAE1DkhD,EAAM,IAAI3uB,WAAW0uB,GACrBloD,EAAM,GAERpW,EAAAw+D,SAASp8D,EAAQm8D,EAAKnoD,EAAMwG,EAAewS,SAAS,WACpDhZ,GAAOioD,EACP,IAAK,IAAIlhE,EAAI,EAAGA,EAAIiF,IAAUjF,EAC5B6C,EAAA0+D,SAASP,EAAY37D,WAAWrF,GAAIohE,EAAKnoD,GAAOjZ,GAAK,IAEvDihE,EAAgBthE,KAAKkxD,iBAAiBuQ,GACtCryB,EAASlnC,IAAIm5D,EAAaC,GAE5B,IAAIO,EAAeP,EAAc37B,OAIjC,OAHIzlB,IAAO2hD,EAAezZ,QAAQyZ,EAAc5/C,QAAQ3B,KAExDtgB,KAAK0qD,YAAc5qC,EAAexX,KAC9BtI,KAAKghB,QAAQkB,SACRliB,KAAKL,OAAO+nC,UAAUgI,QAAQmyB,GAAelyB,SAASkyB,KAE7Dp+D,OAAOm9D,WAAWiB,IACX7hE,KAAKL,OAAO2nC,UAAUoI,QAAQmyB,MAIzCvX,EAAAroD,UAAAi/D,qBAAA,SAAqBj2D,GACnB,OAAOjL,KAAKohE,mBAAmBn2D,EAAW3J,QAI5CgpD,EAAAroD,UAAA6/D,kBAAA,SAAkBC,EAAmBr0D,GACnC,IASI+zD,EACAnoD,EAVAiT,EAAUvsB,KAAKusB,QACfrM,EAAQqM,EAAQrM,MAChBI,EAAeiM,EAAQjM,aAEvBhb,EAASoI,EAAOpI,OAChBkhB,EAAWu7C,EAAYv7C,SACvBw7C,EAAa18D,EAASkhB,EACtBy7C,EAAgBjiE,KAAKghB,QAAQW,UAAU6E,SAMvC07C,EAAiBz+D,OAAO8oB,EAAQ3M,qBAChCuiD,EAAoBD,EAAe1wC,oBAAsB,GAAK,EAC9D4wC,EAAkB,GAAM,GAAKC,IAAIF,EAAmBH,EAAa,GACjE9hD,GACFuhD,EAAM,IAAI3uB,WAAWxyB,EAAe8hD,GACpC9oD,EAAMgH,EACNpd,EAAAw+D,SAAShY,EAAAiY,aAAa3hE,KAAMkiE,GAAiBT,EAAKl1C,EAAQhM,gBAE1DkhD,EAAM,IAAI3uB,WAAWsvB,GACrB9oD,EAAM,GAERpW,EAAAw+D,SAASM,EAAYP,EAAKnoD,EAAM4oD,EAAe5vC,SAAS,eACxDhZ,GAAO6oD,EACP,IAAIvV,EAAamV,EAAY9xC,eAC7B,OAAQ28B,GACN,OACE,OAAQpmC,GACN,KAAK,EACH,IAAK,IAAInmB,EAAI,EAAGA,EAAIiF,IAAUjF,EAAG,CAC/B,IAAIiB,EAAQoM,EAAOrN,GACnBoD,OAAOiZ,EAAAgd,kBAAkBp4B,IAAUsrD,GACnCnpD,OAAOiZ,EAAA2Y,gBAAgB/zB,IAAUob,EAAA4Y,aAAa+C,OAC9Cn1B,EAAAo/D,QAAQ5lD,EAAA4b,iBAAiBh3B,GAAQmgE,EAAKnoD,GACtCA,GAAO,EAET,MAEF,KAAK,EACH,IAASjZ,EAAI,EAAGA,EAAIiF,IAAUjF,EAAG,CAC3BiB,EAAQoM,EAAOrN,GACnBoD,OAAOiZ,EAAAgd,kBAAkBp4B,IAAUsrD,GACnCnpD,OAAOiZ,EAAA2Y,gBAAgB/zB,IAAUob,EAAA4Y,aAAa+C,OAC9Cn1B,EAAA0+D,SAASllD,EAAA4b,iBAAiBh3B,GAAQmgE,EAAKnoD,GACvCA,GAAO,EAET,MAEF,KAAK,EACH,IAASjZ,EAAI,EAAGA,EAAIiF,IAAUjF,EAAG,CAC3BiB,EAAQoM,EAAOrN,GACnBoD,OAAOiZ,EAAAgd,kBAAkBp4B,IAAUsrD,GACnCnpD,OAAOiZ,EAAA2Y,gBAAgB/zB,IAAUob,EAAA4Y,aAAa+C,OAC9Cn1B,EAAAw+D,SAAShlD,EAAA4b,iBAAiBh3B,GAAQmgE,EAAKnoD,GACvCA,GAAO,EAET,MAEF,QAAS7V,QAAO,GAElB,MAEF,OACE,IAASpD,EAAI,EAAGA,EAAIiF,IAAUjF,EAAG,CAC3BiB,EAAQoM,EAAOrN,GACnBoD,OAAOiZ,EAAAgd,kBAAkBp4B,IAAUsrD,GACnCnpD,OAAOiZ,EAAA2Y,gBAAgB/zB,IAAUob,EAAA4Y,aAAa+C,OAC9Cn1B,EAAAq/D,SAAStgD,QAAQvF,EAAAid,oBAAoBr4B,GAAQob,EAAA+4B,qBAAqBn0C,IAASmgE,EAAKnoD,GAChFA,GAAO,EAET,MAEF,OACE,IAASjZ,EAAI,EAAGA,EAAIiF,IAAUjF,EAAG,CAC3BiB,EAAQoM,EAAOrN,GACnBoD,OAAOiZ,EAAAgd,kBAAkBp4B,IAAUsrD,GACnCnpD,OAAOiZ,EAAA2Y,gBAAgB/zB,IAAUob,EAAA4Y,aAAa+C,OAC9Cn1B,EAAAs/D,SAAS9lD,EAAAkd,iBAAiBt4B,GAAQmgE,EAAKnoD,GACvCA,GAAO,EAET,MAEF,OACE,IAASjZ,EAAI,EAAGA,EAAIiF,IAAUjF,EAAG,CAC3BiB,EAAQoM,EAAOrN,GACnBoD,OAAOiZ,EAAAgd,kBAAkBp4B,IAAUsrD,GACnCnpD,OAAOiZ,EAAA2Y,gBAAgB/zB,IAAUob,EAAA4Y,aAAa+C,OAC9Cn1B,EAAAu/D,SAAS/lD,EAAAmd,iBAAiBv4B,GAAQmgE,EAAKnoD,GACvCA,GAAO,EAET,MAEF,QAAS7V,QAAO,GAElB,IACIi/D,EADgB1iE,KAAKkxD,iBAAiBuQ,GACT97B,OAC7BzlB,IAAOwiD,EAAeta,QAAQsa,EAAczgD,QAAQ3B,KAGxD,IAAIT,EAAiBpc,OAAO8oB,EAAQ1M,gBAChC8iD,EAAgBl/D,OAAOzD,KAAKwgB,SAASoF,aACvC/F,GACEkiD,GACF7+D,EAAA2sD,YAEE+S,EAAmBD,EAAcnxC,oBAAsB,GAAK,EAC5DtR,GACFuhD,EAAM,IAAI3uB,WAAWxyB,EAAesiD,GACpCtpD,EAAMgH,EACNpd,EAAAw+D,SAAShY,EAAAiY,aAAa3hE,KAAM2iE,GAAgBlB,EAAKl1C,EAAQhM,gBAEzDkhD,EAAM,IAAI3uB,WAAW8vB,GACrBtpD,EAAM,GAER,IACIupD,EADe7iE,KAAKkxD,iBAAiBuQ,GACV97B,OAG/B,OAFIzlB,IAAO2iD,EAAcza,QAAQya,EAAa5gD,QAAQ3B,KACtDtgB,KAAK0qD,YAAciY,EAAcr6D,KACZ,GAAjB25D,GACF/+D,EAAAq/D,SAASG,EAAcjB,EAAKnoD,EAAMqpD,EAAcrwC,SAAS,YACzDpvB,EAAAw+D,SAASp8D,EAAQm8D,EAAKnoD,EAAMqpD,EAAcrwC,SAAS,YAC5CtyB,KAAKL,OAAO+nC,UAAUgI,QAAQmzB,GAAclzB,SAASkzB,MAE5Dp/D,OAAOm9D,WAAW8B,IAClBx/D,EAAAw+D,SAAShyB,QAAQgzB,GAAejB,EAAKnoD,EAAMqpD,EAAcrwC,SAAS,YAClEpvB,EAAAw+D,SAASp8D,EAAQm8D,EAAKnoD,EAAMqpD,EAAcrwC,SAAS,YACnD7uB,OAAOm9D,WAAWiC,IACX7iE,KAAKL,OAAO2nC,UAAUoI,QAAQmzB,MAIzCvY,EAAAroD,UAAAk+D,oBAAA,SACE4B,EACA/1D,EACA82D,EACArV,GAUA,IARA,IAAI9tD,EAASK,KAAKL,OAGd2F,EAAS0G,EAAY1G,OACrBy9D,EAAiB,IAAI58D,MAAqBb,GAC1C09D,EAAiB,IAAI78D,MAAqBb,GAC1C29D,EAAoBlB,EAAY9xC,eAChCizC,GAAW,EACN7iE,EAAI,EAAGA,EAAIiF,IAAUjF,EAAG,CAC/B,IAAIgK,EAAO2B,EAAY3L,GACnBL,KAAKkvD,kBAA8BljD,EAAY3L,GAAI0hE,EAAW,KAC9DA,EAAY/kB,aAAar9C,GAC7BojE,EAAe1iE,GAAKgK,EAChB64D,IACF74D,EAAO1K,EAAO8xC,qBAAqBsxB,EAAe1iE,IAC9Cqc,EAAA2Y,gBAAgBhrB,IAASqS,EAAA4Y,aAAa+C,OACxC50B,OAAOiZ,EAAAgd,kBAAkBrvB,IAAS44D,GAClCD,EAAe3iE,GAAKgK,IAEhBy4D,GACF9iE,KAAKsG,QACHiW,EAAAzY,eAAeqrD,4DACf1B,EAAWrpD,OAGf8+D,GAAW,IAMjB,GAAIA,EAAU,OAAOljE,KAAK8hE,kBAAkBC,EAAaiB,GAGzD,IAAInjD,EAAiBpc,OAAOzD,KAAKusB,QAAQ1M,gBACrC8iD,EAAgBl/D,OAAOzD,KAAKwgB,SAASoF,aACvB/F,GACdkiD,GACF7+D,EAAA2sD,YAEEsT,EAAYR,EAAcr6D,KAG9BtI,KAAK0qD,YAAcyY,EACnB,IAAIxW,EAASgW,EAAczwC,eAAeupB,EAAAn/B,aAAaY,aAAa,GACpE,IAAKyvC,EAKH,OAJA3sD,KAAKuG,MACHgW,EAAAzY,eAAek3D,+CACfvN,EAAWrpD,MAAOu+D,EAAc5/C,cAE3BpjB,EAAO6sC,oBAEhB,IAAI42B,EAAkBD,EAAUlzC,eAC5B4C,EAAkB7yB,KAAK6yB,gBACvBihC,EAAYjhC,EAAgBhD,SAASszC,GACrC/S,EAAQ,IAAIjqD,MAAqB,EAAIb,GACrC8nB,EAAQ,EACZgjC,EAAMhjC,KAAWztB,EAAO8qC,eAAeqpB,EAAU1mC,MAC/CptB,KAAKk5D,eAAez1D,OAAOk/D,EAAclxC,sBACvC9xB,EAAO2nC,UAAU,GACjB3nC,EAAO2nC,UAAUhiC,MAGrB,IAASjF,EAAI,EAAGA,EAAIiF,IAAUjF,EAC5B+vD,EAAMhjC,KAAWptB,KAAKk5D,eAAevM,GACnChtD,EAAOgpC,eAAemrB,EAAU1mC,MAAOg2C,GACvCzjE,EAAO2nC,UAAUjnC,GACjB0iE,EAAe1iE,KAOnB,OAJAoD,OAAO2pB,EAAQ,GAAKgjC,EAAM9qD,QAC1B8qD,EAAMhjC,GAASztB,EAAOgpC,eAAemrB,EAAU1mC,MAAOg2C,GACtDvwC,EAAgBzC,cAAc0jC,GAC9B9zD,KAAK0qD,YAAcyY,EACZxjE,EAAOkrC,YAAY,KAAMulB,EAAOgT,IAGzC9Y,EAAAroD,UAAAk/D,qBAAA,SAAqBl2D,EAAqCkqD,GACxD,IAAIx1D,EAASK,KAAKL,OAGdm8C,EAAiBqZ,EAAerZ,eACpC,IAAKA,GAAkBA,EAAe/zC,GAAGtB,EAAApE,YAAY6mB,UAKnD,OAJAlpB,KAAKuG,MACHgW,EAAAzY,eAAe+qD,mCACf5jD,EAAW7G,MAAO,WAAY+wD,EAAetwD,YAExClF,EAAO6sC,oBAIhB,IAAI+gB,EAAOzR,EAAerqB,oBAC1B,GAAI87B,EAAM,CAGR,GAAIA,EAAKt6C,UAAUyqC,mBAKjB,OAJA19C,KAAKuG,MACHgW,EAAAzY,eAAeu/D,sDACfp4D,EAAW7G,MAAO03C,EAAej3C,YAE5BlF,EAAO6sC,oBAEhB,GAAI+gB,EAAKxlD,GAAGtB,EAAApE,YAAYi+C,SAKtB,OAJAtgD,KAAKuG,MACHgW,EAAAzY,eAAew/D,mFACfr4D,EAAW7G,MAAO03C,EAAej3C,YAE5BlF,EAAO6sC,oBAEhB,GAAI+gB,EAAKxlD,GAAGtB,EAAApE,YAAYk+C,WAKtB,OAJAvgD,KAAKuG,MACHgW,EAAAzY,eAAey/D,qFACft4D,EAAW7G,MAAO03C,EAAej3C,YAE5BlF,EAAO6sC,oBAKlB,IAAI/+B,EAAQxC,EAAWwC,MACnBu+B,EAAWv+B,EAAMnI,OACjBoI,EAASzC,EAAWyC,OACpBsC,EAAU8rC,EAAe9rC,QACzBwzD,GAAY,EACZ/D,EAAQ,IAAIt5D,MAAqB6lC,EAAW,GAC5C8nB,EAAY9zD,KAAK6yB,gBAAgB/C,aAAa9vB,KAAKghB,QAAQW,WAC/Dle,OAAOuoC,GAAYt+B,EAAOpI,QAC1B,IAAK,IAAIjF,EAAI,EAAGwK,EAAImhC,EAAU3rC,EAAIwK,IAAKxK,EAAG,CACxC,IAAIia,EAAStK,EAAUA,EAAQ9O,IAAIuM,EAAMpN,GAAG+E,MAAQ,KACpD,GAAKkV,GAAUA,EAAOvT,MAAQ00C,EAAAz8B,YAAYoS,MAA1C,CAQA,IAAI9oB,EAAegS,EAAQhS,KAC3Bm3D,EAAMp/D,EAAI,GAAKL,KAAKL,OAAO2pC,YACzBhhC,EAAKke,SACLxmB,KAAKL,OAAOgpC,eAAemrB,EAAU1mC,MAAOptB,KAAKghB,QAAQ6rC,gBACzD7sD,KAAKkvD,kBAAkBxhD,EAAOrN,GAAYia,EAAQhS,KAAI,KACtDA,EAAK2nB,eACG3V,EAAQ+W,mBAbhBrxB,KAAKuG,MACHgW,EAAAzY,eAAe2/D,oCACfh2D,EAAMpN,GAAG+D,MAAOqJ,EAAMpN,GAAG+E,KAAM02C,EAAej3C,YAEhD2+D,GAAY,EAahB,OADAxjE,KAAK0qD,YAAc5O,EAAexzC,KAAKyzC,gBACnCynB,EAAkB7jE,EAAO6sC,qBAG7BizB,EAAM,GAAK9/D,EAAO8qC,eAChBqpB,EAAU1mC,MACVs8B,EAAAga,gBAAgB1jE,KAAM87C,EAAgB7wC,IAIxCw0D,EAAMA,EAAMn6D,OAAS,GAAK3F,EAAOgpC,eAAemrB,EAAU1mC,MAAOptB,KAAKghB,QAAQ6rC,gBAEvEltD,EAAOkrC,YAAY,KAAM40B,EAAOz/D,KAAKghB,QAAQ6rC,kBAGtDvC,EAAAroD,UAAAg0D,qBAAA,SAAqBhrD,EAA2BkqD,GAC9C,IAAIx1D,EAASK,KAAKL,OAEdkzB,GADU7yB,KAAKghB,QACGhhB,KAAK6yB,iBAGvBb,EAAShyB,KAAKwgB,SAASm6C,kBACzB1vD,EAAWA,WACX4nB,GAEF,IAAKb,EAAQ,OAAOryB,EAAO6sC,oBAC3B,GAAIxa,EAAOjrB,MAAQ00C,EAAAz8B,YAAYmG,gBAK7B,OAJAnlB,KAAKuG,MACHgW,EAAAzY,eAAe6/D,yEACf14D,EAAWA,WAAW7G,OAEjBpE,KAAKL,OAAO6sC,oBAErB,IAGIsP,EAHAjzB,EAAiCmJ,EACjC4xC,EAA8B,KAC9Bx7D,EAAgB6C,EAAW7C,cAoB/B,OAbEw7D,GAJCx7D,GACoD,QAApD0zC,EAAiBqZ,EAAerZ,iBACjCA,EAAe/zC,GAAGtB,EAAApE,YAAY6jB,SAEdlmB,KAAKwgB,SAASoF,aAC5BiD,EACAizB,EAAe1zC,cACflF,EAAA2sD,QAAqBh9B,EAAgBlD,KAAKjC,0BAG5B1tB,KAAKwgB,SAASqwC,8BAC5BhoC,EACAzgB,EACAlF,EAAA2sD,QAAqBh9B,EAAgBlD,KAAKjC,yBAC1CziB,IAIGjL,KAAK6jE,mBAAmBD,EAAe34D,EAAWnB,UAAWmB,GADzCtL,EAAO6sC,qBAIpC8d,EAAAroD,UAAA4hE,mBAAA,SAAmBD,EAAsBrJ,EAAmC9M,GAE1E,IAQIpjD,EARAy5D,EAAqCF,EACrCnyC,EAAuC,KAC3C,GAEE,GADAA,EAAsBqyC,EAAqBryC,oBAClB,YAClBqyC,EAAuBA,EAAqBvyC,MAqBrD,OAjBIE,EACFpnB,EAAOrK,KAAKy6D,kBAAkBhpC,EAAqB8oC,EAAqB9M,EACtEztD,KAAKghB,QAAQW,UAAUq7B,aAAah9C,KAAKL,UAKvC46D,EAAoBj1D,QACtBtF,KAAKuG,MACHgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKm2D,EAAoBj1D,OAAOT,SAAS,KAG/DwF,EAAOrK,KAAK+jE,aAAaH,EAAenW,IAG1CztD,KAAK0qD,YAAckZ,EAAct7D,KAC1B+B,GAGTigD,EAAAroD,UAAAi0D,+BAAA,SACEjrD,EACAkqD,GAGA,OAAOn1D,KAAKkvD,kBACVjkD,EAAWA,WACXkqD,EAAc,MAWlB7K,EAAAroD,UAAAk0D,gCAAA,SACE6N,EACA7O,EACAwK,GAEA,IAAIhgE,EAASK,KAAKL,OAEdqyB,EAAShyB,KAAKwgB,SAASyjD,sBAAsBD,EAAgBhkE,KAAK6yB,iBACtE,IAAKb,EAAQ,OAAOryB,EAAO6sC,oBAE3B,OAAQxa,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAY5I,OACf,IAAKpW,KAAKsuD,cAAsBt8B,GAC9B,OAAOryB,EAAO6sC,oBAEhB,IAAIuC,EAAsB/c,EAAQ1pB,KAElC,OADA7E,OAAOsrC,GAAcvyB,EAAAyE,KAAKc,MACbiQ,EAAQjqB,GAAGtB,EAAApE,YAAY2qB,SAC3BhtB,KAAKk1D,sBAA8BljC,EAAQmjC,EAAgBwK,IAEpE3/D,KAAK0qD,YAAc3b,EACZpvC,EAAOopC,gBAAyB/W,EAAQjP,aAAcgsB,EAAW9e,iBAE1E,KAAKwrB,EAAAz8B,YAAY0N,UACf,IAAI9kB,EAAqBoqB,EAAQpqB,OAEjC,OADAnE,OAAkB,OAAXmE,GAAmBA,EAAOb,MAAQ00C,EAAAz8B,YAAYyN,MAChDzsB,KAAKovD,YAAkBxnD,IAI5B5H,KAAK0qD,YAAcluC,EAAAyE,KAAKG,IACR4Q,EAAQjqB,GAAGtB,EAAApE,YAAY2qB,SAC9BrtB,EAAO2nC,UAAsBtV,EAAQrF,eAEvChtB,EAAOopC,gBAA4B/W,EAAQjP,aAAY,KAP5D/iB,KAAK0qD,YAAcluC,EAAAyE,KAAKG,IACjBphB,KAAKL,OAAO6sC,qBAQvB,KAAKiP,EAAAz8B,YAAYoS,MACf,IAAIgqC,EAAiB33D,OAAOzD,KAAKwgB,SAAS66C,uBAC1C53D,OAAeuuB,EAAQX,cAAgB,GACvC,IAAIiqC,EAAWt7D,KAAK4uD,4BAClBwM,EACAp7D,KAAKghB,QAAQW,UAAS,GAIxB,OADA3hB,KAAK0qD,YAAsB14B,EAAQ1pB,KAC5B3I,EAAOspC,WACJjX,EAAQ1pB,KAAKke,SACbwL,EAAQ1pB,KAAKP,GAAG,GACxBuzD,EACQtpC,EAAQ1pB,KAAK2nB,eACb+B,EAAQX,cAGpB,KAAKoqB,EAAAz8B,YAAYuL,SACf,OAAOvqB,KAAK48D,cAAwB5qC,EAAQgyC,GAE9C,KAAKvoB,EAAAz8B,YAAYgH,mBAKf,OAJAhmB,KAAKuG,MACHgW,EAAAzY,eAAeogE,wEACfF,EAAe5/D,MAA2B4tB,EAAQnK,YAE7CloB,EAAO6sC,oBAOlB,OAJAxsC,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf+7C,EAAe5/D,OAEVzE,EAAO6sC,qBAGR8d,EAAAroD,UAAA26D,cAAR,SAAsB5qC,EAAkBy7B,GACtC,IAAIxrD,EAAY+vB,EAAOxH,gBACvB,GAAIvoB,EAAW,CACb,IAAI4jB,EAAW7lB,KAAKwgB,SAAS6F,gBAAgBpkB,EAAW,MACxD,IAAK4jB,EAAU,OAAO7lB,KAAKL,OAAO6sC,oBAClC,IAAIv5B,EAAY4S,EAAS5S,UACzB,IAAKjT,KAAKi9D,mBACRhqD,EACA,EACA4S,EAAS9d,GAAGtB,EAAApE,YAAY0sB,UACxB0+B,GAEA,OAAOztD,KAAKL,OAAO6sC,oBAErB,IAAI6wB,EAA8D,IAApDx3C,EAASyD,eAAiBmyB,EAAAx8B,eAAe5I,QACvD,GAAIwP,EAAS9d,GAAGtB,EAAApE,YAAY0sB,UAAW,CACrC,IAAInnB,EAASnE,OAAOoiB,EAASje,QAC7BnE,OAAOmE,EAAOb,MAAQ00C,EAAAz8B,YAAYvH,OAClC,IAAI2jD,EAAiB33D,OAAOzD,KAAKwgB,SAAS66C,uBACtCC,EAAWt7D,KAAK4uD,4BAClBwM,EACAp7D,KAAKghB,QAAQW,UAAS,QAIxB;OADA3hB,KAAK0qD,YAAcz3C,EAAU3J,WACtBtJ,KAAKy6D,kBAAkB50C,KAAc4nC,EAAY6N,EAAU+B,GAGlE,OADAr9D,KAAK0qD,YAAcz3C,EAAU3J,WACtBtJ,KAAKy6D,kBAAkB50C,KAAc4nC,EAAY,EAAG4P,GAO7D,OAJAr9D,KAAKuG,MACHgW,EAAAzY,eAAe2/D,oCACfhW,EAAWrpD,MAAkB4tB,EAAQnK,WAAuBmK,EAAQpqB,OAAO/C,YAEtE7E,KAAKL,OAAO6sC,qBAIvB8d,EAAAroD,UAAAm0D,yBAAA,SAAyBnrD,EAA+BkqD,GACtD,IAAI7mD,EAASrD,EAAWqD,OACpBC,EAAStD,EAAWsD,OACpBskB,EAAkB7yB,KAAK6yB,gBACvBC,EAAaD,EAAgBlD,KAE7B8iC,EAAWzyD,KAAK0yD,cAClB1yD,KAAK4uD,4BAA4B3jD,EAAWoD,UAAWmO,EAAAyE,KAAKW,KAAI,GAChE5hB,KAAK0qD,aAGP,IACG1qD,KAAKghB,QAAQmB,eACdniB,KAAK6yB,gBAAgB5qB,MAAMxB,EAAApE,YAAY6jB,QAAUzf,EAAApE,YAAYixD,iBAC7D,CAEA,IAAIC,EAAkBvzD,KAAKL,OAAO8xC,qBAAqBghB,GACvD,GACE/1C,EAAA2Y,gBAAgBk+B,IAAoB72C,EAAA4Y,aAAa+C,OACf,GAAlC3b,EAAAgd,kBAAkB65B,GAElB,OAAO72C,EAAA4b,iBAAiBi7B,GACpBvzD,KAAK4uD,4BAA4BtgD,EAAQ6mD,EAAc,GACvDn1D,KAAK4uD,4BAA4BrgD,EAAQ4mD,EAAc,GAI3D1C,EAAWzyD,KAAK0yD,cACd1yD,KAAK4uD,4BAA4B3jD,EAAWoD,UAAWmO,EAAAyE,KAAKW,KAAI,GAChE5hB,KAAK0qD,aAKX,IAAIyZ,EAAarxC,EAAWO,OAC5BR,EAAgBlD,KAAOw0C,EACvB,IAAIC,EAAapkE,KAAK4uD,4BAA4BtgD,EAAQ6mD,EAAc,GACpEkP,EAAarkE,KAAK0qD,YACtByZ,EAAW3wC,OAEX,IAAI8wC,EAAaxxC,EAAWO,OAC5BR,EAAgBlD,KAAO20C,EACvB,IAAIC,EAAavkE,KAAK4uD,4BAA4BrgD,EAAQ4mD,EAAc,GACpEqP,EAAaxkE,KAAK0qD,YACtB73B,EAAgBlD,KAAO20C,EAAW9wC,OAElCV,EAAWgC,cAAcqvC,EAAYG,GAErC,IAAInM,EAAa37C,EAAAyE,KAAK47B,iBAAiBwnB,EAAYG,GAAY,GAC/D,OAAKrM,GAQLiM,EAAapkE,KAAKu2D,kBAChB6N,EACAC,EACAlM,EAAU,IAGV7pD,GAEFi2D,EAAavkE,KAAKu2D,kBAChBgO,EACAC,EACArM,EAAU,IAGV5pD,GAEFvO,KAAK0qD,YAAcyN,EACZn4D,KAAKL,OAAO2rC,SAASmnB,EAAU2R,EAAYG,KAxBhDvkE,KAAKuG,MACHgW,EAAAzY,eAAe+qD,mCACf5jD,EAAW7G,MAAOigE,EAAWx/D,WAAY2/D,EAAW3/D,YAEtD7E,KAAK0qD,YAAcyK,EACZn1D,KAAKL,OAAO6sC,sBAsBvB8d,EAAAroD,UAAAo0D,8BAAA,SAA8BprD,EAAoCkqD,GAChE,IAAIx1D,EAASK,KAAKL,OACdkzB,EAAkB7yB,KAAK6yB,gBAGvB4xC,EAAWzkE,KAAKkvD,kBAClBjkD,EAAWiE,QACXimD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAc,KAMpB,GAAIz4C,EAAA2Y,gBAAgBovC,IAAa/nD,EAAA4Y,aAAa2F,YAAa,OAAOwpC,EAElE,IAYIC,EAZAha,EAAc1qD,KAAK0qD,YAGnBoJ,EAA0B,KAW9B,OAVIqB,GAAkB34C,EAAAyE,KAAKc,OACzB+xC,EAAYjhC,EAAgB/C,aAAa46B,GAAa,GACtD+Z,EAAW9kE,EAAOkpC,eAChBirB,EAAU1mC,MACVq3C,IAMIx5D,EAAWI,UACjB,KAAK3E,EAAAC,MAAMk7C,UACT,OAAQ6I,EAAY3jD,MAClB,OACA,OACA,OACA,OACA,OACA,OACA,QACE29D,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAASy5B,OACT8U,EACA9kE,EAAO2nC,UAAU,IAEnB,MAEF,OAEE,GAAItnC,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAauC,aAC5C,CACZ6lD,EAAY1kE,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAASu1D,EAAUx5D,GAC9E,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAGlB,OACE,IAAIxrB,EAAUhhB,KAAKghB,QACnB0jD,EAAY/kE,EAAO0oC,aACjBrnB,EAAQkB,SACJxF,EAAAwZ,SAASsiC,OACT97C,EAAAwZ,SAASy5B,OACb8U,EACA/Z,EAAYzN,YAAYt9C,IAE1B,MAEF,OACA,OACE+kE,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAASsiC,OACTiM,EACA9kE,EAAO+nC,UAAU,IAEnB,MAEF,QACEg9B,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAASuiC,OACTgM,EACA9kE,EAAOmoC,UAAU,IAEnB,MAEF,QACE48B,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAASwiC,OACT+L,EACA9kE,EAAOqoC,UAAU,IAEnB,MAEF,QAEE,OADAvkC,QAAO,GACA9D,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMm7C,YACT,OAAQ4I,EAAY3jD,MAClB,OACA,OACA,OACA,OACA,OACA,OACA,QACE29D,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAASyiC,OACT8L,EACA9kE,EAAO2nC,UAAU,IAEnB,MAEF,OAEE,GAAItnC,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAC5C,IAAI+zC,EAEEzpB,EADN,GADIypB,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAawC,aAC5C,CACZ4lD,EAAY1kE,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAASu1D,EAAUx5D,GAC9E,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAGlB,OACMxrB,EAAUhhB,KAAKghB,QACnB0jD,EAAY/kE,EAAO0oC,aACjBrnB,EAAQkB,SACJxF,EAAAwZ,SAAS0iC,OACTl8C,EAAAwZ,SAASyiC,OACb8L,EACA/Z,EAAYzN,YAAYt9C,IAE1B,MAEF,OACA,OACE+kE,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAAS0iC,OACT6L,EACA9kE,EAAO+nC,UAAU,IAEnB,MAEF,QACEg9B,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAAS2iC,OACT4L,EACA9kE,EAAOmoC,UAAU,IAEnB,MAEF,QACE48B,EAAY/kE,EAAO0oC,aACjB3rB,EAAAwZ,SAAS4iC,OACT2L,EACA9kE,EAAOqoC,UAAU,IAEnB,MAEF,QAEE,OADAvkC,QAAO,GACA9D,EAAO6sC,oBAGlB,MAEF,QAEE,OADA/oC,QAAO,GACA9D,EAAO6sC,oBAKlB,IAAKsnB,EAEH,OADA9zD,KAAK0qD,YAAcluC,EAAAyE,KAAKc,KACjB/hB,KAAKi1D,2BAA2BhqD,EAAWiE,QAChDw1D,GACA,GAKJ,IAAIC,EAAW3kE,KAAKi1D,2BAA2BhqD,EAAWiE,QACxDw1D,GACA,GAGF1kE,KAAK0qD,YAAcoJ,EAAUxrD,KAC7BuqB,EAAgBzC,cAAc0jC,GAC9B,IAAIlH,EAAakH,EAAUxrD,KAAK2nB,eAEhC,OAAOtwB,EAAOkrC,YAAY,MACxB85B,EACAhlE,EAAOgpC,eAAemrB,EAAU1mC,MAAOw/B,IACtCA,IAGLtC,EAAAroD,UAAAq0D,6BAAA,SACErrD,EACAkqD,GAEA,IAEI9qD,EAFA1K,EAASK,KAAKL,OACdy4D,GAAW,EAGf,OAAQntD,EAAWI,UACjB,KAAK3E,EAAAC,MAAM4X,KAWT,GAVAlU,EAAOrK,KAAKkvD,kBACVjkD,EAAWiE,QACXimD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAc,KAMhBn1D,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAaiC,MAC5C,CACZlU,EAAOrK,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAAS7E,EAAMY,GACrE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAIhB,MAEF,KAAK9lC,EAAAC,MAAM8X,MACT,GAAIxT,EAAWiE,QAAQnI,MAAQ0V,EAAA5V,SAASG,UAClBiE,EAAWiE,QAASkI,aAAeqF,EAAAvF,YAAYa,SAC/C9M,EAAWiE,QAASkI,aAAeqF,EAAAvF,YAAYU,OAClE,CAEDvN,EAAOrK,KAAKg2D,yBAA4C/qD,EAAWiE,QAASimD,GAAgB,GAExFn1D,KAAKghB,QAAQ0P,WAAW1wB,KAAKoyD,iBAAiB/nD,EAAMY,EAAW7G,OACnE,MAaF,GAVAiG,EAAOrK,KAAKkvD,kBACVjkD,EAAWiE,QACXimD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAc,KAMhBn1D,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAamC,OAC5C,CACZpU,EAAOrK,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAAS7E,EAAMY,GACrE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAGhB,OAAQxsC,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASyiC,OAAQh5D,EAAO2nC,UAAU,GAAIj9B,GACjE,MAEF,OACA,OACEA,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS0iC,OACTl8C,EAAAwZ,SAASyiC,OACb34D,KAAK0qD,YAAY1N,aAAar9C,GAC9B0K,GAEF,MAEF,OACA,OACEA,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS0iC,OAAQj5D,EAAO+nC,UAAU,GAAIr9B,GACjE,MAEF,QACEA,EAAO1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQwrC,OAAQv6D,GAC1C,MAEF,QACEA,EAAO1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQyrC,OAAQx6D,GAC1C,MAEF,QACE5G,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMk7C,UAYT,GAXAuW,GAAW,EACX/tD,EAAOrK,KAAKkvD,kBACVjkD,EAAWiE,QACXimD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAc,KAMhBn1D,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAakC,YAC5C,CACZnU,EAAOrK,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAAS7E,EAAMY,GACrE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAGhB,OAAQxsC,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASy5B,OAAQtlD,EAAMrK,KAAKL,OAAO2nC,UAAU,IACxE,MAEF,OACA,OACEj9B,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASsiC,OACT97C,EAAAwZ,SAASy5B,OACbtlD,EACArK,KAAK0qD,YAAYzN,YAAYt9C,IAE/B,MAEF,OACA,OACE0K,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASsiC,OAAQnuD,EAAM1K,EAAO+nC,UAAU,IACnE,MAEF,QACEr9B,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASuiC,OAAQpuD,EAAM1K,EAAOmoC,UAAU,IACnE,MAEF,QACEz9B,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASwiC,OAAQruD,EAAM1K,EAAOqoC,UAAU,IACnE,MAEF,QACEvkC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAMm7C,YAYT,GAXAsW,GAAW,EACX/tD,EAAOrK,KAAKkvD,kBACVjkD,EAAWiE,QACXimD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAc,KAMhBn1D,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAE5C,GADI+zC,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAaoC,YAC5C,CACZrU,EAAOrK,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAAS7E,EAAMY,GACrE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAGhB,OAAQxsC,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASyiC,OAAQtuD,EAAM1K,EAAO2nC,UAAU,IACnE,MAEF,OACA,OACEj9B,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAAS0iC,OACTl8C,EAAAwZ,SAASyiC,OACbtuD,EACArK,KAAK0qD,YAAYzN,YAAYt9C,IAE/B,MAEF,OACA,OACE0K,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS0iC,OAAQvuD,EAAM1K,EAAO+nC,UAAU,IACnE,MAEF,QACEr9B,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS2iC,OAAQxuD,EAAM1K,EAAOmoC,UAAU,IACnE,MAEF,QACEz9B,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS4iC,OAAQzuD,EAAM1K,EAAOqoC,UAAU,IACnE,MAEF,QACEvkC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAM07C,YAWT,GAVAh4C,EAAOrK,KAAKkvD,kBACVjkD,EAAWiE,QACXimD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAc,KAMhBn1D,KAAK0qD,YAAY3iD,GAAE,KAErB,GADI+zC,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAaqC,KAC5C,CACZtU,EAAOrK,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAAS7E,EAAMY,GACrE,MAMNZ,EAAOrK,KAAK8kE,eAAez6D,EAAMrK,KAAK0qD,aACtC1qD,KAAK0qD,YAAcluC,EAAAyE,KAAKW,KACxB,MAEF,KAAKlb,EAAAC,MAAM27C,MAaT,GAZAj4C,EAAOrK,KAAKkvD,kBACVjkD,EAAWiE,QACXimD,GAAkB34C,EAAAyE,KAAKc,KACnBvF,EAAAyE,KAAKG,IACL+zC,EAAeptD,GAAE,GACfyU,EAAAyE,KAAKI,IACL8zC,EAAc,KAMlBn1D,KAAK0qD,YAAY3iD,GAAE,KAAuB,CAC5C,IAAI+zC,EAEEzpB,EADN,GADIypB,EAAiB97C,KAAK0qD,YAAY5O,eAGpC,GADIzpB,EAAWypB,EAAe5pB,eAAeupB,EAAAn/B,aAAasC,aAC5C,CACZvU,EAAOrK,KAAKo6D,qBAAqB/nC,EAAUpnB,EAAWiE,QAAS7E,EAAMY,GACrE,MAOJ,OAJAjL,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAUhB,OAREniC,EAAOrK,KAAKu2D,kBACVlsD,EACArK,KAAK0qD,YAAa1qD,KAAK0qD,YAAYgP,QAAO,IAE1CzuD,EAAWiE,SAIPlP,KAAK0qD,YAAY3jD,MACvB,OACA,OACA,OACA,OACA,OACA,OACA,QACEsD,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASgkC,OAAQ7vD,EAAM1K,EAAO2nC,WAAW,IACpE,MAEF,OACA,OACEj9B,EAAO1K,EAAO0oC,aACZroC,KAAKghB,QAAQkB,SACTxF,EAAAwZ,SAASikC,OACTz9C,EAAAwZ,SAASgkC,OACb7vD,EACArK,KAAK0qD,YAAYxN,eAAev9C,IAElC,MAEF,OACA,OACE0K,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASikC,OAAQ9vD,EAAM1K,EAAO+nC,WAAW,GAAI,IACxE,MAEF,QACEjkC,QAAO,GACP4G,EAAO1K,EAAO6sC,oBAGlB,MAEF,KAAK9lC,EAAAC,MAAM85C,OAKT,OAJAzgD,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAENzE,EAAO6sC,oBAEhB,QAEE,OADA/oC,QAAO,GACA9D,EAAO6sC,oBAGlB,OAAO4rB,EACHp4D,KAAKi1D,2BAA2BhqD,EAAWiE,QAAS7E,EAAM8qD,GAAkB34C,EAAAyE,KAAKc,MACjF1X,GAINigD,EAAAroD,UAAAu0D,uBAAA,SAAuBnsD,EAAqB/B,GAC1C,IAAI3I,EAASK,KAAKL,OACdgwB,EAAO3vB,KAAK6yB,gBAAgBlD,KAChC,OAAQrnB,EAAKvB,MACX,OACM4oB,EAAKyF,YAAY/qB,EAAM/B,KACzB+B,EAAOrK,KAAKghB,QAAQwB,WAAU,GAC1B7iB,EAAOuoC,YAAYxrB,EAAA0c,QAAQ2rC,cAAe16D,GAC1C1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS2C,OAC3Bl5B,EAAO0oC,aAAa3rB,EAAAwZ,SAASwC,OAC3BruB,EACA1K,EAAO2nC,UAAU,KAEnB3nC,EAAO2nC,UAAU,MAGzB,MAEF,OACM3X,EAAKyF,YAAY/qB,EAAM/B,KACzB+B,EAAOrK,KAAKghB,QAAQwB,WAAU,GAC1B7iB,EAAOuoC,YAAYxrB,EAAA0c,QAAQ4rC,eAAgB36D,GAC3C1K,EAAO0oC,aAAa3rB,EAAAwZ,SAAS2C,OAC3Bl5B,EAAO0oC,aAAa3rB,EAAAwZ,SAASwC,OAC3BruB,EACA1K,EAAO2nC,UAAU,KAEnB3nC,EAAO2nC,UAAU,MAGzB,MAEF,OACM3X,EAAKyF,YAAY/qB,EAAM/B,KACzB+B,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASsC,OAClCnuB,EACA1K,EAAO2nC,UAAU,OAGrB,MAEF,OACM3X,EAAKyF,YAAY/qB,EAAM/B,KACzB+B,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASsC,OAClCnuB,EACA1K,EAAO2nC,UAAU,SAGrB,MAEF,QACM3X,EAAKyF,YAAY/qB,EAAM/B,KAEzB+B,EAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASK,MAClClsB,EACA1K,EAAO2nC,UAAU,KAMzB,OAAOj9B,GAITigD,EAAAroD,UAAA6iE,eAAA,SAAez6D,EAAqB/B,GAClC,IAAI3I,EAASK,KAAKL,OAClB,OAAQ2I,EAAKvB,MACX,OACA,OACA,OACA,OACA,QACEsD,EAAOrK,KAAKw2D,uBAAuBnsD,EAAM/B,GAG3C,OACA,OACE,OAAO3I,EAAOuoC,YAAYxrB,EAAA0c,QAAQC,OAAQhvB,GAE5C,OACA,OACE,OAAO1K,EAAOuoC,YAAYxrB,EAAA0c,QAAQE,OAAQjvB,GAE5C,OACA,OACE,OAAO1K,EAAOuoC,YAAyB,IAAb5/B,EAAKswB,KAAalc,EAAA0c,QAAQE,OAAS5c,EAAA0c,QAAQC,OAAQhvB,GAE/E,QACE,OAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASG,MAAOhsB,EAAM1K,EAAOmoC,UAAU,IAEpE,QACE,OAAOnoC,EAAO0oC,aAAa3rB,EAAAwZ,SAASI,MAAOjsB,EAAM1K,EAAOqoC,UAAU,IAEpE,QAEE,OADAvkC,QAAO,GACA9D,EAAO2nC,UAAU,KAM9BgjB,EAAAroD,UAAAywD,cAAA,SAAcroD,EAAqB/B,GACjC,IAAI3I,EAASK,KAAKL,OAClB,OAAQ2I,EAAKvB,MACX,OACA,OACA,OACA,OACA,QACEsD,EAAOrK,KAAKw2D,uBAAuBnsD,EAAM/B,GAG3C,OACA,OACE,OAAO+B,EAET,OACA,OACE,OAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASM,MAAOnsB,EAAM1K,EAAO+nC,UAAU,IAEpE,OACA,OACE,OAAoB,IAAbp/B,EAAKswB,KACRj5B,EAAO0oC,aAAa3rB,EAAAwZ,SAASM,MAAOnsB,EAAM1K,EAAO+nC,UAAU,IAC3Dr9B,EAEN,QACE,OAAO1K,EAAO0oC,aAAa3rB,EAAAwZ,SAASO,MAAOpsB,EAAM1K,EAAOmoC,UAAU,IAEpE,QACE,OAAOnoC,EAAO0oC,aAAa3rB,EAAAwZ,SAASQ,MAAOrsB,EAAM1K,EAAOqoC,UAAU,IAEpE,QAEE,OADAvkC,QAAO,GACA9D,EAAO2nC,UAAU,KAM9BgjB,EAAAroD,UAAA8hE,aAAA,SAAaH,EAAsBnW,WAC7B9tD,EAASK,KAAKL,OACdkzB,EAAkB7yB,KAAK6yB,gBACvBg6B,EAAiB7sD,KAAKghB,QAAQ6rC,eAG9BiH,EAAYjhC,EAAgB/C,aAAa8zC,EAAct7D,MAAM,GAC7DwsD,EAAe,IAAI3uD,MAQvB,GAPA2uD,EAAajvD,KACXlG,EAAO8qC,eAAeqpB,EAAU1mC,MAC9Bs8B,EAAAga,gBAAgB1jE,KAAM4jE,EAAenW,KAKrCmW,EAAc5zD,YAChB,IAAmB,IAAAqf,EAAAnL,EAAA0/C,EAAc5zD,QAAQtC,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAA9C,IAAI9J,EAAMgK,EAAAhjB,MACb,GAAIgZ,EAAOvT,MAAQ00C,EAAAz8B,YAAYoS,MAAO,CACpC,IAAIoB,EAAelY,EACf2qD,EAAYzyC,EAAMlqB,KAClB48D,EAAkBD,EAAUh1C,eAC5Bk1C,EAAmB3yC,EAAMvwB,UAAU4J,YAEvC,GADApI,QAAQ+uB,EAAMvqB,MAAMxB,EAAApE,YAAYgqB,QAC5B84C,EAAiBl8D,YACnB6rD,EAAajvD,KAAKlG,EAAO2pC,YAAY27B,EAAUz+C,SAC7C7mB,EAAOgpC,eAAemrB,EAAU1mC,MAAOy/B,GACvC7sD,KAAKkvD,kBACHiW,EAAiBl8D,YACjBg8D,EAAS,KAIXC,EACA1yC,EAAMnB,mBAEH,CAEL,IAAIlW,EAAoCqX,EAAMvwB,UAAU4J,YAAasP,eACrE25C,EAAajvD,KAAKlG,EAAO2pC,YAAY27B,EAAUz+C,SAC7C7mB,EAAOgpC,eAAemrB,EAAU1mC,MAAOy/B,GACvC1xC,GAAkB,EACdxb,EAAOgpC,eAAe,EAAIxtB,EAAgB+pD,GAC1CD,EAAUjoB,aAAar9C,GACzBulE,EACF1yC,EAAMnB,mHAchB,OANAyjC,EAAajvD,KACXlG,EAAOgpC,eAAemrB,EAAU1mC,MAAOy/B,IAGzCh6B,EAAgBzC,cAAc0jC,GAC9B9zD,KAAK0qD,YAAckZ,EAAct7D,KAC1B3I,EAAOkrC,YAAY,KAAMiqB,EAAcjI,IAIhDvC,EAAAroD,UAAAsuD,wBAAA,SAAwBqT,EAAsBnW,GAE5C,IAAI9tD,EAASK,KAAKL,OACdktD,EAAiB7sD,KAAKghB,QAAQ6rC,eAElC,OADA7sD,KAAK0qD,YAAckZ,EAAct7D,KAC1B3I,EAAO2rC,SACE,GAAduhB,EACIltD,EAAO0oC,aACL3rB,EAAAwZ,SAASM,MACT72B,EAAOgpC,eAAe,EAAC,GACvBhpC,EAAO+nC,UAAU,IAEnB/nC,EAAOgpC,eAAe,EAAC,GAC3BhpC,EAAOgpC,eAAe,EAAGkkB,GACzBltD,EAAOkpC,eAAe,EACpB7oC,KAAK+jE,aAAaH,EAAenW,MAMvCnD,EAAAroD,UAAAmwD,iBAAA,SAAiB/nD,EAAqBjG,GACpC,IAAIyuB,EAAkB7yB,KAAK6yB,gBACvB/tB,EAASV,EAAMU,OACfA,EAAOqU,eAAiB,IAAGrU,EAAOqU,eAAiBnZ,KAAKL,OAAOq1C,iBAAiBlwC,EAAOC,iBAC3FX,EAAMysB,aAAexmB,EACrBwoB,EAAgB3E,eAAeroB,KAAKzB,IAExCkmD,EAv0OA,CAA8B/tC,EAAAtW,mBA20O9B,SAAS+oD,EACP3iD,EACAR,GAOA,GAJAu+C,EAA8Bv+C,EAAYzH,MAAMU,OAAO0U,WAEvD6wC,EAA+Bx+C,EAAYka,yBAEtC1Z,EAAQqb,aAAa+zB,EAAAx8B,eAAe9I,UAAzC,CAEA,IAAIoW,EAAUlgB,EAAQkgB,QAClBlQ,EAAY5Y,OAAOgZ,EAAAL,cAAcK,EAAA1G,cAAcI,SAAUtK,EAAYoE,aACrEtG,EAAO0S,EAAUvS,UACrB,GAAIH,GAAQA,EAAKrE,OAAQ,CACvB,IAAI0X,EAAMrT,EAAK,GAGXqT,EAAIjW,MAAQ0V,EAAA5V,SAASG,SAA+BgW,EAAK5F,aAAeqF,EAAAvF,YAAYkB,QACtFiyC,EAAyDrtC,EAAK1b,MAC1DqI,EAAKrE,QAAU,KACjB0X,EAAMrT,EAAK,IACH5C,MAAQ0V,EAAA5V,SAASG,SAA+BgW,EAAK5F,aAAeqF,EAAAvF,YAAYkB,QACtFgyC,EAA8BC,EAC9BA,EAAyDrtC,EAAK1b,MAC1DqI,EAAKrE,OAAS,GAChBinB,EAAQhmB,MACNgW,EAAAzY,eAAeomB,+BACf7N,EAAUjY,MAAO,IAAKuF,EAAKrE,OAAOT,aAItC0nB,EAAQhmB,MACNgW,EAAAzY,eAAemmB,wBACfjN,EAAI5Y,SAKVmoB,EAAQhmB,MACNgW,EAAAzY,eAAemmB,wBACfjN,EAAI5Y,YAIRmoB,EAAQhmB,MACNgW,EAAAzY,eAAes5D,wCACf/gD,EAAUjY,MAAO,IAAK,MA13Of1E,EAAA4qD,0FC1Pb,SAAYxmD,GACVA,IAAA,uDACAA,IAAA,+CACAA,IAAA,qCACAA,IAAA,mHACAA,IAAA,6LACAA,IAAA,6EACAA,IAAA,yFACAA,IAAA,uEACAA,IAAA,qEACAA,IAAA,+HACAA,IAAA,qIACAA,IAAA,mGACAA,IAAA,yEACAA,IAAA,+FACAA,IAAA,yFACAA,IAAA,mEACAA,IAAA,+CACAA,IAAA,yMACAA,IAAA,+FACAA,IAAA,mHACAA,IAAA,yFACAA,IAAA,uJACAA,IAAA,mFACAA,IAAA,gEACAA,IAAA,gDACAA,IAAA,gCACAA,IAAA,0FACAA,IAAA,8DACAA,IAAA,0CACAA,IAAA,4GACAA,IAAA,gHACAA,IAAA,0HACAA,IAAA,sGACAA,IAAA,0GACAA,IAAA,wEACAA,IAAA,gFACAA,IAAA,gGACAA,IAAA,sGACAA,IAAA,gHACAA,IAAA,oFACAA,IAAA,4EACAA,IAAA,8HACAA,IAAA,8HACAA,IAAA,wFACAA,IAAA,gHACAA,IAAA,gFACAA,IAAA,oKACAA,IAAA,kLACAA,IAAA,8HACAA,IAAA,gDACAA,IAAA,oCACAA,IAAA,gJACAA,IAAA,4CACAA,IAAA,oGACAA,IAAA,sCACAA,IAAA,8DACAA,IAAA,sDACAA,IAAA,4CACAA,IAAA,4DACAA,IAAA,wIACAA,IAAA,sDACAA,IAAA,wDACAA,IAAA,oEACAA,IAAA,kDACAA,IAAA,wFACAA,IAAA,wFACAA,IAAA,gHACAA,IAAA,oDACAA,IAAA,kDACAA,IAAA,0HACAA,IAAA,gKACAA,IAAA,kFACAA,IAAA,oEACAA,IAAA,kKACAA,IAAA,kJACAA,IAAA,0IACAA,IAAA,oFACAA,IAAA,sIACAA,IAAA,sDACAA,IAAA,8CACAA,IAAA,4EACAA,IAAA,4FACAA,IAAA,oDACAA,IAAA,8EACAA,IAAA,kFACAA,IAAA,sGACAA,IAAA,0GACAA,IAAA,gFACAA,IAAA,sNACAA,IAAA,0JACAA,IAAA,sIACAA,IAAA,4LACAA,IAAA,sLACAA,IAAA,oGACAA,IAAA,oGACAA,IAAA,oFACAA,IAAA,wKACAA,IAAA,kHACAA,IAAA,4EACAA,IAAA,4KACAA,IAAA,0DACAA,IAAA,8FACAA,IAAA,4JACAA,IAAA,gIACAA,IAAA,gJACAA,IAAA,gJACAA,IAAA,sGACAA,IAAA,sEACAA,IAAA,wFACAA,IAAA,gFACAA,IAAA,sQACAA,IAAA,8KACAA,IAAA,kLACAA,IAAA,kFACAA,IAAA,0IACAA,IAAA,0CACAA,IAAA,wFACAA,IAAA,4HAtHF,CAAYpE,EAAAoE,iBAAApE,EAAAoE,oBA0HZpE,EAAAqE,uBAAA,SAAuCG,GACrC,OAAQA,GACN,KAAK,IAAK,MAAO,2BACjB,KAAK,IAAK,MAAO,uBACjB,KAAK,IAAK,MAAO,oBACjB,KAAK,IAAK,MAAO,iEACjB,KAAK,IAAK,MAAO,sGACjB,KAAK,IAAK,MAAO,8CACjB,KAAK,IAAK,MAAO,oDACjB,KAAK,IAAK,MAAO,uCACjB,KAAK,IAAK,MAAO,kCACjB,KAAK,IAAK,MAAO,+DACjB,KAAK,IAAK,MAAO,kEACjB,KAAK,IAAK,MAAO,iDACjB,KAAK,IAAK,MAAO,oCACjB,KAAK,IAAK,MAAO,uDACjB,KAAK,IAAK,MAAO,gDACjB,KAAK,IAAK,MAAO,qCACjB,KAAK,IAAK,MAAO,uBACjB,KAAK,IAAK,MAAO,qGACjB,KAAK,IAAK,MAAO,+CACjB,KAAK,IAAK,MAAO,6DACjB,KAAK,IAAK,MAAO,gDACjB,KAAK,IAAK,MAAO,iFACjB,KAAK,IAAK,MAAO,yCACjB,KAAK,KAAM,MAAO,+BAClB,KAAK,KAAM,MAAO,uBAClB,KAAK,KAAM,MAAO,kBAClB,KAAK,KAAM,MAAO,4CAClB,KAAK,KAAM,MAAO,8BAClB,KAAK,KAAM,MAAO,oBAClB,KAAK,KAAM,MAAO,qDAClB,KAAK,KAAM,MAAO,uDAClB,KAAK,KAAM,MAAO,4DAClB,KAAK,KAAM,MAAO,kDAClB,KAAK,KAAM,MAAO,oDAClB,KAAK,KAAM,MAAO,sCAClB,KAAK,KAAM,MAAO,uCAClB,KAAK,KAAM,MAAO,+CAClB,KAAK,KAAM,MAAO,oDAClB,KAAK,KAAM,MAAO,yDAClB,KAAK,KAAM,MAAO,2CAClB,KAAK,KAAM,MAAO,qCAClB,KAAK,KAAM,MAAO,8DAClB,KAAK,KAAM,MAAO,8DAClB,KAAK,KAAM,MAAO,2CAClB,KAAK,KAAM,MAAO,yDAClB,KAAK,KAAM,MAAO,uCAClB,KAAK,KAAM,MAAO,mFAClB,KAAK,KAAM,MAAO,0FAClB,KAAK,KAAM,MAAO,gEAClB,KAAK,KAAM,MAAO,uBAClB,KAAK,KAAM,MAAO,iBAClB,KAAK,KAAM,MAAO,2EAClB,KAAK,KAAM,MAAO,yBAClB,KAAK,KAAM,MAAO,iDAClB,KAAK,KAAM,MAAO,kBAClB,KAAK,KAAM,MAAO,8BAClB,KAAK,KAAM,MAAO,0BAClB,KAAK,KAAM,MAAO,qBAClB,KAAK,KAAM,MAAO,gCAClB,KAAK,KAAM,MAAO,qEAClB,KAAK,KAAM,MAAO,0BAClB,KAAK,KAAM,MAAO,2BAClB,KAAK,KAAM,MAAO,iCAClB,KAAK,KAAM,MAAO,wBAClB,KAAK,KAAM,MAAO,4CAClB,KAAK,KAAM,MAAO,2CAClB,KAAK,KAAM,MAAO,yDAClB,KAAK,KAAM,MAAO,yBAClB,KAAK,KAAM,MAAO,wBAClB,KAAK,KAAM,MAAO,4DAClB,KAAK,KAAM,MAAO,+EAClB,KAAK,KAAM,MAAO,wCAClB,KAAK,KAAM,MAAO,iCAClB,KAAK,KAAM,MAAO,mFAClB,KAAK,KAAM,MAAO,4EAClB,KAAK,KAAM,MAAO,wEAClB,KAAK,KAAM,MAAO,yCAClB,KAAK,KAAM,MAAO,kEAClB,KAAK,KAAM,MAAO,8BAClB,KAAK,KAAM,MAAO,0BAClB,KAAK,KAAM,MAAO,6CAClB,KAAK,KAAM,MAAO,oDAClB,KAAK,KAAM,MAAO,6BAClB,KAAK,KAAM,MAAO,8CAClB,KAAK,KAAM,MAAO,4CAClB,KAAK,KAAM,MAAO,mDAClB,KAAK,KAAM,MAAO,qDAClB,KAAK,KAAM,MAAO,+CAClB,KAAK,KAAM,MAAO,+GAClB,KAAK,KAAM,MAAO,8EAClB,KAAK,KAAM,MAAO,oEAClB,KAAK,KAAM,MAAO,6FAClB,KAAK,KAAM,MAAO,0FAClB,KAAK,KAAM,MAAO,6DAClB,KAAK,KAAM,MAAO,oDAClB,KAAK,KAAM,MAAO,yCAClB,KAAK,KAAM,MAAO,mFAClB,KAAK,KAAM,MAAO,wDAClB,KAAK,KAAM,MAAO,qCAClB,KAAK,KAAM,MAAO,yFAClB,KAAK,KAAM,MAAO,oCAClB,KAAK,KAAM,MAAO,sDAClB,KAAK,KAAM,MAAO,+EAClB,KAAK,KAAM,MAAO,mEAClB,KAAK,KAAM,MAAO,2EAClB,KAAK,KAAM,MAAO,uEAClB,KAAK,KAAM,MAAO,sDAClB,KAAK,KAAM,MAAO,uCAClB,KAAK,KAAM,MAAO,gDAClB,KAAK,KAAM,MAAO,4CAClB,KAAK,KAAM,MAAO,mIAClB,KAAK,KAAM,MAAO,0FAClB,KAAK,KAAM,MAAO,4FAClB,KAAK,KAAM,MAAO,gDAClB,KAAK,KAAM,MAAO,oEAClB,KAAK,KAAM,MAAO,wBAClB,KAAK,KAAM,MAAO,2CAClB,KAAK,KAAM,MAAO,6DAClB,QAAS,MAAO,o6BCrPpB,IA+DYkhE,EA/DZ7oD,EAAApc,EAAA,GAKAs7C,EAAAt7C,EAAA,GAoBAsc,EAAAtc,EAAA,GAoBAqc,EAAArc,EAAA,GAOAsG,EAAAtG,EAAA,GAMA+C,EAAA/C,EAAA,IAKA,SAAYilE,GAEVA,IAAA,mBAEAA,IAAA,qBAJF,CAAYA,EAAA1lE,EAAA0lE,aAAA1lE,EAAA0lE,gBAQZ,IAAA3kD,EAAA,SAAAnL,GAaE,SAAAmL,EAAY8L,GAAZ,IAAA/W,EACEF,EAAA9U,KAAAR,KAAMusB,EAAQrmB,cAAYlG,YAR5BwV,EAAA6lD,sBAA2C,KAE3C7lD,EAAAqlD,yBAA+C,KAE/CrlD,EAAA6vD,0BAAiC,EAK/B7vD,EAAK+W,QAAUA,IAinCnB,OAhoC8BhX,EAAAkL,EAAAnL,GAmB5BmL,EAAAxe,UAAAwsD,YAAA,SACEvkD,EACAwjB,EACA43C,GAIA,QALA,IAAA53C,MAAA,WACA,IAAA43C,MAAaF,EAAWG,QAIpBr7D,EAAKnD,MAAQ0V,EAAA5V,SAASmP,UAAW,CACnC,IAAI/C,EAAYjT,KAAKwlE,iBAAgCt7D,EAAMwjB,EAAyB43C,GACpF,OAAKryD,EACE/I,EAAK7B,WAAa4K,EAAU3K,KAAKk0C,aAAevpC,EAAU3K,KAD1C,KAKzB7E,OAAOyG,EAAKnD,MAAQ0V,EAAA5V,SAAS6O,MAC7B,IAAI4mD,EAAqBpyD,EACrB2d,EAAay0C,EAAS17D,KAAKwE,KAC3BqhB,EAAaoB,EACbhE,EAAYy4C,EAASl4D,MAAMU,OAAOsM,aAAe3K,EAAAnE,eAAiBulB,EAIhEvI,EAAiBtf,KAAKusB,QAAQjN,eAC9BjT,OAAO,EACX,IACGA,EAAUiT,EAAepe,IAAI2iB,MAC7BxX,EAAUiT,EAAepe,IAAIulB,IAE9B,OAAQpa,EAAQtF,MACd,KAAK00C,EAAAz8B,YAAYyN,KACf,OAA+B,OAA3B6vC,EAASl0D,eAA0Bk0D,EAASl0D,cAAc9C,QACxDggE,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAek4D,sBACf9xD,EAAK9F,MAAOiI,EAAQ0W,cAGjB,MAEFvG,EAAAyE,KAAKG,IAEd,KAAKq6B,EAAAz8B,YAAYmG,gBACf,IAAIU,EAAW7lB,KAAK6wD,8BACFxkD,EAChBiwD,EAASl0D,cACTlF,EAAA2sD,QAAqBniC,GACrBxjB,GAEF,OAAK2b,EACE3b,EAAK7B,WAAawd,EAASvd,KAAKk0C,aAAe32B,EAASvd,KADzC,KAS5B,IAAIqM,EAAQ3U,KAAKusB,QAAQ9M,YAAYve,IAAI2mB,GACzC,GAAIlT,EAAO,OAAO3U,KAAKyuD,YAAY95C,EAAMrM,KAAMolB,EAAyB43C,GAI1E,IAAIxI,EAAoBR,EAASl0D,cAC7BA,EAA+B,KACnC,GAAI00D,EAAmB,CACrB,IAAI2I,EAAmB3I,EAAkBx3D,OACzC8C,EAAgB,IAAIjC,MAAYs/D,GAChC,IAAK,IAAIplE,EAAI,EAAGA,EAAIolE,IAAoBplE,EAAG,CACzC,IAAIqlE,EAAY1lE,KAAKyuD,YACnBqO,EAAkBz8D,GAClBqtB,EACA43C,GAEF,IAAKI,EAAW,OAAO,KACvBt9D,EAAc/H,GAAKqlE,EAErB,GAAID,EAAkB,CACpB,IAAIE,EAAcnpD,EAAA8gC,cAAcl1C,GAC5Bu9D,EAAYrgE,SACdue,GAAa,IAAM8hD,EAAc,IACjCl/C,GAAc,IAAMk/C,EAAc,UAE/B,GAAIj4C,EAAyB,CAClC,IAAIk4C,EAAkBl4C,EAAwBxsB,IAAIulB,GAClD,GAAIm/C,EAAiB,OAAOA,GAM9B,IAAIpmD,EAAcxf,KAAKusB,QAAQ/M,YAC3BlX,OAAI,EACR,IACGA,EAAOkX,EAAYte,IAAI2iB,MACvBvb,EAAOkX,EAAYte,IAAIulB,IAExB,OAAOne,EAKX,GAAkB,UAAduf,EAAwB,CAC1B,IAAMzf,GAAyC,GAAxBA,EAAc9C,OAOnC,OANIggE,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAe+hE,oCACfvJ,EAASl4D,MAAO,KAAM04D,EAAoBA,EAAkBx3D,OAAS,GAAGT,SAAS,KAG9E,KAET,OAAQuD,EAAc,GAAGrB,MACvB,OACA,OACA,OAAmB,OAAOyV,EAAAyE,KAAKG,IAC/B,OAAqB,IAAKphB,KAAKusB,QAAQvL,QAAQkB,SAAU,OAAO1F,EAAAyE,KAAKG,IACrE,OAAmB,OAAO5E,EAAAyE,KAAKI,IAC/B,OACA,OACA,OACA,QAAoB,OAAO7E,EAAAyE,KAAKQ,IAChC,OAAqB,IAAKzhB,KAAKusB,QAAQvL,QAAQkB,SAAU,OAAO1F,EAAAyE,KAAKQ,IACrE,OAAmB,OAAOjF,EAAAyE,KAAKS,IAC/B,QAAmB,OAAOlF,EAAAyE,KAAKY,IAC/B,QAAmB,OAAOrF,EAAAyE,KAAKa,IAC/B,QAAoB,OAAOtF,EAAAyE,KAAKc,KAChC,QAASte,QAAO,IAUpB,OANI6hE,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACfy3C,EAAS17D,KAAKwD,MAAOqiB,GAGlB,MAIThG,EAAAxe,UAAAujE,iBAAA,SACEt7D,EACAwjB,EACA43C,QADA,IAAA53C,MAAA,WACA,IAAA43C,MAAyBF,EAAWG,QAEpC,IAAIh8D,EAAmBW,EAAKX,iBACxB0lB,EAAwB,KAC5B,GAAI1lB,KACF0lB,EAAWjvB,KAAKyuD,YAAYllD,EAAkBmkB,EAAyB43C,IACxD,OAAO,KAQxB,IANA,IAAIQ,EAAqB57D,EAAKb,WAC1B40C,EAAgB6nB,EAAmBxgE,OACnCghB,EAAiB,IAAIngB,MAAY83C,GACjCR,EAAiB,IAAIt3C,MAAc83C,GACnCP,EAAqB,EACrBC,GAAU,EACLt9C,EAAI,EAAGA,EAAI49C,IAAiB59C,EAAG,CACtC,IAAI0lE,EAAoBD,EAAmBzlE,GAC3C,OAAQ0lE,EAAkB58D,eACxB,KAAKsT,EAAA7G,cAAc4pC,QACjB9B,EAAqBr9C,EAAI,EACzB,MAEF,KAAKoc,EAAA7G,cAAcowD,KACjBviE,OAAOpD,GAAK49C,GACZN,GAAU,EAId,IAAInuB,EAAgBxvB,KAAKyuD,YACvBhrD,OAAOsiE,EAAkBz9D,MACzBolB,EACA43C,GAEF,IAAK91C,EAAe,OAAO,KAC3BlJ,EAAejmB,GAAKmvB,EACpBiuB,EAAep9C,GAAK0lE,EAAkBnlE,KAAKwE,KAE7C,IACIkE,EADA28D,EAAiB/7D,EAAKZ,WAE1B,GAAI28D,GAEF,KADA38D,EAAatJ,KAAKyuD,YAAYwX,EAAgBv4C,EAAyB43C,IACtD,OAAO,UAExBh8D,EAAakT,EAAAyE,KAAKc,KAEpB,IAAI9O,EAAY,IAAIuJ,EAAA+gC,UAAUj3B,EAAgBhd,EAAY2lB,GAI1D,OAHAhc,EAAUwqC,eAAiBA,EAC3BxqC,EAAUyqC,mBAAqBA,EAC/BzqC,EAAU0qC,QAAUA,EACb1qC,GAITwN,EAAAxe,UAAA86D,qBAAA,SACEjtD,EACAgtD,EACApvC,EACAkjC,EACA0U,QADA,IAAA1U,MAAA,WACA,IAAA0U,MAAyBF,EAAWG,QAIpC,IAFA,IAAIW,EAAoB,EACpBC,EAAoB,EACf9lE,EAAI,EAAGA,EAAIyP,EAAexK,SAAUjF,EACtCyP,EAAezP,GAAGwI,eAAeq9D,IACpCC,EAEJ,IAAIC,EAAgBtJ,EAAoBA,EAAkBx3D,OAAS,EACnE,GAAI8gE,EAAgBF,GAAqBE,EAAgBD,EAYvD,OAXAnmE,KAAKuG,MACHgW,EAAAzY,eAAe+hE,oCACfO,EACI3pD,EAAA7V,MAAMd,KACSg3D,EAAmB,GAAG14D,MACtB04D,EAAmBsJ,EAAgB,GAAGhiE,OAErDX,OAAOmtD,GAAuBxsD,MAAMuqD,OACvCyX,EAAgBF,EAAoBA,EAAoBC,GAAmBthE,SAAS,IACrFuhE,EAAcvhE,SAAS,KAElB,KAET,IAAIuD,EAAgB,IAAIjC,MAAYggE,GACpC,IAAS9lE,EAAI,EAAGA,EAAI8lE,IAAqB9lE,EAAG,CAC1C,IAAIiI,EAAOjI,EAAI+lE,EACXpmE,KAAKyuD,YACUqO,EAAmBz8D,GAChCqtB,EACA43C,GAEFtlE,KAAKyuD,YACHhrD,OAAOqM,EAAezP,GAAGwI,aACzB6kB,EACA43C,GAEN,IAAKh9D,EAAM,OAAO,KAElBolB,EAAwBxlB,IAAI4H,EAAezP,GAAGO,KAAKwE,KAAMkD,GACzDF,EAAc/H,GAAKiI,EAErB,OAAOF,GAITqY,EAAAxe,UAAAijB,kBAAA,SACErV,EACAgkD,EACAyR,QAAA,IAAAA,MAAyBF,EAAWG,QAEpC,IACIl5D,EADAzL,EAAOiP,EAAWzK,KAGtB,GAAIyuD,EAAS,CAEX,OAAQA,EAAQ9sD,MACd,KAAK00C,EAAAz8B,YAAYnH,SAEf,GADAxL,EAAqBwnD,EAASlkC,KAAKoE,eAAenzB,GAIhD,OAFAZ,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzBxuD,EAETwnD,EAAqBA,EAAS5xD,UAAU2F,OACxC,MAEF,KAAK6zC,EAAAz8B,YAAYvH,MACfo8C,EAAkBA,EAAS5xD,UAAU2F,OAMzC,KAAOisD,GAAS,CACd,IAAI7jD,EAAU6jD,EAAQ7jD,QACtB,GAAIA,IACE3D,EAAU2D,EAAQ9O,IAAIN,IAGxB,OAFAZ,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzBxuD,EAGXwnD,EAAUA,EAAQjsD,QAKtB,IAAI0X,EAAiBtf,KAAKusB,QAAQjN,eAClC,OAAIjT,EAAUiT,EAAepe,IAAI2O,EAAWzL,MAAMU,OAAOsM,aAAe3K,EAAAnE,eAAiB1B,KACvFZ,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzBxuD,IAILA,EAAUiT,EAAepe,IAAIN,KAC/BZ,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzBxuD,IAGLi5D,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAe+gB,mBACfhV,EAAWzL,MAAOxD,GAGf,OAIT6f,EAAAxe,UAAAokE,yBAAA,SAAyB3/C,EAAgB4+C,GACvC,QADuC,IAAAA,MAAyBF,EAAWG,QACvE7+C,EAAO3e,GAAGtB,EAAApE,YAAYwkB,UAAW,OAAO,EAC5C,IAAI4nC,EAAchrD,OAAOijB,EAAO7a,aAAavD,KAC7C,IAAKmmD,EAAa,OAAO,EACzB,IAAID,EAAexuD,KAAKyuD,YAAYA,EAAa,KAAM6W,GACvD,QAAK9W,IACL9nC,EAAOpe,KAAOkmD,EACd9nC,EAAOxe,IAAIzB,EAAApE,YAAYwkB,WAChB,IAITpG,EAAAxe,UAAAgiE,sBAAA,SACED,EACAsC,EACAhB,QAAA,IAAAA,MAAyBF,EAAWG,QAGpC,IAAIgB,EAAmBvC,EAAe/4D,WAClC+mB,EAAShyB,KAAK26D,kBAAkB4L,EAAkBD,EAAoBhB,GAC1E,IAAKtzC,EAAQ,OAAO,KAGpB,IAAIw0C,EAAexC,EAAehiE,SAASoD,KAG3C,OAAQ4sB,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAY5I,OAAQ,IAAKpW,KAAKqmE,yBAAiCr0C,EAAQszC,GAAa,OAAO,KAChG,KAAK7pB,EAAAz8B,YAAYqO,MACjB,KAAKouB,EAAAz8B,YAAYoS,MACf,IAAI9oB,EAA6B0pB,EAAQ1pB,KAGzC,GAFA7E,OAAO6E,GAAQkU,EAAAyE,KAAKc,QAChB+5B,EAAiBxzC,EAAKwzC,gBAMxB,OAJA97C,KAAKuG,MACHgW,EAAAzY,eAAe2/D,oCACfO,EAAehiE,SAASoC,MAAOoiE,EAAoCx0C,EAAQ1pB,KAAKzD,YAE3E,KAETmtB,EAAS8pB,EACT,MAEF,KAAKL,EAAAz8B,YAAYuL,SACf,IAOIuxB,EAPAj7C,EAASb,KAAKqmB,gBAChB5iB,OAAkBuuB,EAAQxH,iBAC1B,KACAtnB,EAAA2sD,UACAyV,GAEF,IAAKzkE,EAAQ,OAAO,KAEpB,KADIi7C,EAAiBj7C,EAAOoS,UAAU3J,WAAWwyC,gBAM/C,OAJA97C,KAAKuG,MACHgW,EAAAzY,eAAe2/D,oCACfO,EAAehiE,SAASoC,MAAOoiE,EAAc3lE,EAAOoS,UAAU3J,WAAWzE,YAEpE,KAETmtB,EAAS8pB,EACT,MAEF,KAAKL,EAAAz8B,YAAYvH,MACf,IAAIlL,EAAoBvM,KAAK66D,yBAC7B,GAAItuD,EAAmB,CACrB,IAAImvD,EAAqB1pC,EAAQE,eAAeupB,EAAAn/B,aAAaW,aAC7D,IAAKy+C,EAKH,OAJA17D,KAAKuG,MACHgW,EAAAzY,eAAem3D,qCACf1uD,EAAkBnI,MAAe4tB,EAAQjP,cAEpC,KAET,IAAIzZ,EAAaoyD,EAAWzoD,UAAU3J,WACtC,KAAM0oB,EAAS1oB,EAAWwyC,gBAKxB,OAJA97C,KAAKuG,MACHgW,EAAAzY,eAAe2/D,oCACfO,EAAehiE,SAASoC,MAAOoiE,EAAcl9D,EAAWzE,YAEnD,MAQf,OAAQmtB,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAYmG,gBACjB,KAAKs2B,EAAAz8B,YAAYvH,MACf,OAAG,CACD,IACI6C,OAAM,EACV,IAFItK,EAAUgiB,EAAOhiB,WAELsK,EAAStK,EAAQ9O,IAAIslE,IAGnC,OAFAxmE,KAAKq7D,sBAAwBkL,EAC7BvmE,KAAK66D,yBAA2B,KACzBvgD,EAGT,GAAI0X,EAAOjrB,MAAQ00C,EAAAz8B,YAAYmG,gBAAiB,CAC9C,IAAqB6M,EAAQ5M,cAG3B,MAFA4M,EAA0CA,EAAQ5M,kBAK/C,IAAI4M,EAAOjrB,MAAQ00C,EAAAz8B,YAAYvH,MAOpC,MANA,IAAYua,EAAQT,KAGlB,MAFAS,EAAwBA,EAAQT,MAQtC,MAEF,QACE,IAAIvhB,EACJ,GADIA,EAAUgiB,EAAOhiB,QAGnB,GADIsK,EAAStK,EAAQ9O,IAAIslE,GAIvB,OAFAxmE,KAAKq7D,sBAAwBkL,EAC7BvmE,KAAK66D,yBAA2B,KACzBvgD,EAUf,OAJAta,KAAKuG,MACHgW,EAAAzY,eAAe2/D,oCACfO,EAAehiE,SAASoC,MAAOoiE,EAAcx0C,EAAOjP,cAE/C,MAGTtC,EAAAxe,UAAAy9D,qBAAA,SACE+G,EACAH,EACAhB,QAAA,IAAAA,MAAyBF,EAAWG,QAEpC,IAAIgB,EAAmBE,EAAcx7D,WACjC+mB,EAAShyB,KAAK26D,kBAAkB4L,EAAkBD,EAAoBhB,GAC1E,IAAKtzC,EAAQ,OAAO,KACpB,OAAQA,EAAOjrB,MACb,KAAK00C,EAAAz8B,YAAY5I,OAAQ,IAAKpW,KAAKqmE,yBAAiCr0C,EAAQszC,GAAa,OAAO,KAChG,KAAK7pB,EAAAz8B,YAAYqO,MACjB,KAAKouB,EAAAz8B,YAAYoS,MAEf,GAAIY,EAD6BA,EAAQ1pB,KACvBwzC,eAGhB,OAFA97C,KAAKq7D,sBAAwBkL,EAC7BvmE,KAAK66D,yBAA2B4L,EAAcl6D,kBACvCylB,EAET,MAEF,KAAKypB,EAAAz8B,YAAYvH,MACf,IAAIikD,EAAqB1pC,EAAQE,eAAeupB,EAAAn/B,aAAaW,aAC7D,OAAKy+C,EASD6K,EAAiBx/D,MAAQ0V,EAAA5V,SAASU,eAEhCyqB,EADa0pC,EAAWzoD,UAAU3J,WACdwyC,iBACtB97C,KAAKq7D,sBAAwBkL,EAC7BvmE,KAAK66D,yBAA2B4L,EAAcl6D,kBACvCylB,GAEF,MAEThyB,KAAKq7D,sBAAwBkL,EAC7BvmE,KAAK66D,yBAA2B4L,EAAcl6D,kBACvCylB,IAnBDszC,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAem3D,qCACfwL,EAAcriE,MAAe4tB,EAAQjP,cAGlC,MAsBb,OANIuiD,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfs+C,EAAiBniE,OAGd,MAGTqc,EAAAxe,UAAA04D,kBAAA,SACE1vD,EACAq7D,EACAhB,GAEA,SAFA,IAAAA,MAAyBF,EAAWG,QAE7Bt6D,EAAWlE,MAAQ0V,EAAA5V,SAASY,eACjCwD,EAAuCA,EAAYA,WAErD,OAAQA,EAAWlE,MACjB,KAAK0V,EAAA5V,SAAS0Q,UACZ,IAAIjP,EAAOtI,KAAKyuD,YACQxjD,EAAYC,OAClCo7D,EAAmB32C,KAAKjC,wBACxB43C,GAEF,GAAIh9D,EAEF,GADIi0C,EAAYj0C,EAAKwzC,eAInB,OAFA97C,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzBte,EAGX,OAAO,KAET,KAAK9/B,EAAA5V,SAAS2Q,OACZ,MAAM,IAAIkO,MAAM,mBAElB,KAAKjJ,EAAA5V,SAASyR,KACZ,GAAIguD,EAAmB32C,KAAK5nB,GAAE,MAE5B,GADI2+D,EAAgBJ,EAAmB32C,KAAKoE,eAAe,QAIzD,OAFA/zB,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzB6L,EAIX,OADI9+D,EAAS0+D,EAAmB1+D,SAE9B5H,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzBjzD,IAEL09D,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAe+7D,+CACf50D,EAAW7G,OAGR,MAET,KAAKqY,EAAA5V,SAASwR,MAEV,IAAIquD,EAOF9+D,EARJ,GAAI0+D,EAAmB32C,KAAK5nB,GAAE,MAE5B,GADI2+D,EAAgBJ,EAAmB32C,KAAKoE,eAAe,SAIzD,OAFA/zB,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzB6L,EAIX,OADI9+D,EAAS0+D,EAAmB1+D,SAClBA,EAAOb,MAAQ00C,EAAAz8B,YAAYvH,QAAU7P,EAAiBA,EAAQ2pB,OAC1EvxB,KAAKq7D,sBAAwB,KAC7Br7D,KAAK66D,yBAA2B,KACzBjzD,IAEL09D,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAei8D,iDACf90D,EAAW7G,OAGR,MAET,KAAKqY,EAAA5V,SAASQ,WACZ,OAAOrH,KAAKklB,kBAAwCja,EAAYq7D,EAAoBhB,GAEtF,KAAK7oD,EAAA5V,SAASG,QACZ,OAA4BiE,EAAYmM,aACtC,KAAKqF,EAAAvF,YAAYkB,OAGf,OAFApY,KAAKq7D,sBAAwBpwD,EAC7BjL,KAAK66D,yBAA2B,KACzB76D,KAAKusB,QAAQzM,eAIxB,MAEF,KAAKrD,EAAA5V,SAASW,eACZ,OAAOxH,KAAKikE,sBACgBh5D,EAC1Bq7D,EACAhB,GAGJ,KAAK7oD,EAAA5V,SAASU,cACZ,OAAOvH,KAAK0/D,qBACez0D,EACzBq7D,EACAhB,GAGJ,KAAK7oD,EAAA5V,SAASS,KACZ,IAAIi/D,EAAoCt7D,EAAYA,WAChD+mB,EAAShyB,KAAK26D,kBAAkB4L,EAAkBD,EAAoBhB,GAC1E,IAAKtzC,EAAQ,OAAO,KACpB,GAAIA,EAAOjrB,MAAQ00C,EAAAz8B,YAAYgH,mBAAoB,CACjD,IAAIH,EAAW7lB,KAAK8vD,iCACC99B,EACF/mB,EAAY7C,cAC7BlF,EAAA2sD,QAAqByW,EAAmB32C,KAAKjC,yBAC7CziB,EACAq6D,GAEF,IAAKz/C,EAAU,OAAO,KACtB,IACI02B,EADAjzC,EAAauc,EAAS5S,UAAU3J,WAEpC,GADIizC,EAAYjzC,EAAWwyC,eAIzB,OAAOS,EAEP,IAAItpC,EAAY3J,EAAWid,mBAC3B,GAAItT,EAAW,CACb,IAAI0zD,EAAiB1zD,EAAUuqC,qBAO/B,OANKmpB,IACHA,EAAiB,IAAIlrB,EAAA3qB,eAAe9wB,KAAKusB,QAAStZ,GAClDA,EAAUuqC,qBAAuBmpB,GAI5BA,EASX,OANIrB,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAe64D,uGACf4J,EAAiBniE,MAAO4tB,EAAOjP,cAG5B,MAWb,OANIuiD,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfhd,EAAW7G,OAGR,MAITqc,EAAAxe,UAAAokB,gBAAA,SACEpkB,EACAmG,EACAslB,EACA43C,QADA,IAAA53C,MAA4CxqB,EAAA2sD,gBAC5C,IAAAyV,MAAyBF,EAAWG,QAEpC,IAAI/3C,EAAqBvrB,EAAUurB,mBAC/Bo5C,EAAmBp5C,EAAqBhR,EAAA8gC,cAAc9vB,GAAsB,GAC5Em4C,EAAcv9D,EAAgBoU,EAAA8gC,cAAcl1C,GAAiB,GAC7Dy+D,EAAiB5kE,EAAUsrB,UAAUrsB,IAAI0lE,GAC7C,GAAIC,EAAgB,CAClB,IAAIC,EAAWD,EAAe3lE,IAAIykE,GAClC,GAAImB,EAAU,OAAOA,EAGvB,IAAIj7D,EAAc5J,EAAU4J,YACxByyD,EAAar8D,EAAU8F,GAAGtB,EAAApE,YAAY0sB,UACtClG,EAAiB5mB,EAAU4mB,eAG3B2E,GAAoBvrB,EAAUwrB,wBAAwBC,GAG1D,IAEIq5C,EAFAC,EAAgBn7D,EAAYoH,UAC5Bg0D,EAAyBp7D,EAAYiE,eAEzC,GAAI1H,IAAkB2+D,EAA2B3+D,EAAc9C,QAAS,CACtE7B,OAAOwjE,GAA0BF,GAA4BE,EAAuB3hE,QACpF,IAAK,IAAIjF,EAAI,EAAGA,EAAI0mE,IAA4B1mE,EAC9CqtB,EAAwBxlB,IACA++D,EAAwB5mE,GAAGO,KAAKwE,KACtDgD,EAAc/H,SAIlBoD,QAAQwjE,GAA2D,GAAjCA,EAAuB3hE,QAI3D,IAAIs+D,EAA8B,KAC9B30C,EAAwB,KAC5B,GAAIqvC,EAAY,CAOd,KANAsF,EAAgB5jE,KAAK4lB,aACnBniB,OAAOolB,GACP2E,EACAE,EACA43C,IAEkB,OAAO,KAC3Br2C,EAAW20C,EAAct7D,KACzBolB,EAAwBxlB,IAAI,OAAQ+mB,GAItC,IAiBI3lB,EAjBA49D,EAAsBF,EAAc39D,WACpC89D,EAA0BD,EAAoB5hE,OAC9CghB,EAAiB,IAAIngB,MAAYghE,GACjC1pB,EAAiB,IAAIt3C,MAAcghE,GACnCzpB,EAAqB,EACzB,IAASr9C,EAAI,EAAGA,EAAI8mE,IAA2B9mE,EAAG,CAChD,IAAI+mE,EAAuBF,EAAoB7mE,GAC3C+mE,EAAqBj+D,eAAiBsT,EAAA7G,cAAc4pC,UACtD9B,EAAqBr9C,EAAI,GAE3B,IAAIi8D,EAAW74D,OAAO2jE,EAAqB9+D,MACvCknB,EAAgBxvB,KAAKyuD,YAAY6N,EAAU5uC,EAAyB43C,GACxE,IAAK91C,EAAe,OAAO,KAC3BlJ,EAAejmB,GAAKmvB,EACpBiuB,EAAep9C,GAAK+mE,EAAqBxmE,KAAKwE,KAIhD,GAAInD,EAAU8F,GAAGtB,EAAApE,YAAYqmB,KAC3Bpf,EAAakT,EAAAyE,KAAKc,UACb,GAAI9f,EAAU8F,GAAGtB,EAAApE,YAAYsV,aAClCrO,EAAa7F,OAAOmgE,GAAet7D,SAC9B,CACDg0D,EAAW74D,OAAOujE,EAAc19D,YAApC,IACIhB,EAAOtI,KAAKyuD,YAAY6N,EAAU5uC,EAAyB43C,GAC/D,IAAKh9D,EAAM,OAAO,KAClBgB,EAAahB,EAGf,IAAI2K,EAAY,IAAIuJ,EAAA+gC,UAAUj3B,EAAgBhd,EAAY2lB,GAC1Dhc,EAAUwqC,eAAiBA,EAC3BxqC,EAAUyqC,mBAAqBA,EAE/B,IAAI36B,EAAe9gB,EAAU8gB,aACzB4iD,EAAYrgE,SAAQyd,GAAgB,IAAM4iD,EAAc,KAC5D,IAAI9/C,EAAW,IAAI41B,EAAA5tB,SACjB5rB,EACA8gB,EACA9P,EACA2wD,GAEI/6C,EACJ6E,GAKF,OAHKm5C,GAAgB5kE,EAAUsrB,UAAUrlB,IAAI0+D,EAAkBC,EAAiB,IAAI1nD,KACpF0nD,EAAe3+D,IAAIy9D,EAAa9/C,GAChC7lB,KAAKusB,QAAQhN,gBAAgBrX,IAAI6a,EAAc8C,GACxCA,GAITpF,EAAAxe,UAAAolE,yBAAA,SACEplE,EACAmG,EACAk9D,QAAA,IAAAA,MAAyBF,EAAWG,QAEpC9hE,OAAOxB,EAAU8F,GAAGtB,EAAApE,YAAY0sB,WAChC,IAAIlG,EAAiBplB,OAAOxB,EAAU4mB,gBAEtC,IAAMzgB,IAAiBA,EAAc9C,OAAS,OAAOrD,EAErD,IAAI4lB,EAAa5lB,EAAU4lB,WACvBy/C,EAAa9qD,EAAA8gC,cAAcl1C,GAC3Bm/D,EAAmB,IAAI9rB,EAAAlyB,kBACzBvpB,KAAKusB,QACL1E,EACAgB,EAAe9F,aAAe,IAAMukD,EAAa,IAAM7gE,EAAA/D,mBAAqBmlB,EAC5E5lB,EAAU4J,YACVgd,EACA5mB,EAAUqnB,gBAMZ,OAJAi+C,EAAiB1/D,MAAQ5F,EAAU4F,MACnC0/D,EAAiBv9C,aAAe/nB,EAAU+nB,aAC1Cu9C,EAAiB/5C,mBAAqBplB,EACtCm/D,EAAiBh6C,UAAYtrB,EAAUsrB,UAChCg6C,GAIT9mD,EAAAxe,UAAA6tD,iCAAA,SACE7tD,EACA66D,EACApvC,EACA+/B,EACA6X,QAAA,IAAAA,MAAyBF,EAAWG,QAEpC,IAAI7I,EAAuC,KAG3C,GAAIz6D,EAAU8F,GAAGtB,EAAApE,YAAY6jB,UAe3B,GAVyBjkB,EAAUurB,oBACXvrB,EAAUwrB,wBAAwBC,KAE1DgvC,EAAwB18D,KAAK+8D,qBAC3Bt5D,OAAOxB,EAAU4J,YAAYiE,gBAC7BgtD,EACApvC,EACA+/B,EACA6X,IAE0B,OAAO,UAInC,GAA0B,OAAtBxI,GAA8BA,EAAkBx3D,OAOlD,OANIggE,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGzB,KAKX,OAAO/iB,KAAKqmB,gBACVpkB,EACAy6D,EACAhvC,EACA43C,IAKJ7kD,EAAAxe,UAAA2jB,aAAA,SACE3jB,EACAmG,EACAslB,EACA43C,wBADA,IAAA53C,MAA4CxqB,EAAA2sD,gBAC5C,IAAAyV,MAAyBF,EAAWG,QAEpC,IAAII,EAAcv9D,EAAgBoU,EAAA8gC,cAAcl1C,GAAiB,GAG7Dyd,EAAW5jB,EAAUsrB,UAAUrsB,IAAIykE,GACvC,GAAI9/C,EAAU,OAAOA,EAIrB,IAAIha,EAAc5J,EAAU4J,YAC5B,GAAIzD,EAAe,CACjB,IAAI0H,EAAiBjE,EAAYiE,eAC7B03D,EAAwB13D,EAAexK,OACvCmiE,EAAsBr/D,EAAc9C,OACxC7B,OAAOgkE,GAAuBD,GAC9B,IAAK,IAAInnE,EAAI,EAAGA,EAAIonE,IAAuBpnE,EACzCqtB,EAAwBxlB,IAAI4H,EAAezP,GAAGO,KAAKwE,KAAMgD,EAAc/H,SAGzEoD,OAA4C,GAArCoI,EAAYiE,eAAexK,QAIpC,IAAIoiE,EAA0B,KAC9B,GAAI77D,EAAYjD,YAAa,CAC3B,IAAI++D,EAAgB3nE,KAAKyuD,YACvB5iD,EAAYjD,YACZ8kB,EACA43C,GAEF,IAAKqC,EAAe,OAAO,KAC3B,KAAMD,EAAYC,EAAc7rB,gBAO9B,OANIwpB,GAAcF,EAAWG,QAC3BvlE,KAAKusB,QAAQhmB,MACXgW,EAAAzY,eAAeuhB,sCACfxZ,EAAYjD,YAAYxE,OAGrB,KAET,GAAIsjE,EAAUhgD,aAAa+zB,EAAAx8B,eAAe1I,QAOxC,OANI+uD,GAAcF,EAAWG,QAC3BvlE,KAAKusB,QAAQhmB,MACXgW,EAAAzY,eAAe8jE,yCACf/7D,EAAYjD,YAAYxE,MAAOsjE,EAAU3kD,cAGtC,KAET,GAAI2kD,EAAUhgD,aAAa+zB,EAAAx8B,eAAezI,YAAcvU,EAAUylB,aAAa+zB,EAAAx8B,eAAezI,WAO5F,OANI8uD,GAAcF,EAAWG,QAC3BvlE,KAAKusB,QAAQhmB,MACXgW,EAAAzY,eAAe+jE,+DACfprD,EAAA7V,MAAMd,KAAK+F,EAAYjL,KAAKwD,MAAOyH,EAAYjD,YAAYxE,QAGxD,KAKX,IAAIyjB,EAAa5lB,EAAU4lB,WACvB9E,EAAe9gB,EAAU8gB,aACzB4iD,EAAYrgE,SACduiB,GAAc,IAAM89C,EAAc,IAClC5iD,GAAgB,IAAM4iD,EAAc,MAEtC9/C,EAAW,IAAI41B,EAAAnqB,MAAMrvB,EAAW4lB,EAAY9E,EAAc3a,EAAes/D,IAChEh6C,wBAA0BA,EACnCzrB,EAAUsrB,UAAUrlB,IAAIy9D,EAAa9/C,GACrC7lB,KAAKusB,QAAQhN,gBAAgBrX,IAAI6a,EAAc8C,GAG/C,IAAIwL,EAAoB,EACxB,GAAIq2C,EAAW,CACb,GAAIA,EAAU13D,QAAS,CAChB6V,EAAS7V,UAAS6V,EAAS7V,QAAU,IAAImP,SAC9C,IAA4B,IAAAsG,EAAAvB,EAAAwjD,EAAU13D,QAAQtC,UAAQujD,EAAAxrC,EAAArB,QAAA6sC,EAAA5sC,KAAA4sC,EAAAxrC,EAAArB,OAAE,CAAnD,IAAI0jD,EAAe7W,EAAA3vD,MACtBukB,EAAS7V,QAAQ9H,IAAI4/D,EAAgBjgD,WAAYigD,sGAGrDz2C,EAAeq2C,EAAUl2C,oBAI3B,IAAIhI,EAAuBvnB,EAAUunB,qBACrC,GAAIA,EAAsB,CACxB,IAAIu+C,EAAqB/nE,KAAKqnE,yBAC5B79C,EACAphB,EACAk9D,GAEF,IAAKyC,EAAoB,OAAO,KAChCliD,EAAS4L,oBAAsBzxB,KAAKqmB,gBAClC0hD,EACA,KACA7kE,EAAA2sD,UACAyV,GAKJ,GAAIrjE,EAAUknB,oBACZ,IAAmB,IAAAgjC,EAAAjoC,EAAAjiB,EAAUknB,gBAAgBzb,UAAQ0+C,EAAAD,EAAA/nC,QAAAgoC,EAAA/nC,KAAA+nC,EAAAD,EAAA/nC,OAAE,CAAlD,IAAI9J,EAAM8xC,EAAA9qD,MACb,OAAQgZ,EAAOvT,MAGb,KAAK00C,EAAAz8B,YAAYkS,gBACVrL,EAAS7V,UAAS6V,EAAS7V,QAAU,IAAImP,KAC9C,IAAIgmD,EAAoC7qD,EAAQzO,YAC5Co5D,EAAyB,KAE7B,GAAKE,EAAiB78D,KAiBpB28D,EAAYjlE,KAAKyuD,YACf0W,EAAiB78D,KACjBud,EAAS6H,wBACT43C,OApBwB,CAC1B,GAAkB,OAAdoC,GAA4C,OAAtBA,EAAU13D,QAAkB,CACpD,IAAIg4D,EAAYN,EAAU13D,QAAQ9O,IAAqBoZ,EAAQuN,YAC3DmgD,IAAcA,EAAUjgE,GAAGtB,EAAApE,YAAYi+C,WACzC78C,OAAOukE,EAAUjhE,MAAQ00C,EAAAz8B,YAAYoS,OACrC6zC,EAAoB+C,EAAW1/D,MAG9B28D,GACCK,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfyW,EAAiBvkE,KAAKwD,MAAMuqD,OAWpC,IAAKsW,EAAW,MAChB,IAAIgD,EAAgB,IAAIxsB,EAAAtqB,MACN7W,EAChByI,EAAetc,EAAA/D,mBAAsC4X,EAAQuN,WAC7Do9C,EACAE,EACAt/C,GAEF,OAAQo/C,EAAUz+C,UAChB,KAAK,EAAG,MACR,KAAK,EAAwB,EAAf6K,KAAoBA,EAAc,MAChD,KAAK,EAAwB,EAAfA,IAAkBA,EAAoC,GAAL,EAAfA,IAAuB,MACvE,KAAK,EAAwB,EAAfA,IAAkBA,EAAoC,GAAL,EAAfA,IAAuB,MACvE,QAAS5tB,QAAO,GAElBwkE,EAAc52C,aAAeA,EAC7BA,GAAgB4zC,EAAUz+C,SAC1BX,EAAS7V,QAAQ9H,IAAIoS,EAAOuN,WAAYogD,GACxC,MAIF,KAAKxsB,EAAAz8B,YAAYgH,mBACVH,EAAS7V,UAAS6V,EAAS7V,QAAU,IAAImP,KAC9C,IAAIooD,EAAmBvnE,KAAKqnE,yBACP/sD,EACnBlS,EACAk9D,GAEF,IAAKiC,EAAkB,OAAO,KAC9BA,EAAiBxkD,aAAeA,EAAetc,EAAA/D,mBAAqB6kE,EAAiB1/C,WACrFhC,EAAS7V,QAAQ9H,IAAIoS,EAAOuN,WAAY0/C,GACxC,MAIF,KAAK9rB,EAAAz8B,YAAYuL,SACV1E,EAAS7V,UAAS6V,EAAS7V,QAAU,IAAImP,KAC9C,IAAIqL,EAAkB/mB,OAAkB6W,EAAQkQ,iBAC5CC,EAA6BnQ,EAAQmQ,gBACrCy9C,EAAmB,IAAIzsB,EAAA/wB,SACzB1qB,KAAKusB,QACLjS,EAAOuN,WACP9E,EAAetc,EAAA/D,mBAAqB4X,EAAOuN,WAC3C5lB,GAEEkmE,EAAyBnoE,KAAKqnE,yBAChC78C,EACApiB,EACAk9D,GAEF,IAAK6C,EAAwB,OAAO,KAIpC,GAHAA,EACGplD,aAAeA,EAAetc,EAAA/D,mBAAqBylE,EAAuBtgD,WAC7EqgD,EAAiB19C,gBAAkB29C,EAC/B19C,EAAiB,CACnB,IAAI29C,EAAyBpoE,KAAKqnE,yBAChC58C,EACAriB,EACAk9D,GAEF,IAAK8C,EAAwB,OAAO,KACpCA,EACGrlD,aAAeA,EAAetc,EAAA/D,mBAAqB0lE,EAAuBvgD,WAC7EqgD,EAAiBz9C,gBAAkB29C,EAErCviD,EAAS7V,QAAQ9H,IAAIoS,EAAOuN,WAAYqgD,GACxC,MAEF,QAASzkE,QAAO,sGAMtBoiB,EAAS2L,oBAAsBH,MAG/B,IAAsC,IAAAg7B,EAAAnoC,EAAAjiB,EAAU6nB,oBAAkBwiC,EAAAD,EAAAjoC,QAAAkoC,EAAAjoC,KAAAioC,EAAAD,EAAAjoC,OAAE,CAA3D,IAAA4oC,EAAAzoC,EAAA+nC,EAAAhrD,MAAA,GAACyF,EAAAimD,EAAA,GAAMqb,EAAArb,EAAA,GACdvpD,OAAOsD,GAAQ00C,EAAAn/B,aAAayC,SAC5B,IAAIs7C,QAAgB,EACpB,GAAIgO,EAAkBtgE,GAAGtB,EAAApE,YAAY0sB,UAAW,CAC9C,IAAIu5C,GAAkBtoE,KAAKqnE,yBACzBgB,EACAjgE,EACAk9D,GAEF,IAAKgD,GAAiB,SACtBjO,GAAmBr6D,KAAKqmB,gBACtBiiD,GACA,KACAplE,EAAA2sD,UACAyV,QAGFjL,GAAmBr6D,KAAKqmB,gBACtBgiD,EACA,KACAnlE,EAAA2sD,UACAyV,GAGJ,GAAKjL,GAAL,CACA,IAAIxwC,GAAYhE,EAASgE,UACpBA,KAAWhE,EAASgE,UAAYA,GAAY,IAAI1K,KACrD0K,GAAU3hB,IAAInB,EAAMszD,uGAEtB,OAAOx0C,GAITpF,EAAAxe,UAAA4uD,8BAAA,SACE5uD,EACA66D,EACApvC,EACA+/B,EACA6X,QAAA,IAAAA,MAAyBF,EAAWG,QAEpC,IAAI7I,EAAuC,KAG3C,GAAIz6D,EAAU8F,GAAGtB,EAAApE,YAAY6jB,UAQ3B,KAPAw2C,EAAwB18D,KAAK+8D,qBAC3Bt5D,OAAOxB,EAAU4J,YAAYiE,gBAC7BgtD,EACApvC,EACA+/B,EACA6X,IAE0B,OAAO,UAInC,GAA0B,OAAtBxI,GAA8BA,EAAkBx3D,OAOlD,OANIggE,GAAcF,EAAWG,QAC3BvlE,KAAKuG,MACHgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGzB,KAKX,OAAO/iB,KAAK4lB,aACV3jB,EACAy6D,EACAhvC,EACA43C,IAGN7kD,EAhoCA,CAA8BlE,EAAAtW,mBAAjBvG,EAAA+gB,0FCvEb,IAAA/D,EAAAvc,EAAA,GAwDAooE,EAAA,WAWE,SAAAA,IAHAvoE,KAAAoF,QACApF,KAAAwoE,WAAkB,EAmyBpB,OA1yBSD,EAAAE,UAAP,SAAiB9oE,GACf,IAAI+oE,EAAa,IAAIH,EAErB,OADAG,EAAWD,UAAU9oE,GACd+oE,EAAWjf,UASpB8e,EAAAtmE,UAAAwmE,UAAA,SAAU9oE,GACR,MAAM,IAAI+lB,MAAM,oBAGlB6iD,EAAAtmE,UAAA0mE,kBAAA,SAAkBv4B,GAChB,IAAIxvC,EAAO8b,EAAAg8B,gBAAgBtI,IAAS,IAAMpwC,KAAKwoE,WAAW3jE,SAAS,IAC/DqO,EAAOwJ,EAAA+7B,gBAAgBrI,GAC3BpwC,KAAK6F,KAAK,aACV7F,KAAK6F,KAAKjF,GACVZ,KAAK6F,KAAK,KACT,IAAK,IAAIxF,EAAW,EAAGwK,EAAW6R,EAAAk8B,sBAAsBxI,GAAO/vC,EAAIwK,IAAKxK,EACnEA,EAAI,GAAGL,KAAK6F,KAAK,MACrB7F,KAAK6F,KAAK,KACV7F,KAAK6F,KAAKxF,EAAEwE,SAAS,KACrB7E,KAAK6F,KAAK,MACV7F,KAAK6F,KAAK+iE,EAAiBlsD,EAAAo8B,qBAAqB1I,EAAM/vC,KAExDL,KAAK6F,KAAK,OACV7F,KAAK6F,KAAK+iE,EAAiBlsD,EAAAs8B,sBAAsB5I,KACjDpwC,KAAK6F,KAAK,KACN6W,EAAA2Y,gBAAgBniB,IAASwJ,EAAA4Y,aAAa8E,OACxCp6B,KAAK6F,KAAK,OAEZ7F,KAAK6oE,oBAAoB31D,GACrBwJ,EAAA2Y,gBAAgBniB,IAASwJ,EAAA4Y,aAAa8E,OACxCp6B,KAAK6F,KAAK,WAEV7F,KAAKwoE,YAGTD,EAAAtmE,UAAA4mE,oBAAA,SAAoBx+D,GAClB,IAGIy+D,EACAC,EACA1oE,EAAUwK,EALV0lB,EAAK7T,EAAA2Y,gBAAgBhrB,GACrB/B,EAAOoU,EAAAgd,kBAAkBrvB,GAM7B,OAAQkmB,GACN,KAAK7T,EAAA4Y,aAAa8E,MAOhB,IANqC,OAAhC2uC,EAASrsD,EAAA2d,aAAahwB,MACzBrK,KAAK6F,KAAKkjE,GACV/oE,KAAK6F,KAAK,OAEZ7F,KAAK6F,KAAK,OACVgF,EAAI6R,EAAA4d,mBAAmBjwB,GAClBhK,EAAI,EAAGA,EAAIwK,IAAKxK,EACnBL,KAAK6oE,oBAAoBnsD,EAAA8d,cAAcnwB,EAAMhK,IAG/C,YADAL,KAAK6F,KAAK,OAGZ,KAAK6W,EAAA4Y,aAAamF,GAiBhB,YAhBQ,GAAJnyB,GACFtI,KAAK6F,KAAK,QACV7F,KAAK6oE,oBAAoBnsD,EAAAk6B,eAAevsC,IACxCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAAge,UAAUrwB,KAC/By+D,EAASpsD,EAAAie,WAAWtwB,MACtBrK,KAAK6F,KAAK,UACV7F,KAAK6oE,oBAAoBC,MAG3B9oE,KAAK6oE,oBAAoBnsD,EAAAk6B,eAAevsC,IACxCrK,KAAK6F,KAAK,OACV7F,KAAK6oE,oBAAoBnsD,EAAAge,UAAUrwB,IACnCrK,KAAK6F,KAAK,OACV7F,KAAK6oE,oBAAoBnsD,EAAAie,WAAWtwB,MAIxC,KAAKqS,EAAA4Y,aAAa0zC,KACoB,OAA/BD,EAASrsD,EAAAs6B,YAAY3sC,MACxBrK,KAAK6F,KAAKkjE,GACV/oE,KAAK6F,KAAK,OAEZ7F,KAAK6F,KAAK,OACV7F,KAAK6oE,oBAAoBnsD,EAAAw6B,YAAY7sC,IACrCrK,KAAK6F,KAAK,gBAEZ,KAAK6W,EAAA4Y,aAAaimB,MAahB,OAZIutB,EAASpsD,EAAA46B,kBAAkBjtC,MAC7BrK,KAAK6F,KAAK,QACV7F,KAAK6oE,oBAAoBC,GACzB9oE,KAAK6F,KAAK,YAEyB,OAAhCkjE,EAASrsD,EAAA06B,aAAa/sC,KACzBrK,KAAK6F,KAAK,UACV7F,KAAK6F,KAAKkjE,GACV/oE,KAAK6F,KAAK,QAEV7F,KAAK6F,KAAK,aAId,KAAK6W,EAAA4Y,aAAa2zC,OAClB,KAAKvsD,EAAA4Y,aAAayF,KAClB,KAAKre,EAAA4Y,aAAa4zC,aAChB,MAAM,IAAIxjD,MAAM,mBAElB,KAAKhJ,EAAA4Y,aAAaC,SAGhB,OAFAv1B,KAAK6F,KAAK,UACV7F,KAAK6F,KAAK6W,EAAA8Y,iBAAiBnrB,GAAMxF,SAAS,KAG5C,KAAK6X,EAAA4Y,aAAaI,SAKhB,OAJA11B,KAAK6F,KAAK,KACV7F,KAAK6F,KAAK6W,EAAAg5B,iBAAiBrrC,GAAMxF,SAAS,KAC1C7E,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAAkZ,iBAAiBvrB,IAG5C,KAAKqS,EAAA4Y,aAAaO,UAClB,KAAKnZ,EAAA4Y,aAAa6zC,UAChB,MAAM,IAAIzjD,MAAM,mBAElB,KAAKhJ,EAAA4Y,aAAa0E,KAQhB,OAPAh6B,KAAK6F,KAAK,SACV7F,KAAK6F,KAAK+iE,EAAiBtgE,IAC3BtI,KAAK6F,KAAK,MACV7F,KAAK6F,KAAK6W,EAAAq5B,cAAc1rC,GAAMxF,SAAS,KACvC7E,KAAK6F,KAAK,OACV7F,KAAK6oE,oBAAoBnsD,EAAAs5B,WAAW3rC,SACpCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA4Y,aAAa8zC,MAUhB,OATAppE,KAAK6F,KAAK,UACV7F,KAAK6F,KAAK+iE,EAAiBtgE,IAC3BtI,KAAK6F,KAAK,MACV7F,KAAK6F,KAAK6W,EAAAy5B,eAAe9rC,GAAMxF,SAAS,KACxC7E,KAAK6F,KAAK,OACV7F,KAAK6oE,oBAAoBnsD,EAAA25B,YAAYhsC,IACrCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA65B,cAAclsC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA4Y,aAAa+C,MAChB,OAAQ/vB,GACN,OAEE,YADAtI,KAAK6F,KAAK6W,EAAA4b,iBAAiBjuB,GAAMxF,SAAS,KAG5C,OASE,YARA7E,KAAK6F,KACHwjE,cACEpnD,QACEvF,EAAAid,oBAAoBtvB,GACpBqS,EAAA+4B,qBAAqBprC,MAM7B,OAEE,YADArK,KAAK6F,KAAK6W,EAAAkd,iBAAiBvvB,GAAMxF,SAAS,KAG5C,OAEE,YADA7E,KAAK6F,KAAK6W,EAAAmd,iBAAiBxvB,GAAMxF,SAAS,KAI9C,MAEF,KAAK6X,EAAA4Y,aAAa4D,MAChB,OAAQxc,EAAAyc,WAAW9uB,IACjB,KAAKqS,EAAA0c,QAAQG,OAIX,OAHAv5B,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQI,OAIX,OAHAx5B,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQK,UAIX,OAHAz5B,KAAK6F,KAAK,gBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQwrC,OACb,KAAKloD,EAAA0c,QAAQyrC,OAGX,OAFA7kE,KAAK6F,KAAK,UACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQkwC,OAIX,OAHAtpE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQmwC,QAIX,OAHAvpE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQowC,SAIX,OAHAxpE,KAAK6F,KAAK,eACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQqwC,SAIX,OAHAzpE,KAAK6F,KAAK,eACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQswC,WAIX,OAHA1pE,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQuwC,QAIX,OAHA3pE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQC,OACb,KAAK3c,EAAA0c,QAAQE,OAGX,OAFAt5B,KAAK6F,KAAK,UACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQwwC,OAIX,OAHA5pE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQywC,OAIX,OAHA7pE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQ0wC,UAIX,OAHA9pE,KAAK6F,KAAK,gBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQ2wC,OAIX,OAHA/pE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQ4wC,QAIX,OAHAhqE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQ6wC,SAIX,OAHAjqE,KAAK6F,KAAK,eACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQ8wC,SAIX,OAHAlqE,KAAK6F,KAAK,eACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQ+wC,WAIX,OAHAnqE,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQgxC,QAIX,OAHApqE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQy+B,UAGX,OAFA73D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQ0+B,UAGX,OAFA93D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQw+B,QAKb,KAAKl7C,EAAA0c,QAAQy9B,cAGX,OAFA72D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQw9B,cAGX,OAFA52D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQ29B,cAGX,OAFA/2D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQ09B,cAGX,OAFA92D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQ69B,cAGX,OAFAj3D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQ49B,cAGX,OAFAh3D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQ+9B,cAGX,OAFAn3D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQ89B,cAGX,OAFAl3D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQixC,eAIX,OAHArqE,KAAK6F,KAAK,yBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQkxC,eAIX,OAHAtqE,KAAK6F,KAAK,yBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQk+B,gBAGX,OAFAt3D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQs+B,gBAGX,OAFA13D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQm+B,gBAGX,OAFAv3D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQu+B,gBAGX,OAFA33D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQg+B,gBAGX,OAFAp3D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQo+B,gBAGX,OAFAx3D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQi+B,gBAGX,OAFAr3D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQq+B,gBAGX,OAFAz3D,KAAK6F,KAAK,mBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQs9B,WAGX,OAFA12D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQu9B,UAGX,OAFA32D,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,IAGzC,KAAKqS,EAAA0c,QAAQmxC,eAIX,OAHAvqE,KAAK6F,KAAK,yBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA0c,QAAQoxC,eAIX,OAHAxqE,KAAK6F,KAAK,yBACV7F,KAAK6oE,oBAAoBnsD,EAAAo5B,cAAczrC,SACvCrK,KAAK6F,KAAK,KAId,MAEF,KAAK6W,EAAA4Y,aAAaU,OAChB,OAAQtZ,EAAAuZ,YAAY5rB,IAClB,KAAKqS,EAAAwZ,SAASy5B,OACd,KAAKjzC,EAAAwZ,SAASsiC,OACd,KAAK97C,EAAAwZ,SAASuiC,OACd,KAAK/7C,EAAAwZ,SAASwiC,OAIZ,OAHA14D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASyiC,OACd,KAAKj8C,EAAAwZ,SAAS0iC,OACd,KAAKl8C,EAAAwZ,SAAS2iC,OACd,KAAKn8C,EAAAwZ,SAAS4iC,OAIZ,OAHA94D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASiC,OACd,KAAKzb,EAAAwZ,SAAS6iC,OACd,KAAKr8C,EAAAwZ,SAAS8iC,OACd,KAAKt8C,EAAAwZ,SAAS+iC,OAIZ,OAHAj5D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASijC,OACd,KAAKz8C,EAAAwZ,SAASkjC,OACd,KAAK18C,EAAAwZ,SAASojC,OACd,KAAK58C,EAAAwZ,SAASqjC,OAIZ,OAHAv5D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS6C,OAMZ,OALA/4B,KAAK6F,KAAK,eACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAAS8C,OACd,KAAKtc,EAAAwZ,SAASsjC,OAIZ,OAHAx5D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS+C,OAMZ,OALAj5B,KAAK6F,KAAK,eACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAASsC,OACd,KAAK9b,EAAAwZ,SAAS6jC,OAIZ,OAHA/5D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS8jC,MACd,KAAKt9C,EAAAwZ,SAAS+jC,MAIZ,OAHAj6D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASgkC,OACd,KAAKx9C,EAAAwZ,SAASikC,OAIZ,OAHAn6D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASwC,OACd,KAAKhc,EAAAwZ,SAASyjC,OAIZ,OAHA35D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS4C,OACd,KAAKpc,EAAAwZ,SAAS4jC,OAIZ,OAHA95D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS2C,OACd,KAAKnc,EAAAwZ,SAAS2jC,OAIZ,OAHA75D,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASu0C,QAMZ,OALAzqE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAASw0C,QAMZ,OALA1qE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAASC,MACd,KAAKzZ,EAAAwZ,SAASE,MACd,KAAK1Z,EAAAwZ,SAASG,MACd,KAAK3Z,EAAAwZ,SAASI,MAIZ,OAHAt2B,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASK,MACd,KAAK7Z,EAAAwZ,SAASM,MACd,KAAK9Z,EAAAwZ,SAASO,MACd,KAAK/Z,EAAAwZ,SAASQ,MAIZ,OAHA12B,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASS,MACd,KAAKja,EAAAwZ,SAASW,MACd,KAAKna,EAAAwZ,SAASa,MACd,KAAKra,EAAAwZ,SAASc,MAIZ,OAHAh3B,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASU,MAKZ,OAJA52B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASe,MACd,KAAKva,EAAAwZ,SAASiB,MACd,KAAKza,EAAAwZ,SAASmB,MACd,KAAK3a,EAAAwZ,SAASoB,MAIZ,OAHAt3B,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASgB,MAKZ,OAJAl3B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,kBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASqB,MACd,KAAK7a,EAAAwZ,SAASuB,MACd,KAAK/a,EAAAwZ,SAASyB,MACd,KAAKjb,EAAAwZ,SAAS0B,MAIZ,OAHA53B,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,YACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASsB,MAKZ,OAJAx3B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS2B,MACd,KAAKnb,EAAAwZ,SAAS6B,MACd,KAAKrb,EAAAwZ,SAAS+B,MACd,KAAKvb,EAAAwZ,SAASgC,MAIZ,OAHAl4B,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS4B,MAKZ,OAJA93B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,kBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASmjC,OAKZ,OAJAr5D,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASujC,OAKZ,OAJAz5D,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASy0C,QAMZ,OALA3qE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAAS00C,QAMZ,OALA5qE,KAAK6F,KAAK,cACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAASY,MAKZ,OAJA92B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASkB,MAKZ,OAJAp3B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,kBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAASwB,MAKZ,OAJA13B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,iBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS8B,MAKZ,OAJAh4B,KAAK6F,KAAK,SACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,kBACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,IAG1C,KAAKqS,EAAAwZ,SAAS20C,YAMZ,OALA7qE,KAAK6F,KAAK,kBACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAAS40C,OAMZ,OALA9qE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAAS60C,OAMZ,OALA/qE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAAS80C,YAMZ,OALAhrE,KAAK6F,KAAK,kBACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAAS+0C,OAMZ,OALAjrE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAAwZ,SAASg1C,OAMZ,OALAlrE,KAAK6F,KAAK,aACV7F,KAAK6oE,oBAAoBnsD,EAAA0b,cAAc/tB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAA6b,eAAeluB,SACxCrK,KAAK6F,KAAK,KAId,OAEF,KAAK6W,EAAA4Y,aAAasF,OAUhB,OATA56B,KAAK6F,KAAK,WACV7F,KAAK6F,KAAK+iE,EAAiBtgE,IAC3BtI,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAAme,cAAcxwB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAAoe,cAAczwB,IACvCrK,KAAK6F,KAAK,MACV7F,KAAK6oE,oBAAoBnsD,EAAAg7B,mBAAmBrtC,SAC5CrK,KAAK6F,KAAK,KAGZ,KAAK6W,EAAA4Y,aAAa61C,KAGhB,OAFAnrE,KAAK6oE,oBAAoBnsD,EAAAk7B,aAAavtC,SACtCrK,KAAK6F,KAAK,OAGZ,KAAK6W,EAAA4Y,aAAagmB,OAQhB,aAPIwtB,EAASpsD,EAAAo7B,eAAeztC,KAC1BrK,KAAK6F,KAAK,WACV7F,KAAK6oE,oBAAoBC,GACzB9oE,KAAK6F,KAAK,QAEV7F,KAAK6F,KAAK,cAId,KAAK6W,EAAA4Y,aAAa81C,KAChB,OAAQ1uD,EAAAu7B,UAAU5tC,IAChB,KAAKqS,EAAAqoB,OAAOsmC,cAEV,YADArrE,KAAK6F,KAAK,iBAGZ,KAAK6W,EAAAqoB,OAAOumC,WAIV,OAHAtrE,KAAK6F,KAAK,gBACV7F,KAAK6oE,oBAAoBnsD,EAAA27B,eAAehuC,EAAM,SAC9CrK,KAAK6F,KAAK,KAId,MAEF,KAAK6W,EAAA4Y,aAAag9B,IAEhB,YADAtyD,KAAK6F,KAAK,OAGZ,KAAK6W,EAAA4Y,aAAa2F,YAEhB,YADAj7B,KAAK6F,KAAK,iBAGZ,KAAK6W,EAAA4Y,aAAai2C,cAClB,KAAK7uD,EAAA4Y,aAAak2C,UAClB,KAAK9uD,EAAA4Y,aAAam2C,WAClB,KAAK/uD,EAAA4Y,aAAao2C,YAEpB,MAAM,IAAIhmD,MAAM,oBAGV6iD,EAAAtmE,UAAA4D,KAAR,SAAaT,GAEXpF,KAAKoF,KAAKS,KAAKT,IAGjBmjE,EAAAtmE,UAAAwnD,OAAA,WACE,IAAI9W,EAAM3yC,KAAKoF,KAAKU,KAAK,IAEzB,OADA9F,KAAKoF,QACEutC,GAEX41B,EA5yBA,GA8yBA,SAASK,EAAiBtgE,GACxB,OAAQA,GACN,OAAsB,MAAO,OAC7B,OAAqB,MAAO,MAC5B,OAAqB,MAAO,MAC5B,OAAqB,MAAO,MAC5B,OAAqB,MAAO,MAC5B,OAA6B,MAAM,IAAIod,MAAM,oBAC7C,OAAsB,MAAM,IAAIA,MAAM,aACtC,QAAS,MAAM,IAAIA,MAAM,oBAvzBhBhmB,EAAA6oE,4hCCxDb,IAAA9hE,EAAAtG,EAAA,GAIAs7C,EAAAt7C,EAAA,GAuBA+C,EAAA/C,EAAA,GAKAwrE,EAAA,WAYE,SAAAA,EAAYp/C,EAAkBq/C,QAAA,IAAAA,OAAA,GAL9B5rE,KAAA6rE,QAEA7rE,KAAA0rB,KAAqB,IAAIC,IAIvB3rB,KAAKusB,QAAUA,EACfvsB,KAAK4rE,eA4ET,OAxEED,EAAA1pE,UAAA6pE,KAAA,uBACE,IAAyB,IAAAz8C,EAAAnL,EAAAlkB,KAAKusB,QAAQ5M,mBAAmBjS,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAA9D,IAAI2nC,EAAYznC,EAAAhjB,MAEnBtB,KAAK+rE,aAAahgB,EAAa1/C,2GAGjC,IADA,IAAIw/D,EAAO7rE,KAAK6rE,KACH,EAAOA,EAAKvmE,QAAUtF,KAAK+rE,aAAaF,EAAxC,KAIfF,EAAA1pE,UAAA8pE,aAAA,SAAa1/D,GACX,KAAIA,EAAQtE,GAAGtB,EAAApE,YAAYi+C,UAAatgD,KAAK4rE,kBACzC5rE,KAAK0rB,KAAK/F,IAAItZ,GAElB,OADArM,KAAK0rB,KAAKE,IAAIvf,GACNA,EAAQtF,MACd,KAAK00C,EAAAz8B,YAAY5I,OACX/J,EAAQtE,GAAGtB,EAAApE,YAAYqqD,WAAW1sD,KAAKgsE,YAAoB3/D,GAC/D,MAEF,KAAKovC,EAAAz8B,YAAYyN,KACXpgB,EAAQtE,GAAGtB,EAAApE,YAAYqqD,WAAW1sD,KAAKisE,UAAgB5/D,GAC3D,MAEF,KAAKovC,EAAAz8B,YAAYgH,mBACfhmB,KAAKksE,uBAA0C7/D,GAC/C,MAEF,KAAKovC,EAAAz8B,YAAYmG,gBACfnlB,KAAKmsE,oBAAoC9/D,GACzC,MAEF,KAAKovC,EAAAz8B,YAAYoS,MACH/kB,EAAStE,GAAGtB,EAAApE,YAAYqqD,WAAW1sD,KAAKosE,WAAkB//D,GACtE,MAEF,KAAKovC,EAAAz8B,YAAYuL,SACf,IAAI8hD,EAAiBhgE,EACjBxL,EAASwrE,EAAK7hD,gBACd3pB,GAAQb,KAAKksE,uBAAuBrrE,GACxC,IAAI8rD,EAAS0f,EAAK5hD,gBACdkiC,GAAQ3sD,KAAKksE,uBAAuBvf,GACxC,MAEF,KAAKlR,EAAAz8B,YAAYwN,WA+vBvB,SAAS8/C,EAAkBjgE,uBACzB,IAAI2D,EAAU3D,EAAQ2D,QACtB,GAAIA,MACF,IAAmB,IAAAihD,EAAA/sC,EAAAlU,EAAQtC,UAAQy+C,EAAA8E,EAAA7sC,QAAA+nC,EAAA9nC,KAAA8nC,EAAA8E,EAAA7sC,OAAE,CAAhC,IAAI9J,EAAM6xC,EAAA7qD,MACb,OAAQgZ,EAAOvT,MACb,KAAK00C,EAAAz8B,YAAYgH,uBACf,IAAsB,IAAAomC,EAAAloC,EAAoB5J,EAAQiT,UAAU7f,UAAQ2+C,EAAAD,EAAAhoC,QAAAioC,EAAAhoC,KAAAgoC,EAAAD,EAAAhoC,OAAE,CAAjE,IAAImJ,EAAS8+B,EAAA/qD,UAChB,IAAqB,IAAAgrD,EAAApoC,EAAAqJ,EAAU7f,UAAQs/C,EAAAV,EAAAloC,QAAA4oC,EAAA3oC,KAAA2oC,EAAAV,EAAAloC,OAAE,CAApC,IAAIyB,EAAQmnC,EAAA1rD,MACf,GAAIukB,EAAS9d,GAAGtB,EAAApE,YAAYqqD,UAAW,OAAO,uMAGlD,MAEF,KAAKjR,EAAAz8B,YAAYmG,oBACf,IAAqB,IAAA8nC,EAAA/oC,EAAiB5J,EAAQiT,UAAU7f,UAAQw/C,EAAAD,EAAA7oC,QAAA8oC,EAAA7oC,KAAA6oC,EAAAD,EAAA7oC,OAAE,CAA7D,IAAIyB,EAAQqnC,EAAA5rD,MACf,GAAIukB,EAAS9d,GAAGtB,EAAApE,YAAYqqD,UAAW,OAAO,oGAEhD,MAEF,QACE,GAAIpyC,EAAOvS,GAAGtB,EAAApE,YAAYqqD,WAAa4f,EAAkBhyD,GAAS,OAAO,qGAMjF,OAAO,GAxxBGgyD,CAAkBjgE,IAAUrM,KAAKusE,eAAelgE,GACpD,MAEF,QAAS5I,QAAO,KAIZkoE,EAAA1pE,UAAAiqE,uBAAR,SAA+B7/D,mBAC7B,IAAsB,IAAAiY,EAAAJ,EAAA7X,EAAQkhB,UAAU7f,UAAQ+X,EAAAnB,EAAAF,QAAAqB,EAAApB,KAAAoB,EAAAnB,EAAAF,OAAE,CAA7C,IAAImJ,EAAS9H,EAAAnkB,UAChB,IAAqB,IAAA2vD,EAAA/sC,EAAAqJ,EAAU7f,UAAQy+C,EAAA8E,EAAA7sC,QAAA+nC,EAAA9nC,KAAA8nC,EAAA8E,EAAA7sC,OAAE,CAApC,IAAIyB,EAAQsmC,EAAA7qD,MACXukB,EAAS9d,GAAGtB,EAAApE,YAAYqqD,WAAW1sD,KAAKwsE,cAAwB3mD,0MAKlE8lD,EAAA1pE,UAAAkqE,oBAAR,SAA4B9/D,eAC1B,IAAqB,IAAAgjB,EAAAnL,EAAA7X,EAAQkhB,UAAU7f,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAE,CAA5C,IAAIyB,EAAQvB,EAAAhjB,MACXukB,EAAS9d,GAAGtB,EAAApE,YAAYqqD,WAAW1sD,KAAKysE,WAAkB5mD,uGAWpE8lD,EA1FA,GA6FAe,EAAA,SAAAp3D,GAAA,SAAAo3D,IAAA,IAAAl3D,EAAA,OAAAF,KAAAG,MAAAzV,KAAA8J,YAAA9J,YACUwV,EAAAm3D,aACNvrD,IAAO,UACP+5B,OAAU,SACVv5B,KAAQ,WAGFpM,EAAAo3D,kBAAoB,MAAO,QAE3Bp3D,EAAA7P,MACA6P,EAAAq3D,yBAA2B,IAAIlhD,IAC/BnW,EAAAs3D,yBAA2B,IAAInhD,MAiVzC,OA5VyCpW,EAAAm3D,EAAAp3D,GAahCo3D,EAAAK,MAAP,SAAaxgD,GACX,OAAO,IAAImgD,EAAoBngD,GAASwgD,SAG1CL,EAAAzqE,UAAA+pE,YAAA,SAAY3/D,KAIZqgE,EAAAzqE,UAAAgqE,UAAA,SAAU5/D,KAIVqgE,EAAAzqE,UAAAwqE,WAAA,SAAWpgE,KAIXqgE,EAAAzqE,UAAAuqE,cAAA,SAAcngE,GACZrM,KAAKgtE,mBAAmB3gE,GACxBrM,KAAKitE,wBAAwB5gE,IAGvBqgE,EAAAzqE,UAAA+qE,mBAAR,SAA2B3gE,GAA3B,IAAAmJ,EAAAxV,KACMiT,EAAY5G,EAAQ4G,UACpBi6D,EAASj6D,EAAUwqC,eAAiBxqC,EAAUwqC,eAAexpB,IAAI,SAACk5C,EAAW9sE,GAC/E,OAASwnB,WAAYslD,EAAW7kE,KAAM2K,EAAUqT,eAAejmB,SAEjE6sE,EAAOE,QAAQ,SAAA56C,GAAS,OAAAhd,EAAK63D,uBAAuB76C,EAAMlqB,QAC1DtI,KAAK2F,GAAGE,KAAK,kCAAkCwG,EAAQwb,WAAU,+GAEpBxb,EAAQwb,WAAU,qDAG3D5U,EAAUwqC,gBACZyvB,EAAOE,QAAQ,SAAC56C,GACdhd,EAAK7P,GAAGE,KAAK,gBAAgB2sB,EAAM3K,WAAU,KAAK2K,EAAMlqB,KAAI,OAE9DtI,KAAKstE,uBAAuB,qBAAsBJ,IAElDltE,KAAKstE,uBAAuB,yBAE9BttE,KAAK2F,GAAGE,KAAK,MAGP6mE,EAAAzqE,UAAAgrE,wBAAR,SAAgC5gE,GAC9B,IAAI4G,EAAY5G,EAAQ4G,UACpB3J,EAAa2J,EAAU3J,WAC3BtJ,KAAKutE,uBAAuBjkE,GAC5BtJ,KAAK2F,GAAGE,KAAK,6BAA6BwG,EAAQwb,WAAU,uJAGpBxb,EAAQwb,WAAU,gGAEFxb,EAAQwb,WAAU,yDAE7C,QAAzBve,EAAWzE,WACb7E,KAAK2F,GAAGE,KAAK,gBAAgBwG,EAAQwb,WAAU,KAE/C7nB,KAAK2F,GAAGE,KAAQwG,EAAQwb,WAAU,KAEhC5U,EAAUwqC,gBACZz9C,KAAK2F,GAAGE,KAAKoN,EAAUwqC,eAAexpB,IAAI,SAAAk5C,GAAa,8BAAwBA,IAAarnE,KAAK,MAEnG9F,KAAK2F,GAAGE,KAAK,MACgB,QAAzByD,EAAWzE,aACb7E,KAAK2F,GAAGE,KAAK,yFAIb7F,KAAKwtE,qBAAqBlkE,EAAY,WAAY,UAClDtJ,KAAK2F,GAAGE,KAAK,wHAKf7F,KAAK2F,GAAGE,KAAK,MAGP6mE,EAAAzqE,UAAAqrE,uBAAR,SAA+BG,EAAqBP,GAApD,IAAA13D,EAAAxV,gBACWilE,GACP,IAAIyI,EAAaC,EAAKhB,YAAY1H,GAC9B2I,EAAiBV,EAAOW,OAAO,SAAAr7C,GAAS,OAAAA,EAAMlqB,KAAKzD,YAAcogE,IACjE2I,EAAetoE,OAAS,IAC1BqoE,EAAKhoE,GAAGE,KAAK,MAAM6nE,EAAU,yBAAyBzI,EAAS,aAC/D2I,EAAeR,QAAQ,SAAA56C,GACrBhd,EAAK7P,GAAGE,KAAK,gBAAgB2sB,EAAM3K,WAAU,qBACzC4lD,EAAcj7C,EAAM3K,WAAU,iDAIpC8lD,EAAKhoE,GAAGE,KAAK,wBACA6nE,EAAU,sCAZ3B,IAAK,IAAIzI,KAAajlE,KAAK2sE,cAAlB1H,GAgBTjlE,KAAK2F,GAAGE,KAAK,iCACbqnE,EAAOE,QAAQ,SAAC56C,GACdhd,EAAK7P,GAAGE,KAAK,gBAAgB2sB,EAAM3K,WAAU,iBACzC4lD,EAAcj7C,EAAM3K,WAAU,OAAO2K,EAAMlqB,KAAKzD,WAAU,sCAIhE7E,KAAK2F,GAAGE,KAAK,uCAIb,IAAIioE,EAAiBZ,EAAOW,OAAO,SAAAr7C,GAAS,QAAEA,EAAMlqB,KAAKzD,aAAc2Q,EAAKm3D,eAC5E3sE,KAAK2F,GAAGE,KAAK,4CAEb7F,KAAK2F,GAAGE,KAAK,+JAOb7F,KAAK+tE,oBAAoBN,EAAaK,EAAeD,OAAO,SAAAr7C,GAAS,OAAChd,EAAKw4D,YAAYx7C,EAAMlqB,SAC7FtI,KAAK2F,GAAGE,KAAK,qDAGb7F,KAAK2F,GAAGE,KAAK,2CAEb7F,KAAK+tE,oBAAoBN,EAAaK,EAAeD,OAAO,SAAAr7C,GAAS,OAAAhd,EAAKw4D,YAAYx7C,EAAMlqB,SAC5FtI,KAAK2F,GAAGE,KAAK,qDAKP6mE,EAAAzqE,UAAA8rE,oBAAR,SAA4BN,EAAqBP,GAAjD,IAAA13D,EAAAxV,KACEktE,EAAOE,QAAQ,SAAC56C,GACRA,EAAMlqB,KAAKzD,aAAc2Q,EAAKm3D,aAClCn3D,EAAK7P,GAAGE,KAAK,gBAAgB2sB,EAAM3K,WAAU,mBACzC4lD,EAAcj7C,EAAM3K,WAAU,oBAAoBrS,EAAKy4D,WAAWz7C,EAAMlqB,MAAK,6EAO/EokE,EAAAzqE,UAAAisE,4BAAR,SAAoCT,EAAqBxI,GACvD,IAAIyI,EAAa1tE,KAAK2sE,YAAY1H,EAAUpgE,YACxC6oE,EACF1tE,KAAK2F,GAAGE,KAAK,MAAM6nE,EAAU,yBAAyBzI,EAAS,sBAC3DwI,EAAW,wEAGXA,EAAW,UAAUxI,EAAS,gLAQlCjlE,KAAK2F,GAAGE,KAAK,6CACT4nE,EAAW,uBAAuBztE,KAAKiuE,WAAWhJ,GAAU,+PAS5DwI,EAAW,uBAAuBztE,KAAKiuE,WAAWhJ,GAAU,wEAM5DyH,EAAAzqE,UAAAsrE,uBAAR,SAA+BjlE,GAA/B,IAAAkN,EAAAxV,KACE,GAAKsI,EAAKwzC,eAAV,CAIA,IAAIxP,EAAWtsC,KAAKiuE,WAAW3lE,GAC3BtI,KAAK6sE,yBAAyBlnD,IAAI2mB,IAAaA,KAAYtsC,KAAK2sE,cAGpE3sE,KAAK6sE,yBAAyBjhD,IAAI0gB,GAE9BtsC,KAAKguE,YAAY1lE,IAEnBtI,KAAKutE,uBAAuBjlE,EAAKwzC,eAAe1zC,cAAe,IAE/DpI,KAAK2F,GAAGE,KAAK,iCAAiCymC,EAAQ,uBACzChkC,EAAKzD,WAAU,8CAE5B7E,KAAK2F,GAAGE,KAAK,4CACb7F,KAAKwtE,qBAAqBllE,EAAKwzC,eAAe1zC,cAAe,GAAI,OAAQ,YACzEpI,KAAK2F,GAAGE,KAAK,OAIb7F,KAAKmuE,UAAU7lE,EAAKwzC,gBAAgBsxB,QAAQ,SAAA56C,GAC1Chd,EAAK+3D,uBAAuB/6C,EAAMlqB,QAGpCtI,KAAK2F,GAAGE,KAAK,iCAAiCymC,EAAQ,uBACzChkC,EAAKzD,WAAU,8CAE5B7E,KAAKmuE,UAAU7lE,EAAKwzC,gBAAgBsxB,QAAQ,SAAC56C,GAC3C,IAAIyyC,EAAYzyC,EAAMlqB,KAClBiqB,EAAYC,EAAM3K,WAClBumD,EAAa,SAAS77C,EAC1B/c,EAAKg4D,qBAAqBvI,EAAW,IAAI1yC,EAAS,IAAK67C,MAI3DpuE,KAAK2F,GAAGE,KAAK,QAGP6mE,EAAAzqE,UAAAosE,gBAAR,SAAwB/lE,GACtB,IAAIgkC,EAAWtsC,KAAKiuE,WAAW3lE,GAC/BtI,KAAK2F,GAAGE,KAAK,mCAAmCymC,EAAQ,4GAEZA,EAAQ,yDAEzChkC,EAAI,UAAUA,EAAI,OACzBtI,KAAKguE,YAAY1lE,GACnBtI,KAAKkuE,4BAA4B,aAAc5lE,EAAKwzC,eAAgB1zC,cAAe,IAEnFpI,KAAKstE,uBAAuB,cAAettE,KAAKmuE,UAAU7lE,EAAKwzC,iBAEjE97C,KAAK2F,GAAGE,KAAK,QAGP6mE,EAAAzqE,UAAAorE,uBAAR,SAA+B/kE,GAA/B,IAAAkN,EAAAxV,KACE,GAAKsI,EAAKwzC,eAAV,CAIA,IAAIxP,EAAWtsC,KAAKiuE,WAAW3lE,GAC3BtI,KAAK8sE,yBAAyBnnD,IAAI2mB,IAAaA,KAAYtsC,KAAK2sE,cAGpE3sE,KAAK8sE,yBAAyBlhD,IAAI0gB,GAElCtsC,KAAKquE,gBAAgB/lE,GACjBtI,KAAKguE,YAAY1lE,GAEnBtI,KAAKqtE,uBAAuB/kE,EAAKwzC,eAAe1zC,cAAe,IAG/DpI,KAAKmuE,UAAU7lE,EAAKwzC,gBAAgBsxB,QAAQ,SAAA56C,GAC1Chd,EAAK63D,uBAAuB76C,EAAMlqB,QAItCtI,KAAK2F,GAAGE,KAAK,iCAAiCymC,EAAQ,wDACNhkC,EAAI,kDACXgkC,EAAQ,mGAEQA,EAAQ,2GAM3DogC,EAAAzqE,UAAAurE,qBAAR,SAA6BvI,EAAiBqJ,EAAmBF,GAC/D,IAAIV,EAAa1tE,KAAK2sE,YAAY1H,EAAUpgE,YAC5C,GAAK6oE,GAYyD,GAAxD1tE,KAAK4sE,iBAAiB2B,QAAQtJ,EAAUpgE,YAC1C7E,KAAK2F,GAAGE,KAAK,cAAc6nE,EAAU,IAAIY,EAAS,KAAKF,EAAU,MAEjEpuE,KAAK2F,GAAGE,KAAK,OAAOuoE,EAAU,uCACbV,EAAU,IAAIY,EAAS,KAAKF,EAAU,uDAEjCE,EAAS,uBAlBlB,CAEf,IAAIE,EAAWxuE,KAAKguE,YAAY/I,GAAa,QAAU,SACvDjlE,KAAK2F,GAAGE,KAAK,OAAOuoE,EAAU,sCACZI,EAAQ,IAAIF,EAAS,+BACnBtuE,KAAKiuE,WAAWhJ,GAAU,IAAImJ,EAAU,qCAC3CI,EAAQ,oDAEHF,EAAS,mBAgB3B5B,EAAAzqE,UAAAgsE,WAAR,SAAmB3lE,GACjB,OAAaA,EAAKzD,WACfL,QAAQ,KAAM,MACdA,QAAQ,KAAM,IACdA,QAAQ,KAAM,MAGXkoE,EAAAzqE,UAAA+rE,YAAR,SAAoB1lE,GAClB,SAAUA,EAAKwzC,gBAA8D,SAA5CxzC,EAAKwzC,eAAe75C,UAAU4lB,aAAyBvf,EAAKwzC,eAAe1zC,gBAGtGskE,EAAAzqE,UAAAksE,UAAR,SAAkB9hE,GAChB,OAAKA,EAAQ2D,QAIGy+D,EAAIpiE,EAAQ2D,QAAQtC,UAAUmgE,OAAO,SAAAvzD,GAAU,OAAAA,aAAkBmhC,EAAAtqB,YAGnFu7C,EAAAzqE,UAAAysE,eAAA,SAAeriE,KAIfqgE,EAAAzqE,UAAAmqE,WAAA,SAAW//D,GACT,MAAM,IAAIqZ,MAAM,wBAGlBgnD,EAAAzqE,UAAAsqE,eAAA,SAAelgE,KAIfqgE,EAAAzqE,UAAA8qE,MAAA,WACE/sE,KAAK2F,GAAGE,KAAK,4fAab,IAAI8oE,EAAa3uE,KAAKusB,QAAQ7L,QAC3BmtD,OAAO,SAAAzrE,GAAK,OAAoC,GAApCA,EAAE2C,eAAewpE,QAAQ,UAAc,GAGtD,OAFAvuE,KAAK2F,GAAGE,KAAK8oE,EAAWvpE,MACxBpF,KAAK8rE,OACE9rE,KAAK2F,GAAGG,KAAK,OAExB4mE,EA5VA,CAAyCf,GAA5BjsE,EAAAgtE,sBA+Vb,IAAAkC,EAAA,SAAAt5D,GAWE,SAAAs5D,EAAYriD,EAAkBq/C,QAAA,IAAAA,OAAA,GAA9B,IAAAp2D,EACEF,EAAA9U,KAAAR,KAAMusB,EAASq/C,IAAe5rE,YALxBwV,EAAA7P,MACA6P,EAAAq5D,YAAmB,IAkK7B,OA1KgCt5D,EAAAq5D,EAAAt5D,GAGvBs5D,EAAA7B,MAAP,SAAaxgD,GACX,OAAO,IAAIqiD,EAAWriD,GAASwgD,SAWjC6B,EAAA3sE,UAAA+pE,YAAA,SAAY3/D,GACV,IAAI1G,EAAK3F,KAAK2F,GACVm9D,EAAUz2D,EAAQtE,GAAGtB,EAAApE,YAAY2qB,SAMrC,GALA9pB,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aACZ/L,GAASn9D,EAAGE,KAAK,UACrBF,EAAGE,KAAK7F,KAAK+uE,aAAa1iE,EAAQ/D,OAClC3C,EAAGE,KAAK,KACRF,EAAGE,KAAKwG,EAAQwb,YACZi7C,EACF,OAAQz2D,EAAQygB,mBACd,OACEnnB,EAAGE,KAAK,OACRF,EAAGE,KAAKwjE,cAAch9D,EAAQ0gB,uBAC9B,MAEF,OACEpnB,EAAGE,KAAK,OACRF,EAAGE,KAAKwG,EAAQ4gB,mBAAmBpoB,YACnC,MAEF,QAASpB,QAAO,GAGpBkC,EAAGE,KAAK,QAGV+oE,EAAA3sE,UAAAgqE,UAAA,SAAU5/D,eACJ1G,EAAK3F,KAAK2F,GACdzC,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,eAChBlpE,EAAGE,KAAK,cACRF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,QACR,IAAImK,EAAU3D,EAAQ2D,QACtB,GAAIA,EAAS,KACX,IAA2B,IAAAg/D,EAAA9qD,EAAAlU,GAAOi/D,EAAAD,EAAA5qD,QAAA6qD,EAAA5qD,KAAA4qD,EAAAD,EAAA5qD,OAAE,CAA3B,IAAAE,EAAAC,EAAA0qD,EAAA3tE,MAAA,GAACV,EAAA0jB,EAAA,GACR,IADchK,EAAAgK,EAAA,IACHvd,MAAQ00C,EAAAz8B,YAAY0N,UAAW,CACxC,IAAIo2C,EAAsBxoD,EAAQvS,GAAGtB,EAAApE,YAAY2qB,SACjD9pB,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aACZ/L,EAASn9D,EAAGE,KAAK,UAChBF,EAAGE,KAAK,aACbF,EAAGE,KAAK,kBACRF,EAAGE,KAAKjF,GACJkiE,IACFn9D,EAAGE,KAAK,OACRF,EAAGE,KAAiByU,EAAQqS,cAAc9nB,SAAS,MAErDc,EAAGE,KAAK,8GAGZ,IAAmB,IAAA4f,EAAAvB,EAAAlU,EAAQtC,UAAQujD,EAAAxrC,EAAArB,QAAA6sC,EAAA5sC,KAAA4sC,EAAAxrC,EAAArB,OAAE,CAAhC,IAAI9J,KAAM22C,EAAA3vD,OACFyF,MAAQ00C,EAAAz8B,YAAY0N,WAAW1sB,KAAK+rE,aAAazxD,sGAGhEpX,EAAA4rE,OAAOnpE,IAAM3F,KAAK6uE,aAClBlpE,EAAGE,KAAK,QAGV+oE,EAAA3sE,UAAAuqE,cAAA,SAAcngE,WACR1G,EAAK3F,KAAK2F,GACVsN,EAAY5G,EAAQ4G,UACxB/P,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aAChBlpE,EAAGE,KAAK7F,KAAK+uE,aAAa97D,EAAU3J,aACpC3D,EAAGE,KAAK,KACRF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,KAIR,IAHA,IAAIwD,EAAa4J,EAAUqT,eACvB23B,EAAgB50C,EAAW/D,OAEtBjF,EAAI,EAAGA,EAAI49C,IAAiB59C,EAC/BA,GAAGsF,EAAGE,KAAK,MAEfF,EAAGE,KAAK7F,KAAK+uE,aAAa1lE,EAAWhJ,KACrCsF,EAAGE,KAAK,KACRF,EAAGE,KAAKoN,EAAUyc,iBAAiBrvB,IAErCsF,EAAGE,KAAK,QACR,IAAImK,EAAU3D,EAAQ2D,QACtB,GAAIA,GAAWA,EAAQ4oB,KAAM,CAC3B11B,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aAChBlpE,EAAGE,KAAK,cACRF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,YACR,IAAmB,IAAAwpB,EAAAnL,EAAAlU,EAAQtC,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAA,CAA9B,IAAI9J,EAAMgK,EAAAhjB,MAAsBtB,KAAK+rE,aAAazxD,qGACvDpX,EAAA4rE,OAAOnpE,IAAM3F,KAAK6uE,aAClBlpE,EAAGE,KAAK,SAIZ+oE,EAAA3sE,UAAAwqE,WAAA,SAAWpgE,GACT,IAAI1G,EAAK3F,KAAK2F,GACdzC,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,eAChBlpE,EAAGE,KAAK,cACRF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,QAER3C,EAAA4rE,OAAOnpE,IAAM3F,KAAK6uE,aAClBlpE,EAAGE,KAAK,QAGV+oE,EAAA3sE,UAAAysE,eAAA,SAAeriE,GACbrM,KAAKysE,WAAWpgE,IAGlBuiE,EAAA3sE,UAAAmqE,WAAA,SAAW//D,KAIXuiE,EAAA3sE,UAAAsqE,eAAA,SAAelgE,WACT1G,EAAK3F,KAAK2F,GACdzC,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,eAChBlpE,EAAGE,KAAK,cACRF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,QACR,IAAImK,EAAU3D,EAAQ2D,QACtB,GAAIA,MACF,IAAmB,IAAAqf,EAAAnL,EAAAlU,EAAQtC,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAA,CAA9B,IAAI9J,EAAMgK,EAAAhjB,MAAsBtB,KAAK+rE,aAAazxD,qGAEzDpX,EAAA4rE,OAAOnpE,IAAM3F,KAAK6uE,aAClBlpE,EAAGE,KAAK,QAGV+oE,EAAA3sE,UAAA8sE,aAAA,SAAazmE,GACX,OAAQA,EAAKvB,MACX,OAAkB,MAAO,OACzB,OAAmB,MAAO,QAC1B,OAAmB,MAAO,OAC1B,OAAmB,MAAO,YAC1B,OAAqB,OAAO/G,KAAKusB,QAAQvL,QAAQkB,SAAW,YAAc,OAC1E,OAAkB,MAAO,QACzB,OAAmB,MAAO,iBAC1B,OAAmB,MAAO,gBAE1B,OAAmB,MAAO,qBAC1B,OAAqB,OAAOliB,KAAKusB,QAAQvL,QAAQkB,SAAW,qBAAuB,gBAEnF,QAAoB,MAAO,UAC3B,QAAmB,MAAO,qBAC1B,QAAmB,MAAO,sBAC1B,QAAoB,MAAO,OAC3B,QAEE,OADAze,QAAO,GACA,KAKbmrE,EAAA3sE,UAAA8qE,MAAA,WACE,IAAIpnE,EAAK3F,KAAK2F,GAMd,OALAA,EAAGE,KAAK,4BACN7F,KAAK6uE,YACP7uE,KAAK8rE,SACH9rE,KAAK6uE,YACPlpE,EAAGE,KAAK,OACDF,EAAGG,KAAK,KAEnB8oE,EA1KA,CAAgCjD,GAAnBjsE,EAAAkvE,aA6Kb,IAAAM,EAAA,SAAA55D,GAWE,SAAA45D,EAAY3iD,EAAkBq/C,QAAA,IAAAA,OAAA,GAA9B,IAAAp2D,EACEF,EAAA9U,KAAAR,KAAMusB,EAASq/C,IAAe5rE,YALxBwV,EAAA7P,MACA6P,EAAAq5D,YAAmB,IAsM7B,OA9MgCt5D,EAAA25D,EAAA55D,GAGvB45D,EAAAnC,MAAP,SAAaxgD,GACX,OAAO,IAAI2iD,EAAW3iD,GAASwgD,SAWjCmC,EAAAjtE,UAAA+pE,YAAA,SAAY3/D,GACV,IAAI1G,EAAK3F,KAAK2F,GACVm9D,EAAUz2D,EAAQtE,GAAGtB,EAAApE,YAAY2qB,SACrC9pB,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aACZxiE,EAAQtE,GAAGtB,EAAApE,YAAY+X,QACrB0oD,EAASn9D,EAAGE,KAAK,oBAChBF,EAAGE,KAAK,WAETi9D,EAASn9D,EAAGE,KAAK,UAChBF,EAAGE,KAAK,QAEfF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,MACRF,EAAGE,KAAK7F,KAAK+uE,aAAa1iE,EAAQ/D,OAClC3C,EAAGE,KAAK,OACR7F,KAAKusE,eAAelgE,IAGtB6iE,EAAAjtE,UAAAgqE,UAAA,SAAU5/D,WACJ1G,EAAK3F,KAAK2F,GACdzC,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,eAChBlpE,EAAGE,KAAK,SACRF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,QACR,IAAImK,EAAU3D,EAAQ2D,QACtB,GAAIA,EAAS,CACX,IAAIm/D,EAAan/D,EAAQ4oB,SACzB,IAA2B,IAAAw2C,EAAAlrD,EAAAlU,GAAOq/D,EAAAD,EAAAhrD,QAAAirD,EAAAhrD,KAAAgrD,EAAAD,EAAAhrD,OAAE,CAA3B,IAAAiL,EAAA9K,EAAA8qD,EAAA/tE,MAAA,GAACV,EAAAyuB,EAAA,GAAM/U,EAAA+U,EAAA,GACV/U,EAAOvT,MAAQ00C,EAAAz8B,YAAY0N,YAC7BxpB,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aAChBlpE,EAAGE,KAAKjF,GACJ0Z,EAAOvS,GAAGtB,EAAApE,YAAY2qB,WACxBrnB,EAAGE,KAAK,OACRF,EAAGE,KAAiByU,EAAQqS,cAAc9nB,SAAS,MAErDc,EAAGE,KAAK,SACNspE,qGAGFA,GAAYnvE,KAAKusE,eAAelgE,GAEtCnJ,EAAA4rE,OAAOnpE,IAAM3F,KAAK6uE,aAClBlpE,EAAGE,KAAK,QAGVqpE,EAAAjtE,UAAAuqE,cAAA,SAAcngE,GACZ,IAAIA,EAAQpE,MAAMxB,EAAApE,YAAYi+C,QAAU75C,EAAApE,YAAYqmB,KAApD,CACA,IAAI/iB,EAAK3F,KAAK2F,GACVsN,EAAY5G,EAAQ4G,UAIxB,GAHA/P,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aACZxiE,EAAQtE,GAAGtB,EAAApE,YAAYk+C,YAAY56C,EAAGE,KAAK,cAC3CwG,EAAQtE,GAAGtB,EAAApE,YAAY+X,SAASzU,EAAGE,KAAK,WACxCwG,EAAQtE,GAAGtB,EAAApE,YAAYomB,KAKzB,OAJA9iB,EAAGE,KAAKwG,EAAQpK,UAAU4J,YAAYjL,KAAKwE,MAC3CO,EAAGE,KAAK,MACRF,EAAGE,KAAK7F,KAAK+uE,aAAa97D,EAAU3J,kBACpC3D,EAAGE,KAAK,OAGHwG,EAAQpE,MAAMxB,EAAApE,YAAY+X,OAAS3T,EAAApE,YAAY0sB,WAAWppB,EAAGE,KAAK,aACvEF,EAAGE,KAAKwG,EAAQwb,YAElBliB,EAAGE,KAAK,KAIR,IAHA,IAAIwD,EAAa4J,EAAUqT,eACvB23B,EAAgB50C,EAAW/D,OAEtBjF,EAAI,EAAGA,EAAI49C,IAAiB59C,EAC/BA,GAAGsF,EAAGE,KAAK,MAEfF,EAAGE,KAAKoN,EAAUyc,iBAAiBrvB,IACnCsF,EAAGE,KAAK,MACRF,EAAGE,KAAK7F,KAAK+uE,aAAa1lE,EAAWhJ,KAEnCgM,EAAQpE,MAAMxB,EAAApE,YAAYsV,YAAclR,EAAApE,YAAYqmB,KACtD/iB,EAAGE,KAAK,MAERF,EAAGE,KAAK,OACRF,EAAGE,KAAK7F,KAAK+uE,aAAa97D,EAAU3J,cAEtC3D,EAAGE,KAAK,OACR7F,KAAKusE,eAAelgE,KAGtB6iE,EAAAjtE,UAAAwqE,WAAA,SAAWpgE,eACL1G,EAAK3F,KAAK2F,GACVmjB,EAAczc,EAAQtF,MAAQ00C,EAAAz8B,YAAY0T,UAC9CxvB,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,eACZ/lD,EACFnjB,EAAGE,KAAK,eAEJwG,EAAQtE,GAAGtB,EAAApE,YAAY6mB,WAAWvjB,EAAGE,KAAK,aAC9CF,EAAGE,KAAK,WAEVF,EAAGE,KAAKwG,EAAQwb,YAChB,IAAI0J,EAAOllB,EAAQklB,KACfA,GAAQA,EAAKxpB,GAAGtB,EAAApE,YAAYqqD,SAAWjmD,EAAApE,YAAY6lB,iBACrDviB,EAAGE,KAAK,aACRF,EAAGE,KAAK0rB,EAAK1J,aAEfliB,EAAGE,KAAK,QACR,IAAImK,EAAU3D,EAAQpK,UAAU+N,QAChC,GAAIA,MACF,IAAmB,IAAAsU,EAAAJ,EAAAlU,EAAQtC,UAAQ+X,EAAAnB,EAAAF,QAAAqB,EAAApB,KAAAoB,EAAAnB,EAAAF,OAAE,CAAhC,IAAI9J,EAAMmL,EAAAnkB,MACbtB,KAAK+rE,aAAazxD,qGAGtB,IAAIizC,EAAOlhD,EAAQolB,oBAGnB,GAFI87B,GAAMvtD,KAAKwsE,cAAcjf,GAC7Bv9C,EAAU3D,EAAQ2D,YAEhB,IAAmB,IAAAihD,EAAA/sC,EAAAlU,EAAQtC,UAAQy+C,EAAA8E,EAAA7sC,QAAA+nC,EAAA9nC,KAAA8nC,EAAA8E,EAAA7sC,OAAA,CAA1B9J,EAAM6xC,EAAA7qD,MAAsBtB,KAAK+rE,aAAazxD,qGAEzDpX,EAAA4rE,OAAOnpE,IAAM3F,KAAK6uE,aAClBlpE,EAAGE,KAAK,QAGVqpE,EAAAjtE,UAAAysE,eAAA,SAAeriE,GACbrM,KAAKysE,WAAWpgE,IAGlB6iE,EAAAjtE,UAAAmqE,WAAA,SAAW//D,GACT,IAAIA,EAAQtE,GAAGtB,EAAApE,YAAYi+C,SAA3B,CACA,IAAI36C,EAAK3F,KAAK2F,GACdzC,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,aACZxiE,EAAQtE,GAAGtB,EAAApE,YAAYk+C,YAAY56C,EAAGE,KAAK,cAC3CwG,EAAQtE,GAAGtB,EAAApE,YAAY+X,SAASzU,EAAGE,KAAK,WACxCwG,EAAQtE,GAAGtB,EAAApE,YAAY4mB,WAAWtjB,EAAGE,KAAK,aAC9CF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,MACRF,EAAGE,KAAK7F,KAAK+uE,aAAa1iE,EAAQ/D,OAClC3C,EAAGE,KAAK,SAGVqpE,EAAAjtE,UAAAsqE,eAAA,SAAelgE,WACT2D,EAAU3D,EAAQ2D,QACtB,GAAIA,GAAWA,EAAQ4oB,KAAM,CAC3B,IAAIjzB,EAAK3F,KAAK2F,GACdzC,EAAA4rE,OAAOnpE,EAAI3F,KAAK6uE,eAChBlpE,EAAGE,KAAK,cACRF,EAAGE,KAAKwG,EAAQwb,YAChBliB,EAAGE,KAAK,YACR,IAAmB,IAAAwpB,EAAAnL,EAAAlU,EAAQtC,UAAQ4W,EAAA+K,EAAAjL,QAAAE,EAAAD,KAAAC,EAAA+K,EAAAjL,OAAA,CAA9B,IAAI9J,EAAMgK,EAAAhjB,MAAsBtB,KAAK+rE,aAAazxD,qGACvDpX,EAAA4rE,OAAOnpE,IAAM3F,KAAK6uE,aAClBlpE,EAAGE,KAAK,SAIZqpE,EAAAjtE,UAAA8sE,aAAA,SAAazmE,GACX,OAAQA,EAAKvB,MACX,OAAkB,MAAO,KACzB,OAAmB,MAAO,MAC1B,OAAmB,MAAO,MAC1B,OAAmB,MAAO,MAC1B,OAAqB,OAAO/G,KAAKusB,QAAQvL,QAAQkB,SAAW,MAAQ,MACpE,OAAkB,MAAO,KACzB,OAAmB,MAAO,MAC1B,OAAmB,MAAO,MAE1B,OAAmB,MAAO,MAC1B,OAAqB,OAAOliB,KAAKusB,QAAQvL,QAAQkB,SAAW,MAAQ,MAEpE,QAAoB,MAAO,OAC3B,QAAmB,MAAO,MAC1B,QAAmB,MAAO,MAC1B,QAAoB,MAAO,OAC3B,QAEE,OADAze,QAAO,GACA,KAKbyrE,EAAAjtE,UAAA8qE,MAAA,WACE,IAAIpnE,EAAK3F,KAAK2F,GAgBd,OAfAA,EAAGE,KAAK,+BACRF,EAAGE,KAAK,yBACRF,EAAGE,KAAK,0BACRF,EAAGE,KAAK,0BACRF,EAAGE,KAAK,yBACRF,EAAGE,KAAK,0BACRF,EAAGE,KAAK,0BACRF,EAAGE,KAAK,0BACRF,EAAGE,KAAK,0BACRF,EAAGE,KAAK,0BACN7F,KAAK6uE,YACP7uE,KAAK8rE,SACH9rE,KAAK6uE,YACPlpE,EAAGE,KAAK,OACRF,EAAGE,KAAK,8BACD7F,KAAK2F,GAAGG,KAAK,KAExBopE,EA9MA,CAAgCvD,GAAnBjsE,EAAAwvE,icCzoBb,IAAAzoE,EAAAtG,EAAA,GAMAs7C,EAAAt7C,EAAA,GAIAuG,EAAAvG,EAAA,GAQAoc,EAAApc,EAAA,GAKA+C,EAAA/C,EAAA,GAIAsc,EAAAtc,EAAA,GA0DAmvE,EAAA,SAAAh6D,GAcE,SAAAg6D,IAAA,IAAA95D,EACEF,EAAA9U,KAAAR,OAAOA,YAVTwV,EAAA+5D,QAAoB,IAAIppE,MAExBqP,EAAAg6D,QAAuB,IAAI7jD,IAE3BnW,EAAAi6D,QAAuB,IAAI9jD,IAE3BnW,EAAAquC,UAAmC,KA4b3BruC,EAAAk6D,8BAAqC,EAudrCl6D,EAAAm6D,oBAAuC,KA94B7Cn6D,EAAK+W,QAAU,IAAIkvB,EAAAr8B,QAAQ5J,EAAKtP,eAoiHpC,OApjH4BqP,EAAA+5D,EAAAh6D,GAoB1Bg6D,EAAArtE,UAAA2tE,UAAA,SACExqE,EACA2L,EACAqX,GAEA,IAAIrjB,EAAiB7B,EAAA+N,cAAcF,GAC/BK,EAAeqL,EAAApL,mBAAmBtM,GAGtC,IAAI/E,KAAKyvE,QAAQ9pD,IAAIvU,GAArB,CACApR,KAAKyvE,QAAQ7jD,IAAIxa,GACjBpR,KAAKwvE,QAAQ5jD,IAAIxa,GAGjB,IAAItM,EAAS,IAAI2X,EAAAzD,OACfjU,EACAK,EACAgjB,EACI3L,EAAA3D,WAAWW,MACX1I,EAAKG,WAAWzK,EAAA3D,iBAAmBiO,EAAKw9D,QAAQ9nE,EAAAnE,eAAgBmE,EAAA3D,eAAewC,QAAU,EACvFmX,EAAA3D,WAAWY,QACX+C,EAAA3D,WAAW0mC,SAEfjzB,EAAUvsB,KAAKusB,QACnBA,EAAQ7L,QAAQ7a,KAAKf,GAGrB,IAAI+qE,EAAK,IAAInpE,EAAA88C,UAAU1+C,EAAQynB,EAAQrmB,aACvC2pE,EAAGhsB,UAAY7jD,KAAK6jD,UACpB/+C,EAAOoU,UAAY22D,EAEnB,IADA,IAAItgE,EAAazK,EAAOyK,YAChBsgE,EAAGtpB,KAAK7/C,EAAAC,MAAMq/C,YAAY,CAChC,IAAI11C,EAAYtQ,KAAK8vE,uBAAuBD,GACxCv/D,IACFA,EAAU1I,OAAS9C,EACnByK,EAAW1J,KAAKyK,IAGpBu/D,EAAGpmB,WAIL6lB,EAAArtE,UAAA6tE,uBAAA,SACED,EACAloD,QAAA,IAAAA,MAAA,MAOA,IALA,IAAI9f,EAAQpB,EAAApE,YAAYyF,KACpBioE,GAAiB,EAGjB9/D,EAAqC,KAClC4/D,EAAGtpB,KAAK7/C,EAAAC,MAAM2+C,KAAK,CACpByqB,EAAW,IAAGA,EAAWF,EAAGpsB,UAChC,IAAIpnC,EAAYrc,KAAKgwE,eAAeH,GAC/BxzD,GAIApM,IAAYA,MACjBA,EAAWpK,KAAKwW,IAJdrc,KAAKiwE,cAAcJ,GAQvB,IAAIK,EAAmB,EACnBC,EAAiB,EACjBN,EAAGtpB,KAAK7/C,EAAAC,MAAMsT,UACZ41D,EAAGtpB,KAAK7/C,EAAAC,MAAM64C,UAChBx/C,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf4nD,EAAGzrE,SAGH2rE,EAAW,IAAGA,EAAWF,EAAGpsB,UAChC57C,GAASpB,EAAApE,YAAY4X,OACrBi2D,EAAcL,EAAGpsB,SACjB0sB,EAAYN,EAAGv2D,KAGjB,IAEI82D,EAAgC,MAAbzoD,GAAqBA,EAAU5f,GAAGtB,EAAApE,YAAY8jB,SACjE0pD,EAAGtpB,KAAK7/C,EAAAC,MAAM44C,UACZwwB,EAAW,IAAGA,EAAWF,EAAGpsB,UAC5B2sB,GACFpwE,KAAKuG,MACHgW,EAAAzY,eAAeusE,gEACfR,EAAGzrE,SAGPyD,GAASpB,EAAApE,YAAYk9C,QAAU94C,EAAApE,YAAY8jB,SAClCiqD,IACTvoE,GAASpB,EAAApE,YAAY8jB,SAIvB,IAAI7V,EAA8B,KAG9BggE,EAAQT,EAAG5pB,OAEf,OADI8pB,EAAW,IAAGA,EAAWF,EAAGlsB,cACxB2sB,GACN,KAAK5pE,EAAAC,MAAM0lB,MAGT,GAFAwjD,EAAGzrD,OACHvc,GAASpB,EAAApE,YAAYgqB,MACjBwjD,EAAGtpB,KAAK7/C,EAAAC,MAAM8lB,MAAO,CACvBnc,EAAYtQ,KAAKuwE,UAAUV,EAAIhoE,EAAOoI,EAAY8/D,GAClD,MAEAz/D,EAAYtQ,KAAKwwE,cAAcX,EAAIhoE,EAAOoI,EAAY8/D,GACtD9/D,EAAa,KAEf,MAEF,KAAKvJ,EAAAC,MAAMu5C,IAAKr4C,GAASpB,EAAApE,YAAY69C,IACrC,KAAKx5C,EAAAC,MAAM+5C,IACTmvB,EAAGzrD,OACH9T,EAAYtQ,KAAKwwE,cAAcX,EAAIhoE,EAAOoI,EAAY8/D,GACtD9/D,EAAa,KACb,MAEF,KAAKvJ,EAAAC,MAAM8lB,KACTojD,EAAGzrD,OACH9T,EAAYtQ,KAAKuwE,UAAUV,EAAIhoE,EAAOoI,EAAY8/D,GAClD9/D,EAAa,KACb,MAEF,KAAKvJ,EAAAC,MAAMkR,SACTg4D,EAAGzrD,OACH9T,EAAYtQ,KAAKywE,cAAcZ,EAAIhoE,EAAOoI,EAAY8/D,GACtD9/D,EAAa,KACb,MAEF,KAAKvJ,EAAAC,MAAMuiB,SACT,IAAIu9B,EAAQopB,EAAGrpB,OAEf,GADAqpB,EAAGzrD,QACEyrD,EAAGtpB,KAAK7/C,EAAAC,MAAM8Q,OAAQ,CACzBo4D,EAAGhpB,MAAMJ,GACTn2C,EAAYtQ,KAAK0wE,eAAeb,GAAI,GACpC,MAEAA,EAAGjpB,QAAQH,GAEb5+C,GAASpB,EAAApE,YAAY6mB,SAGvB,KAAKxiB,EAAAC,MAAM8Q,MACX,KAAK/Q,EAAAC,MAAM+rB,UACTm9C,EAAGzrD,OACH9T,EAAYtQ,KAAK2wE,sBAAsBd,EAAIhoE,EAAOoI,EAAY8/D,GAC9D9/D,EAAa,KACb,MAEF,KAAKvJ,EAAAC,MAAM6lB,UACLi6B,EAAQopB,EAAGrpB,OACfqpB,EAAGzrD,OACCyrD,EAAG5pB,MAAK,EAAOv/C,EAAAq4C,mBAAmB8G,SAAWn/C,EAAAC,MAAMU,YACrDwoE,EAAGjpB,QAAQH,GACXn2C,EAAYtQ,KAAK4wE,eAAef,EAAIhoE,EAAOoI,EAAY8/D,GACvD9/D,EAAa,OAEb4/D,EAAGhpB,MAAMJ,GACTn2C,EAAYtQ,KAAK0wE,eAAeb,GAAI,IAEtC,MAEF,KAAKnpE,EAAAC,MAAM4U,OACTs0D,EAAGzrD,OAGD9T,GAFFzI,GAASpB,EAAApE,YAAYkZ,QACT9U,EAAApE,YAAY4X,OACVja,KAAK6wE,kBAAkBhB,EAAIE,GAE3B/vE,KAAK8wE,YAAYjB,GAE/B,MAEF,KAAKnpE,EAAAC,MAAM+O,KACL+wC,EAAQopB,EAAGrpB,OACfqpB,EAAGzrD,OACCyrD,EAAG5pB,MAAK,EAAOv/C,EAAAq4C,mBAAmB8G,SAAWn/C,EAAAC,MAAMU,YACrDwoE,EAAGjpB,QAAQH,GACXn2C,EAAYtQ,KAAK+wE,qBAAqBlB,EAAIhoE,EAAOoI,EAAY8/D,GAC7D9/D,EAAa,OAEb4/D,EAAGhpB,MAAMJ,GACTn2C,EAAYtQ,KAAK0wE,eAAeb,GAAI,IAEtC,MAEF,QAGMhoE,EAAQpB,EAAApE,YAAY4X,OACtB3J,EAAYtQ,KAAKgxE,YAAYnB,EAAIhoE,EAAOkoE,IAIpCI,GACFnwE,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM8rE,EAAaC,GAAY,UASjCxoD,IACHrX,EAAYtQ,KAAK0wE,eAAeb,GAAI,KAQ5C,GAAI5/D,EACF,IAAK,IAAI5P,EAAI,EAAGwK,EAAIoF,EAAW3K,OAAQjF,EAAIwK,IAAKxK,EAC9CL,KAAKuG,MACHgW,EAAAzY,eAAeotE,8BACfjhE,EAAW5P,GAAG+D,OAIpB,OAAOkM,GAITg/D,EAAArtE,UAAAkvE,SAAA,WACE,IAAI5B,EAAUvvE,KAAKuvE,QACnB,OAAOA,EAAQjqE,OAASiqE,EAAQ52C,QAAU,MAI5C22C,EAAArtE,UAAAwnD,OAAA,WACE,GAAIzpD,KAAKuvE,QAAQjqE,OAAQ,MAAM,IAAIogB,MAAM,wBAIzC,OAHA1lB,KAAKuvE,WACLvvE,KAAKwvE,QAAQ4B,QACbpxE,KAAKyvE,QAAQ2B,QACNpxE,KAAKusB,SAId+iD,EAAArtE,UAAAovE,UAAA,SACExB,EACAyB,EACAC,QADA,IAAAD,OAAA,QACA,IAAAC,OAAA,GAIA,IAGIjpE,EAHAw4C,EAAQ+uB,EAAGzrD,OACX2rD,EAAWF,EAAGpsB,SAKlB,GAAI3C,GAASp6C,EAAAC,MAAMu9C,UAAW,CAG5B,IAAIstB,EAAsB3B,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAEpCjxC,EAAYjT,KAAKyxE,kBAAkB5B,GACvC,GAAI58D,EAAW,CACb,GAAIu+D,EAAqB,CACvB,IAAK3B,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAKjB,OAJAnkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAET,IAAKyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMw7C,KAKjB,OAJAniD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAEJyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMM,OACjBjH,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,QAGhB6O,EAAU5K,YAAa,EAEzB,OAAO4K,EACF,GAAIu+D,GAAuBxxE,KAAK0vE,6BAKrC,OAJA1vE,KAAKuG,MACHgW,EAAAzY,eAAe4tE,iBACf7B,EAAGzrE,SAEE,KAIT,IAAIktE,EAoBF,OAJAtxE,KAAKuG,MACHgW,EAAAzY,eAAe4tE,iBACf7B,EAAGzrE,SAEE,KAnBP,IAAIutE,EAAY3xE,KAAKqxE,UAAUxB,GAAI,EAAO0B,GAC1C,IAAKI,EAAW,OAAO,KACvB,IAAK9B,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAOjB,OANKotB,GACHvxE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,KAGf,MAEThR,EAAOqpE,GACFvtE,MAAMmB,MAAQwqE,EACnBznE,EAAKlE,MAAMoB,IAAMqqE,EAAGv2D,SAUjB,GAAIwnC,GAASp6C,EAAAC,MAAMqV,KACxB1T,EAAOmU,EAAA9U,KAAKQ,WACVsU,EAAA9U,KAAKe,2BAA2B,OAAQmnE,EAAGzrE,aAAc,EAAOyrE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,WAInF,GAAIwnC,GAASp6C,EAAAC,MAAM2R,KACxBhQ,EAAOmU,EAAA9U,KAAKQ,WACVsU,EAAA9U,KAAKkH,qBAAqBghE,EAAGzrE,aAAc,EAAOyrE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,WAIrE,GAAIwnC,GAASp6C,EAAAC,MAAMO,MAAQ45C,GAASp6C,EAAAC,MAAMQ,MAC/CmB,EAAOmU,EAAA9U,KAAKQ,WACVsU,EAAA9U,KAAKe,2BAA2B,OAAQmnE,EAAGzrE,aAAc,EAAOyrE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,WAInF,GAAIwnC,GAASp6C,EAAAC,MAAMs9C,cACxB4rB,EAAG58B,aACH3qC,EAAOmU,EAAA9U,KAAKQ,WACVsU,EAAA9U,KAAKe,2BAA2B,SAAUmnE,EAAGzrE,aAAc,EAAOyrE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,UAIrF,IAAIwnC,GAASp6C,EAAAC,MAAMU,WA6CxB,OANKkqE,GACHvxE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGA,KA5CP,IAAIyL,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACrEiF,EAAa,IAAIlD,MACjB0rE,GAAW,EAGf,GAAIhC,EAAGtpB,KAAK7/C,EAAAC,MAAMs6C,UAAW,CAC3B,EAAG,CACD,IAAI6wB,EAAY9xE,KAAKqxE,UAAUxB,GAAI,EAAM0B,GACzC,IAAKO,EAAW,OAAO,KACvBzoE,EAAWxD,KAAeisE,SACnBjC,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,QACvB,IAAKm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMu6C,aAOjB,OANKqwB,GACHvxE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,KAGf,KAIX,GAAIu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMw7C,KAAM,CACtB,IAAI0tB,EAAGtpB,KAAK7/C,EAAAC,MAAMM,MAShB,OANKsqE,GACHvxE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,QAGf,KARPu4D,GAAW,EAWfvpE,EAAOmU,EAAA9U,KAAKQ,WAAW0H,EAAYxG,EAAYwoE,EAAUhC,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAYjF,KAAOu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMu+C,cAAc,CACjC,IAAI6sB,EAAelC,EAAGpsB,SACtB,IAAKosB,EAAGtpB,KAAK7/C,EAAAC,MAAMw+C,cAOjB,OANKosB,GACHvxE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGT,KAET,IAAI4tE,EAAenC,EAAGzrE,MAAM2tE,EAAclC,EAAGv2D,KAGzCu4D,GAAW,EACf,GAAIhC,EAAGtpB,KAAK7/C,EAAAC,MAAMw7C,KAAM,CACtB,IAAI0tB,EAAGtpB,KAAK7/C,EAAAC,MAAMM,MAShB,OANKsqE,GACHvxE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,QAGT,KARPytE,GAAW,EAiBf,GANAvpE,EAAOmU,EAAA9U,KAAKQ,WACVsU,EAAA9U,KAAKe,2BAA2B,QAASspE,IACvC1pE,GACFupE,EACAhC,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEpBu4D,EAAU,MAGhB,OAAOvpE,GAOTgnE,EAAArtE,UAAAwvE,kBAAA,SACE5B,GAKA,IAuGIvmE,EAvGAm9C,EAAQopB,EAAGrpB,OACXupB,EAAWF,EAAGpsB,SACdp6C,EAAqC,KACrC4lB,EAA4B,KAC5BgjD,GAAoB,EAExB,GAAIpC,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAChB8tB,GAAc,EACdpC,EAAGjpB,QAAQH,GACXp9C,SAEK,CACL4oE,GAAc,EACd,EAAG,CACD,IAAIlrE,EAAO0V,EAAA7G,cAAc4pC,QAMzB,GALIqwB,EAAGtpB,KAAK7/C,EAAAC,MAAMq6C,eAChBixB,GAAc,EACdpC,EAAGjpB,QAAQH,GACX1/C,EAAO0V,EAAA7G,cAAcowD,MAEnB6J,EAAGtpB,KAAK7/C,EAAAC,MAAM2R,MAAO,CACvB,IAAIu3D,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAiBhB,OAFA+qB,EAAGhpB,MAAMJ,GACTzmD,KAAK0vE,8BAA+B,EAC7B,KAhBPuC,GAAc,EACdpC,EAAGjpB,QAAQH,GACX,IAAIllD,EAAIvB,KAAKqxE,UAAUxB,GAAI,GAC3B,IAAKtuE,EAAG,OAAO,KACf,GAAIA,EAAEwF,MAAQ0V,EAAA5V,SAAS6O,KAMrB,OALA1V,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf1mB,EAAE6C,OAEJpE,KAAK0vE,8BAA+B,EAC7B,KAETzgD,EAAqB1tB,MAMlB,KAAIsuE,EAAGvpB,iBA8CZ,OATI2rB,EACFjyE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGLyrE,EAAGhpB,MAAMJ,GAEXzmD,KAAK0vE,6BAA+BuC,EAC7B,KA7CP,IAAIrxE,EAAO6b,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,MAAMyrE,EAAGpsB,SAAUosB,EAAGv2D,MAazF,GAZIu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMs+C,YAChBgtB,GAAc,EACdpC,EAAGjpB,QAAQH,GACP1/C,GAAQ0V,EAAA7G,cAAcowD,KACxBhmE,KAAKuG,MACHgW,EAAAzY,eAAeouE,oCACfrC,EAAGzrE,SAGL2C,EAAO0V,EAAA7G,cAAcu8D,UAGrBtC,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAAQ,CACxBmtB,GAAc,EACdpC,EAAGjpB,QAAQH,GACX,IAAIn+C,EAAOtI,KAAKqxE,UAAUxB,GAC1B,IAAKvnE,EAEH,OADAtI,KAAK0vE,6BAA+BuC,EAC7B,KAET,IAAIG,EAAQ,IAAI31D,EAAAvT,cAChBkpE,EAAMjpE,cAAgBpC,EACtBqrE,EAAMxxE,KAAOA,EACbwxE,EAAM9pE,KAAOA,EACRe,EACAA,EAAWxD,KAAKusE,GADJ/oE,GAAe+oE,QAG5BH,GACFjyE,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfmhB,EAAGzrE,gBAgBJyrE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,QACvB,IAAKm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAUjB,OATI8tB,EACFjyE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGdyrE,EAAGhpB,MAAMJ,GAEXzmD,KAAK0vE,6BAA+BuC,EAC7B,KAKX,OAAIpC,EAAGtpB,KAAK7/C,EAAAC,MAAMq+C,qBAChBitB,GAAc,EACdpC,EAAGjpB,QAAQH,IACXn9C,EAAatJ,KAAKqxE,UAAUxB,KAiB9B7vE,KAAK0vE,8BAA+B,EAC7BjzD,EAAA9U,KAAKyB,gBACVC,MACAC,EACA2lB,GACA,EACA4gD,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,QArBpBtZ,KAAK0vE,6BAA+BuC,EAC7B,QAGLA,EACFjyE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,MAGdyrE,EAAGhpB,MAAMJ,GAEXzmD,KAAK0vE,6BAA+BuC,EAC7B,OAcX3C,EAAArtE,UAAA+tE,eAAA,SACEH,GAKA,IAAIE,EAAWF,EAAGpsB,SAClB,GAAIosB,EAAGvpB,iBAAkB,CAGvB,IAFA,IAAI1lD,EAAOivE,EAAG/oB,iBACV77C,EAAyBwR,EAAA9U,KAAKe,2BAA2B9H,EAAMivE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAClFu2D,EAAGtpB,KAAK7/C,EAAAC,MAAM29C,MAAM,CACzB,IAAIurB,EAAGvpB,iBAYL,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KAXPxD,EAAOivE,EAAG/oB,iBACV77C,EAAawR,EAAA9U,KAAKmG,+BAChB7C,EACAwR,EAAA9U,KAAKe,2BAA2B9H,EAAMivE,EAAGzrE,SACzCyrE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAU5B,IAAI3P,OAAI,EACR,IAAIkmE,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAMhB,OAAOznC,EAAA9U,KAAK+B,gBAAgBuB,EAAY,KAAM4kE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAJpE,GADA3P,EAAO3J,KAAKqyE,eAAexC,GAEzB,OAAOpzD,EAAA9U,KAAK+B,gBAAgBuB,EAAYtB,EAAMkmE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,WAMxEtZ,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGP,OAAO,MAGTkrE,EAAArtE,UAAAuuE,cAAA,SACEX,EACAhoE,EACAoI,EACA8/D,GAKA,IAAI//D,EAAU,IAAI7J,MAClB,EAAG,CACD,IAAImU,EAASta,KAAKsyE,yBAAyBzC,EAAIhoE,EAAOoI,GACtD,IAAKqK,EAAQ,OAAO,KACpBtK,EAAQnK,KAA0ByU,SAC3Bu1D,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,QAEvB,IAAIi7B,EAAMl2B,EAAA9U,KAAKkN,wBAAwB7E,EAASC,EAAYpI,EAAOgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEzF,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAAqwE,yBAAA,SACEzC,EACA0C,EACAC,GAKA,IAAK3C,EAAGvpB,iBAKN,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KAET,IAAIyL,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACrEyD,EAAQ0qE,EACR1C,EAAGtpB,KAAK7/C,EAAAC,MAAM07C,eAChBx6C,GAASpB,EAAApE,YAAYowE,qBAGvB,IAAInqE,EAA8B,KAC9BunE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,SAChBx8C,EAAOtI,KAAKqxE,UAAUxB,IAGxB,IAAI5mE,EAAiC,KACrC,GAAI4mE,EAAGtpB,KAAK7/C,EAAAC,MAAM87C,SAQhB,GAPI56C,EAAQpB,EAAApE,YAAY8jB,SACtBnmB,KAAKuG,MACHgW,EAAAzY,eAAe4uE,iDACf7C,EAAGzrE,WAGP6E,EAAcjJ,KAAK2yE,gBAAgB9C,EAAI,IACrB,OAAO,UAErBhoE,EAAQpB,EAAApE,YAAYgqB,MAChBxkB,EAAQpB,EAAApE,YAAY8jB,SACxBnmB,KAAKuG,MACHgW,EAAAzY,eAAekxD,wCACfnlD,EAAWzL,OAGLkE,GACVtI,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfmhB,EAAGzrE,MAAMyrE,EAAGv2D,MAIlB,IAAIlV,EAAQsC,EAAAE,MAAMd,KAAK+J,EAAWzL,MAAOyrE,EAAGzrE,SAM5C,OALKyD,EAAQpB,EAAApE,YAAYowE,qBAAwBxpE,GAC/CjJ,KAAKuG,MACHgW,EAAAzY,eAAe8uE,iEACfxuE,GAEGqY,EAAA9U,KAAKoN,0BACVlF,EACAvH,EACAW,EACAupE,EACA3qE,EACAzD,IAIJkrE,EAAArtE,UAAAsuE,UAAA,SACEV,EACAhoE,EACAoI,EACA8/D,GAKA,GAAIF,EAAGzrD,QAAU1d,EAAAC,MAAMU,WAKrB,OAJArH,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KAET,IAAIyL,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACzE,GAAIyrE,EAAGzrD,QAAU1d,EAAAC,MAAMy+C,UAKrB,OAJAplD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAGT,IADA,IAAI4L,EAAU,IAAI7J,OACV0pE,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CACjC,IAAI/qC,EAASta,KAAK6yE,eAAehD,EAAIppE,EAAApE,YAAYyF,MACjD,IAAKwS,EAAQ,OAAO,KAEpB,GADAtK,EAAQnK,KAA2ByU,IAC9Bu1D,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,YAChB,MAMA,OAJArlD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAIb,IAAIuuC,EAAMl2B,EAAA9U,KAAK+I,sBACbb,EACAG,EACAC,EACApI,EACAgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGxB,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAA4wE,eAAA,SACEhD,EACA0C,GAKA,IAAK1C,EAAGvpB,iBAKN,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KAET,IAAIyL,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACrE9C,EAA2B,KAC/B,OAAIuuE,EAAGtpB,KAAK7/C,EAAAC,MAAM87C,WAChBnhD,EAAQtB,KAAK2yE,gBAAgB9C,EAAI,IACd,KAEdpzD,EAAA9U,KAAKiJ,2BACVf,EACAvO,EACAixE,EACA7rE,EAAAE,MAAMd,KAAK+J,EAAWzL,MAAOyrE,EAAGzrE,WAIpCkrE,EAAArtE,UAAA6wE,YAAA,SACEjD,GAKA,IAAIxlE,EAA0B,KAC9B,GACEwlE,EAAG5pB,MAAK,IAASv/C,EAAAC,MAAMo+C,WACvB8qB,EAAGnsB,WAAah9C,EAAAC,MAAM0+C,aACrBwqB,EAAGjsB,sBAEEv5C,EAAOrK,KAAK2yE,gBAAgB9C,IAAM,OAAO,KAGjD,IAAIl9B,EAAMl2B,EAAA9U,KAAKiM,sBAAsBvJ,EAAMwlE,EAAGzrE,SAE9C,OADAyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAA8wE,oBAAA,SACElD,GAOA,IAFA,IAAI//D,EAAiB,IAAI3J,MACrB6sE,GAAe,GACXnD,EAAGtpB,KAAK7/C,EAAAC,MAAMu6C,cAAc,CAClC,IAAI+xB,EAAgBjzE,KAAKkzE,mBAAmBrD,GAC5C,IAAKoD,EAAe,OAAO,KAW3B,GAVkC,OAA9BA,EAAcpqE,YAChBmqE,GAAe,EACNA,IACThzE,KAAKuG,MACHgW,EAAAzY,eAAeqvE,iEACfF,EAAc7uE,OAEhB6uE,EAAcpqE,YAAc,MAE9BiH,EAAejK,KAAwBotE,IAClCpD,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMu6C,aAChB,MAMA,OAJAlhD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAUb,OAN8B,IAA1B0L,EAAexK,QACjBtF,KAAKuG,MACHgW,EAAAzY,eAAesvE,oCACfvD,EAAGzrE,SAGA0L,GAGTw/D,EAAArtE,UAAAixE,mBAAA,SACErD,GAKA,GAAIA,EAAGzrD,QAAU1d,EAAAC,MAAMU,WAAY,CACjC,IAAIwI,EAAa4M,EAAA9U,KAAKe,2BACpBmnE,EAAG/oB,iBACH+oB,EAAGzrE,SAEDwE,EAA+B,KACnC,GAAIinE,EAAGtpB,KAAK7/C,EAAAC,MAAMg5C,SAAU,CAE1B,KADIp+C,EAAIvB,KAAKqxE,UAAUxB,IACf,OAAO,KACf,GAAItuE,EAAEwF,MAAQ0V,EAAA5V,SAAS6O,KAKrB,OAJA1V,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf1mB,EAAE6C,OAEG,KAETwE,EAAwBrH,EAE1B,IAAIsH,EAA+B,KACnC,GAAIgnE,EAAGtpB,KAAK7/C,EAAAC,MAAM87C,QAAS,CACzB,IAAIlhD,EACJ,KADIA,EAAIvB,KAAKqxE,UAAUxB,IACf,OAAO,KACf,GAAItuE,EAAEwF,MAAQ0V,EAAA5V,SAAS6O,KAKrB,OAJA1V,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf1mB,EAAE6C,OAEG,KAETyE,EAAwBtH,EAE1B,OAAOkb,EAAA9U,KAAKgB,oBACVkH,EACAjH,EACAC,EACAnC,EAAAE,MAAMd,KAAK+J,EAAWzL,MAAOyrE,EAAGzrE,UAQpC,OALEpE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGA,MAKTkrE,EAAArtE,UAAAoxE,gBAAA,SACExD,EACA1f,QAAA,IAAAA,OAAA,GAKA,IAAI9mD,EAAa,IAAIlD,MACjBmtE,EAAiC,KACjCN,GAAe,EACfO,GAAe,EACftkD,EAAkC,KAItC,GADAjvB,KAAK2vE,oBAAsB,KACvBE,EAAGtpB,KAAK7/C,EAAAC,MAAM2R,MAAO,CACvB,IAAIu3D,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAgBhB,OAJA9kD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAdP,KADA6qB,EAAWjvB,KAAKqxE,UAAUxB,IACX,OAAO,KAgBxB,GAfM5gD,EAASloB,MAAQ0V,EAAA5V,SAAS6O,KAC5B1V,KAAK2vE,oBAAgC1gD,EAErCjvB,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACfgH,EAAS7qB,QAUVyrE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OACjB,OAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YACT96C,GAEPrJ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAKb,MAAQyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,aAAa,CACjC,IAAIiuB,EAAQpyE,KAAKwzE,eAAe3D,EAAI1f,GACpC,IAAKiiB,EAAO,OAAO,KAQnB,OAPIkB,IAAaC,IACfvzE,KAAKuG,MACHgW,EAAAzY,eAAe2vE,kDACfH,EAAS1yE,KAAKwD,OAEhBmvE,GAAe,GAETnB,EAAMjpE,eACZ,QACM6pE,GACFhzE,KAAKuG,MACHgW,EAAAzY,eAAe4vE,yDACftB,EAAMxxE,KAAKwD,OAGf,MAEF,KAAKqY,EAAA7G,cAAcu8D,SACjBa,GAAe,EACf,MAEF,KAAKv2D,EAAA7G,cAAcowD,KACjBsN,EAAWlB,EAKf,GADA/oE,EAAWxD,KAAKusE,IACXvC,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAChB,MAMA,OAJAnkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAIb,OAAOiF,GAGTimE,EAAArtE,UAAAuxE,eAAA,SACE3D,EACA1f,QAAA,IAAAA,OAAA,GAKA,IAAIwjB,GAAS,EACTC,GAAa,EACbC,EAA2B,KAC3BC,EAA2BrtE,EAAApE,YAAYyF,KAC3C,GAAIqoD,IACE0f,EAAGtpB,KAAK7/C,EAAAC,MAAM65C,SAChBqzB,EAAahE,EAAGzrE,QAChB0vE,GAAertE,EAAApE,YAAYm+C,QAClBqvB,EAAGtpB,KAAK7/C,EAAAC,MAAM45C,YACvBszB,EAAahE,EAAGzrE,QAChB0vE,GAAertE,EAAApE,YAAYk+C,WAClBsvB,EAAGtpB,KAAK7/C,EAAAC,MAAM25C,WACvBuzB,EAAahE,EAAGzrE,QAChB0vE,GAAertE,EAAApE,YAAYi+C,SAEzBuvB,EAAG5pB,QAAUv/C,EAAAC,MAAMsiB,UAAU,CAC/B,IAAIw9B,EAAQopB,EAAGrpB,OACfqpB,EAAGzrD,OACCyrD,EAAG5pB,QAAUv/C,EAAAC,MAAMm+C,OACrB+qB,EAAGjpB,QAAQH,GACNotB,IAAYA,EAAahE,EAAGzrE,SACjC0vE,GAAertE,EAAApE,YAAY4mB,UAE3B4mD,EAAGhpB,MAAMJ,GAef,GAXIopB,EAAGtpB,KAAK7/C,EAAAC,MAAMq6C,eACZ8yB,EACF9zE,KAAKuG,MACHgW,EAAAzY,eAAeiwE,+DACflE,EAAGzrE,SAGLyvE,EAAahE,EAAGzrE,QAElBuvE,GAAS,GAEP9D,EAAGvpB,iBAAkB,CAClBqtB,IAAQE,EAAahE,EAAGzrE,SAC7B,IAAIyL,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACrEkE,EAA8B,KASlC,IARIsrE,EAAa/D,EAAGtpB,KAAK7/C,EAAAC,MAAMs+C,YACzB0uB,GACF3zE,KAAKuG,MACHgW,EAAAzY,eAAeouE,oCACfriE,EAAWzL,OAIbyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,QAEhB,KADAx8C,EAAOtI,KAAKqxE,UAAUxB,IACX,OAAO,UAElBvnE,EAAOmU,EAAA9U,KAAKc,kBAAkBonE,EAAGzrE,MAAMyrE,EAAGv2D,MAE5C,IAAIrQ,EAAiC,KACrC,GAAI4mE,EAAGtpB,KAAK7/C,EAAAC,MAAM87C,UACZkxB,GACF3zE,KAAKuG,MACHgW,EAAAzY,eAAekwE,4CACfnkE,EAAWzL,OAGXwvE,EACF5zE,KAAKuG,MACHgW,EAAAzY,eAAemwE,oDACfpkE,EAAWzL,OAGbwvE,GAAa,IAEf3qE,EAAcjJ,KAAK2yE,gBAAgB9C,EAAI,KACrB,OAAO,KAE3B,IAAIuC,EAAQ31D,EAAA9U,KAAKqB,gBACf6G,EACAvH,EACAW,EACA0qE,EACIl3D,EAAA7G,cAAcowD,KACd4N,EACEn3D,EAAA7G,cAAcu8D,SACd11D,EAAA7G,cAAc4pC,QACpB94C,EAAAE,MAAMd,KAAY+tE,EAAYhE,EAAGzrE,UAGnC,OADAguE,EAAMvqE,OAASisE,EACR1B,EAOT,OALEpyE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGA,MAGTkrE,EAAArtE,UAAAwuE,cAAA,SACEZ,EACAhoE,EACAoI,EACA8/D,GAUA,IAAKF,EAAGvpB,iBAKN,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,MAAMyrE,EAAGv2D,MAEP,KAGT,IAAI1Y,EAAO6b,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAC/D8vE,GAAuB,EAEvBpkE,EAA6C,KACjD,GAAI+/D,EAAGtpB,KAAK7/C,EAAAC,MAAMs6C,UAAW,CAG3B,GAFAizB,EAAiBrE,EAAGpsB,WACpB3zC,EAAiB9P,KAAK+yE,oBAAoBlD,IACrB,OAAO,KAC5BhoE,GAASpB,EAAApE,YAAY6jB,QAGvB,IAAK2pD,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAKjB,OAJAlkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,KAEb,KAGL46D,EAAiB,IACnBA,EAAiBrE,EAAGpsB,UAGtB,IAAIp6C,EAAarJ,KAAKqzE,gBAAgBxD,GACtC,IAAKxmE,EAAY,OAAO,KACxB,IAAI4lB,EAAWjvB,KAAK2vE,oBAEhBwE,EAAwC,IAA5BtsE,EAAQpB,EAAApE,YAAYqmB,KAChCyrD,IACuB,GAArB9qE,EAAW/D,QACbtF,KAAKuG,MACHgW,EAAAzY,eAAeswE,+CACfxzE,EAAKwD,OAGLiF,EAAW/D,QAAU+D,EAAW,GAAGJ,aACrCjJ,KAAKuG,MACHgW,EAAAzY,eAAeuwE,oDACfzzE,EAAKwD,QAKPyD,EAAQpB,EAAApE,YAAYomB,KAClBpf,EAAW/D,QACbtF,KAAKuG,MACHgW,EAAAzY,eAAewwE,sCACf1zE,EAAKwD,OAKX,IAAIkF,EAAoC,KACxC,GAAIumE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,UAChBx7C,EAAatJ,KAAKqxE,UAAUxB,GAAI,EAAMsE,IACrB,OAAO,KAGrB7qE,IACHA,EAAamT,EAAA9U,KAAKc,kBAChBonE,EAAGzrE,MAAMyrE,EAAGv2D,MAET66D,GACHn0E,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfplD,EAAWlF,QAKjB,IAAI6O,EAAYwJ,EAAA9U,KAAKyB,gBACnBC,EACAC,EACA2lB,GACA,EACA4gD,EAAGzrE,MAAM8vE,EAAgBrE,EAAGv2D,MAG1BpG,EAAyB,KAC7B,GAAI28D,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,YAShB,GARIv9C,EAAQpB,EAAApE,YAAY8jB,SACtBnmB,KAAKuG,MACHgW,EAAAzY,eAAemsD,yDACf4f,EAAGzrE,WAIP8O,EAAOlT,KAAKu0E,oBAAoB1E,GAAI,IACzB,OAAO,UACPhoE,EAAQpB,EAAApE,YAAY8jB,SAC/BnmB,KAAKuG,MACHgW,EAAAzY,eAAeosD,gFACf2f,EAAGzrE,MAAMyrE,EAAGv2D,MAIhB,IAAIq5B,EAAMl2B,EAAA9U,KAAKqL,0BACbpS,EACAkP,EACAmD,EACAC,EACAjD,EACApI,EACAgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGxB,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAAuyE,wBAAA,SAAwB3E,GACtB,IACIjvE,EADAmvE,EAAWF,EAAGpsB,SAEdgxB,GAAU,EAOd,GAAI5E,EAAG/uB,OAASp6C,EAAAC,MAAMkR,UAMpB,GAJEjX,EADEivE,EAAGvpB,iBACE7pC,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAExDqY,EAAA9U,KAAK4C,gCAAgCslE,EAAGzrE,MAAMyrE,EAAGv2D,OAErDu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAKjB,OAJAlkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,KAEb,UAQTm7D,GAAU,EACVhxE,OAAOosE,EAAG/uB,OAASp6C,EAAAC,MAAMu9C,WACzBtjD,EAAO6b,EAAA9U,KAAK4C,gCAAgCslE,EAAGzrE,MAAMyrE,EAAGpsB,WAK1D,IAAIywB,EAAiBrE,EAAGv2D,IACpBjQ,EAAarJ,KAAKqzE,gBAAgBxD,GACtC,OAAKxmE,EAEErJ,KAAK00E,8BAA8B7E,EAAIjvE,EAAMyI,EAAYorE,EAAS1E,EAAUmE,GAF3D,MAKlB5E,EAAArtE,UAAAyyE,8BAAR,SACE7E,EACAjvE,EACAyI,EACAorE,EACA1E,EACAmE,QADA,IAAAnE,OAAiB,QACjB,IAAAmE,OAAuB,GAEnBnE,EAAW,IAAGA,EAAWnvE,EAAKwD,MAAMmB,OACpC2uE,EAAiB,IAAGA,EAAiBnE,GAEzC,IAAIzmE,EAAoC,KACxC,GAAIumE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,QAEhB,KADAx7C,EAAatJ,KAAKqxE,UAAUxB,IACX,OAAO,UAExBvmE,EAAamT,EAAA9U,KAAKc,kBAAkBonE,EAAGzrE,MAAMyrE,EAAGv2D,MAChDtZ,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfplD,EAAWlF,OAIf,GAAIqwE,IACG5E,EAAGtpB,KAAK7/C,EAAAC,MAAMq+C,oBAKjB,OAJAhlD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,MAEb,KAIX,IAQIpG,EARAD,EAAYwJ,EAAA9U,KAAKyB,gBACnBC,EACAC,EACA,MACA,EACAumE,EAAGzrE,MAAM8vE,EAAgBrE,EAAGv2D,MAI9B,GAAIm7D,EACFvhE,EAAOlT,KAAK0wE,eAAeb,GAAI,OAC1B,CACL,IAAKA,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAKjB,OAJAplD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,KAEb,KAETpG,EAAOlT,KAAKu0E,oBAAoB1E,GAAI,GAEtC,IAAK38D,EAAM,OAAO,KAElB,IAAIrH,EAAc4Q,EAAA9U,KAAKqL,0BACrBpS,EACA,KACAqS,EACAC,EACA,KACAuhE,EAAUhuE,EAAApE,YAAYyK,MAAQrG,EAAApE,YAAYyF,KAC1C+nE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,OAAOmD,EAAA9U,KAAKiF,yBAAyBf,IAGvCyjE,EAAArtE,UAAA0uE,sBAAA,SACEd,EACAhoE,EACAoI,EACA8/D,GAUA,IAAIjnD,EAAc+mD,EAAG/uB,OAASp6C,EAAAC,MAAM+rB,UAEpC,IAAKm9C,EAAGvpB,iBAKN,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KAGT,IAKI0L,EALAD,EAAa4M,EAAA9U,KAAKe,2BACpBmnE,EAAG/oB,iBACH+oB,EAAGzrE,SAIL,GAAIyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMs6C,UAAW,CAE3B,KADAnxC,EAAiB9P,KAAK+yE,oBAAoBlD,IACrB,OAAO,KAC5BhoE,GAASpB,EAAApE,YAAY6jB,aAErBpW,KAGF,IAAIlH,EAA+B,KACnC,GAAIinE,EAAGtpB,KAAK7/C,EAAAC,MAAMg5C,SAAU,CAC1B,IAAIp+C,EAAIvB,KAAKqxE,UAAUxB,GACvB,IAAKtuE,EAAG,OAAO,KACf,GAAIA,EAAEwF,MAAQ0V,EAAA5V,SAAS6O,KAKrB,OAJA1V,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf1mB,EAAE6C,OAEG,KAETwE,EAAwBrH,EAG1B,IAAIwO,EAAqC,KACzC,GAAI8/D,EAAGtpB,KAAK7/C,EAAAC,MAAMm5C,YAAa,CACzBh3B,GACF9oB,KAAKuG,MACHgW,EAAAzY,eAAe6wE,oDACf9E,EAAGzrE,SAGP,EAAG,CACD,IAAIkE,EAAOtI,KAAKqxE,UAAUxB,GAC1B,IAAKvnE,EAAM,OAAO,KACbwgB,IACE/Y,IAAiBA,MACtBA,EAAgBlK,KAAeyC,UAE1BunE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,QAGzB,IAAKm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAKjB,OAJAplD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAGT,IACIyH,EADAmE,EAAU,IAAI7J,MAyBlB,GAvBI2iB,GACFrlB,QAAQsM,GACRlE,EAAc4Q,EAAA9U,KAAK8K,2BACjB5C,EACAC,EACAlH,EACAoH,EACAC,EACApI,EACAgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAGxBzN,EAAc4Q,EAAA9U,KAAKiI,uBACjBC,EACAC,EACAlH,EACAmH,EACAC,EACAC,EACApI,EACAgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAGrBu2D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,YACjB,EAAG,CACD,IAAI/qC,EAASta,KAAK40E,iBAAiB/E,EAAIhkE,GACvC,IAAKyO,EAAQ,OAAO,KACpBA,EAAO1S,OAASiE,EAChBmE,EAAQnK,KAA2ByU,UAC3Bu1D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAE1B,OAAOx5C,GAGTyjE,EAAArtE,UAAA4yE,qBAAA,SAAqBhF,GAInB,IACIjvE,EADAmvE,EAAWF,EAAGpsB,SASlB,GALE7iD,EADEivE,EAAGvpB,iBACE7pC,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAExDqY,EAAA9U,KAAK4C,gCAAgCslE,EAAGzrE,MAAMyrE,EAAGv2D,OAGrDu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAKjB,OAJAplD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,MAAMyrE,EAAGv2D,KAAM,KAEb,KAGT,IAAItJ,EAAU,IAAI7J,MACd0F,EAAc4Q,EAAA9U,KAAKiI,uBACrBhP,KAEA,KACA,KACAoP,EACA,KACAvJ,EAAApE,YAAYyF,KACZ+nE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,IAAKu2D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,YACjB,EAAG,CACD,IAAI/qC,EAASta,KAAK40E,iBAAiB/E,EAAIhkE,GACvC,IAAKyO,EAAQ,OAAO,KACpBA,EAAO1S,OAASiE,EAChBmE,EAAQnK,KAA2ByU,UAC3Bu1D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAE1B,OAAO5oC,EAAA9U,KAAKiE,sBAAsBC,IAGpCyjE,EAAArtE,UAAA2yE,iBAAA,SACE/E,EACAjoE,GAUA,IAAImoE,EAAWF,EAAGv2D,IACdwP,EAAclhB,EAAOb,MAAQ0V,EAAA5V,SAAS2U,qBAEtCvL,EAAa,IAAI9J,MACrB,GAAI0pE,EAAGtpB,KAAK7/C,EAAAC,MAAM2+C,IAAK,CACrB,EAAG,CACD,IAAIjpC,EAAYrc,KAAKgwE,eAAeH,GACpC,IAAKxzD,EAAW,MAChBpM,EAAWpK,KAAoBwW,SACxBwzD,EAAGtpB,KAAK7/C,EAAAC,MAAM2+C,KACnBx8B,GACF9oB,KAAKuG,MACHgW,EAAAzY,eAAeotE,8BACfxqE,EAAAE,MAAMd,KAAKmK,EAAW,GAAG7L,MAAO6L,EAAWA,EAAW3K,OAAS,GAAGlB,QAMxE,IAAIyD,EAAQD,EAAOC,MAAQpB,EAAApE,YAAY8jB,QAGnC2C,IAAajhB,GAASpB,EAAApE,YAAYyyE,SAEtC,IAAIC,EAAc,EACdC,EAAY,EACZnF,EAAGtpB,KAAK7/C,EAAAC,MAAM65C,SACZ13B,GACF9oB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,QAAS,UAGhByD,GAASpB,EAAApE,YAAYm+C,OACrBu0B,EAAclF,EAAGpsB,SACjBuxB,EAAYnF,EAAGv2D,KACNu2D,EAAGtpB,KAAK7/C,EAAAC,MAAM25C,UACnBx3B,GACF9oB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,QAAS,WAGhByD,GAASpB,EAAApE,YAAYi+C,QACrBy0B,EAAclF,EAAGpsB,SACjBuxB,EAAYnF,EAAGv2D,KACNu2D,EAAGtpB,KAAK7/C,EAAAC,MAAM45C,aACnBz3B,GACF9oB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,QAAS,aAGhByD,GAASpB,EAAApE,YAAYk+C,UACrBw0B,EAAclF,EAAGpsB,SACjBuxB,EAAYnF,EAAGv2D,KAGjB,IAAI27D,EAAc,EACdC,EAAY,EACZC,EAAgB,EAChBC,EAAc,EACdvF,EAAGtpB,KAAK7/C,EAAAC,MAAMyT,SACZ0O,GACF9oB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,QAAS,UAGhByD,GAASpB,EAAApE,YAAY+X,OACrB66D,EAAcpF,EAAGpsB,SACjByxB,EAAYrF,EAAGv2D,MAEfzR,GAASpB,EAAApE,YAAY0sB,SACjB8gD,EAAGtpB,KAAK7/C,EAAAC,MAAMuiB,YACZJ,GACF9oB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,QAAS,YAGhByD,GAASpB,EAAApE,YAAY6mB,SACrBisD,EAAgBtF,EAAGpsB,SACnB2xB,EAAcvF,EAAGv2D,KAEf1R,EAAOC,MAAQpB,EAAApE,YAAY6jB,UAASre,GAASpB,EAAApE,YAAYixD,kBAG/D,IAAI+hB,EAAqB,EACrBC,EAAmB,EACnBzF,EAAGtpB,KAAK7/C,EAAAC,MAAMsiB,YAChBphB,GAASpB,EAAApE,YAAY4mB,SACrBosD,EAAgBxF,EAAGpsB,SACnB6xB,EAAczF,EAAGv2D,KAInB,IA+DI1Y,EA/DA6lD,EAAQopB,EAAGrpB,OACX2J,GAAgB,EAChB9lC,GAAW,EAGX8pD,GAAW,EACXhkC,EAAgB,EAChBolC,EAAc,EAyDlB,GAxDKzsD,IACC+mD,EAAGtpB,KAAK7/C,EAAAC,MAAM8hB,KACZonD,EAAG5pB,MAAK,EAAMv/C,EAAAq4C,mBAAmB8G,SAAWn/C,EAAAC,MAAMU,YAAewoE,EAAGjsB,mBAYtEisB,EAAGhpB,MAAMJ,IAXT5+C,GAASpB,EAAApE,YAAYomB,IACrB4B,GAAW,EACX8lB,EAAW0/B,EAAGpsB,SACd8xB,EAAS1F,EAAGv2D,IACRzR,EAAQpB,EAAApE,YAAY4mB,UACtBjpB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAMixE,EAAeC,GAAc,aAMnCzF,EAAGtpB,KAAK7/C,EAAAC,MAAM+hB,KACnBmnD,EAAG5pB,MAAK,EAAMv/C,EAAAq4C,mBAAmB8G,SAAWn/C,EAAAC,MAAMU,YAAewoE,EAAGjsB,mBAYtEisB,EAAGhpB,MAAMJ,IAXT5+C,GAASpB,EAAApE,YAAYqmB,IACrByrD,GAAW,EACXhkC,EAAW0/B,EAAGpsB,SACd8xB,EAAS1F,EAAGv2D,IACRzR,EAAQpB,EAAApE,YAAY4mB,UACtBjpB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAMixE,EAAeC,GAAc,aAMnCzF,EAAGtpB,KAAK7/C,EAAAC,MAAMgR,eAEvBw4C,GAAgB,GADhBtoD,GAASpB,EAAApE,YAAYsV,aAETlR,EAAApE,YAAY+X,QACtBpa,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM6wE,EAAaC,GAAY,UAGlCrtE,EAAQpB,EAAApE,YAAY6mB,UACtBlpB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM+wE,EAAeC,GAAc,YAGtCvtE,EAAQpB,EAAApE,YAAY4mB,UACtBjpB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAMixE,EAAeC,GAAc,cAO1CnlB,EACFvvD,EAAO6b,EAAA9U,KAAKuE,4BAA4B2jE,EAAGzrE,aACtC,CACL,IAAMimB,IAAY8pD,GAAatE,EAAGtpB,KAAK7/C,EAAAC,MAAMu+C,aAAc,CAErDr9C,EAAQpB,EAAApE,YAAYm+C,OACtBxgD,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM2wE,EAAaC,GAAY,UAE3BntE,EAAQpB,EAAApE,YAAYk+C,UAC7BvgD,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM2wE,EAAaC,GAAY,aAE3BntE,EAAQpB,EAAApE,YAAYi+C,SAC7BtgD,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM2wE,EAAaC,GAAY,aAGlCntE,EAAQpB,EAAApE,YAAY+X,QACtBpa,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM6wE,EAAaC,GAAY,UAGlCrtE,EAAQpB,EAAApE,YAAY6mB,UACtBlpB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM+wE,EAAeC,GAAc,YAGtCvtE,EAAQpB,EAAApE,YAAY4mB,UACtBjpB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAMixE,EAAeC,GAAc,YAG1C,IAAIE,EAAWx1E,KAAKy1E,+BAA+B5F,EAAI5/D,GACvD,OAAKulE,GACL3F,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPywB,GAFe,KAIxB,IAAK3F,EAAGvpB,iBAKN,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KAETxD,EAAO6b,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAEjE,IAAI0L,EAA6C,KACjD,GAAI+/D,EAAGtpB,KAAK7/C,EAAAC,MAAMs6C,UAAW,CAC3B,IAAIy0B,EAAsB7F,EAAGpsB,SAE7B,KADA3zC,EAAiB9P,KAAK+yE,oBAAoBlD,IACrB,OAAO,KACxB1f,EACFnwD,KAAKuG,MACHgW,EAAAzY,eAAe6xE,2DACf9F,EAAGzrE,MAAMsxE,EAAqB7F,EAAGv2D,MAE1B+Q,GAAY8pD,EACrBn0E,KAAKuG,MACHgW,EAAAzY,eAAe8xE,wCACf/F,EAAGzrE,MAAMsxE,EAAqB7F,EAAGv2D,MAGnCzR,GAASpB,EAAApE,YAAY6jB,QAKzB,GAAI2pD,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAAY,CAC5B,IAAIgwB,EAAiBrE,EAAGpsB,SACpBp6C,EAAarJ,KAAKqzE,gBAAgBxD,EAAI1f,GAC1C,IAAK9mD,EAAY,OAAO,KACxB,IAAI4lB,EAAWjvB,KAAK2vE,oBACpB,GAAIxf,EACF,IAAK,IAAI9vD,EAAI,EAAGwK,EAAIxB,EAAW/D,OAAQjF,EAAIwK,IAAKxK,EAAG,CACjD,IAAIyxE,EAAYzoE,EAAWhJ,GAC3B,GAAIyxE,EAAU7pE,MACZxB,EAAApE,YAAYm+C,OACZ/5C,EAAApE,YAAYk+C,UACZ95C,EAAApE,YAAYi+C,QACZ75C,EAAApE,YAAY4mB,UACX,CACD,IAAInT,EAA2B2G,EAAA9U,KAAKgL,uBAClCm/D,EAAUlxE,KACVkxE,EAAUxpE,KACV,KACA,KACAwpE,EAAUjqE,MAAQpB,EAAApE,YAAY0sB,SAC9B+iD,EAAU1tE,OAEZ0R,EAAyBqF,eAAiB9a,EAC1CyV,EAAyBlO,OAASA,EAClCkqE,EAAUh8D,yBAA2BA,EACrClO,EAAOoI,QAAQnK,KAAKiQ,SAGfuU,EACLhhB,EAAW/D,QACbtF,KAAKuG,MACHgW,EAAAzY,eAAewwE,sCACf1zE,EAAKwD,OAGA+vE,IACgB,GAArB9qE,EAAW/D,QACbtF,KAAKuG,MACHgW,EAAAzY,eAAeswE,+CACfxzE,EAAKwD,OAGLiF,EAAW/D,QAAU+D,EAAW,GAAGJ,aACrCjJ,KAAKuG,MACHgW,EAAAzY,eAAeuwE,oDACfzzE,EAAKwD,QAKX,IAAIkF,EAAoC,KACxC,GAAIumE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,QAahB,GAZIlkD,EAAKmG,MAAQ0V,EAAA5V,SAAS8Q,YACxB3X,KAAKuG,MACHgW,EAAAzY,eAAe+xE,2DACfhG,EAAGzrE,SAEI+vE,GACTn0E,KAAKuG,MACHgW,EAAAzY,eAAegyE,oDACfjG,EAAGzrE,WAGPkF,EAAatJ,KAAKqxE,UAAUxB,EAAIjvE,EAAKmG,MAAQ0V,EAAA5V,SAAS8Q,aAAew8D,IACpD,OAAO,UAExB7qE,EAAamT,EAAA9U,KAAKc,kBAAkBonE,EAAGzrE,MAAMyrE,EAAGv2D,MAC3C66D,GAAYvzE,EAAKmG,MAAQ0V,EAAA5V,SAAS8Q,aACrC3X,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfplD,EAAWlF,OAKjB,IAAI6O,EAAYwJ,EAAA9U,KAAKyB,gBACnBC,EACAC,EACA2lB,GACA,EACA4gD,EAAGzrE,MAAM8vE,EAAgBrE,EAAGv2D,MAG1BpG,EAAyB,KAC7B,GAAI28D,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,YAahB,GAZIv9C,EAAQpB,EAAApE,YAAY8jB,QACtBnmB,KAAKuG,MACHgW,EAAAzY,eAAemsD,yDACf4f,EAAGzrE,SAEIyD,EAAQpB,EAAApE,YAAY6mB,UAC7BlpB,KAAKuG,MACHgW,EAAAzY,eAAeiyE,qEACflG,EAAGzrE,QAASxD,EAAKwE,QAGrB8N,EAAOlT,KAAKu0E,oBAAoB1E,GAAI,IACzB,OAAO,UACPhoE,EAAQpB,EAAApE,YAAY8jB,SAAa2C,GAC5C9oB,KAAKuG,MACHgW,EAAAzY,eAAeosD,gFACf2f,EAAGzrE,SAIP,IAAI4xE,EAAYv5D,EAAA9U,KAAK6L,wBACnB5S,EACAkP,EACAmD,EACAC,EACAjD,EACApI,EACAgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGxB,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPixB,EAEF,GAAI7lB,EACTnwD,KAAKuG,MACHgW,EAAAzY,eAAemyE,sCACfr1E,EAAKwD,WAGF,KAAIimB,IAAY8pD,EAOhB,CACDtsE,EAAQpB,EAAApE,YAAY6mB,UACtBlpB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM+wE,EAAeC,GAAc,YAItCvtE,EAAQpB,EAAApE,YAAYomB,KACtBzoB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MApRW,EACF,GAmRgB,OAI5ByD,EAAQpB,EAAApE,YAAYqmB,KACtB1oB,KAAKuG,MACHgW,EAAAzY,eAAemtE,gCACfpB,EAAGzrE,MAAM+rC,EAAUolC,GAAS,OAIhC,IAAIjtE,EAA8B,KAUlC,GATIunE,EAAGtpB,KAAK7/C,EAAAC,MAAMs+C,WAChBjlD,KAAKuG,MACHgW,EAAAzY,eAAeoyE,sCACfrG,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGtBu2D,EAAGtpB,KAAK7/C,EAAAC,MAAM07C,eAChBx6C,GAASpB,EAAApE,YAAYowE,qBAEnB5C,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,QAEhB,KADAx8C,EAAOtI,KAAKqxE,UAAUxB,IACX,OAAO,UAElB7vE,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfmhB,EAAGzrE,SAGP,IAAI6E,EAAiC,KACrC,GAAI4mE,EAAGtpB,KAAK7/C,EAAAC,MAAM87C,WAChBx5C,EAAcjJ,KAAK2yE,gBAAgB9C,IACjB,OAAO,KAE3B,IAAIzrE,EAAQyrE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,KAC7BzR,EAAQpB,EAAApE,YAAYowE,sBAA0B5qE,EAAQpB,EAAApE,YAAY+X,QAAW0O,GAAe7f,IAC/FjJ,KAAKuG,MACHgW,EAAAzY,eAAe8uE,iEACfxuE,GAGJ,IAAI+xE,EAAW15D,EAAA9U,KAAKgL,uBAClB/R,EACA0H,EACAW,EACAgH,EACApI,EACAzD,GAGF,OADAyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPoxB,EApEPn2E,KAAKuG,MACHgW,EAAAzY,eAAeosD,gFACftvD,EAAKwD,OAoET,OAAO,MAGTkrE,EAAArtE,UAAAwzE,+BAAA,SAA+B5F,EAAe5/D,GAIxCA,EAAW3K,QACbtF,KAAKuG,MACHgW,EAAAzY,eAAeotE,8BACfxqE,EAAAE,MAAMd,KAAKmK,EAAW,GAAG7L,MAAO6L,EAAWA,EAAW3K,OAAS,GAAGlB,QAItE,IAAImB,EAAQsqE,EAAGpsB,SACf,GAAIosB,EAAGvpB,iBAEL,GAAU,OADDupB,EAAG/oB,iBAEV,GAAI+oB,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAAQ,CACxB,IAAIzxC,EAAUrT,KAAKqxE,UAAUxB,GAC7B,IAAKx8D,EAAS,OAAO,KACrB,GAAIA,EAAQtM,MAAQ0V,EAAA5V,SAAS6O,KAK3B,OAJA1V,KAAKuG,MACHgW,EAAAzY,eAAe4qD,cACfmhB,EAAGzrE,SAEE,KAET,GAAIyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMw+C,cAAe,CAC/B,GAAI0qB,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAAQ,CACxB,IAAIxxC,EAAYtT,KAAKqxE,UAAUxB,GAC/B,OAAKv8D,EACEmJ,EAAA9U,KAAKyL,gCAA0CC,EAASC,EAAWu8D,EAAGzrE,MAAMmB,EAAOsqE,EAAGv2D,MADtE,KAGvBtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,YAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGP,OAAO,MAGTkrE,EAAArtE,UAAA2uE,eAAA,SACEf,EACAhoE,EACAoI,EACA8/D,GAKA,GAAIF,EAAGvpB,iBAAkB,CACvB,IAAIz2C,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACzE,GAAIyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAAY,CAS5B,IARA,IAAIp1C,EAAU,IAAI7J,MACdzE,EAAK+a,EAAA9U,KAAK+L,2BACZ7D,EACAG,EACAC,EACApI,EACAgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAEhBu2D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CACjC,IAAI/qC,EAASta,KAAK8vE,uBAAuBD,EAAInuE,GAC7C,IAAK4Y,EAAQ,OAAO,KACpBA,EAAO1S,OAASlG,EAChBsO,EAAQnK,KAAKyU,GAGf,OADAu1D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPrjD,EAEP1B,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGP,OAAO,MAGTkrE,EAAArtE,UAAA+uE,YAAA,SACEnB,EACAhoE,EACAkoE,GAKA,IAAIh/D,EAAuC,KAC3C,GAAI8+D,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAAY,CAE5B,IADA,IAAIp1C,EAAU,IAAI7J,OACV0pE,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CAC/B,IAAI/qC,EAASta,KAAKo2E,kBAAkBvG,GACpC,IAAKv1D,EAAQ,OAAO,KAEtB,GADEtK,EAAQnK,KAAKyU,IACVu1D,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,YAChB,MAMA,OAJArlD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAIb,GAAIyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMk5C,MAAO,CACvB,IAAIgwB,EAAGtpB,KAAK7/C,EAAAC,MAAMs9C,eAOhB,OAJAjkD,KAAKuG,MACHgW,EAAAzY,eAAemmB,wBACf4lD,EAAGzrE,SAEE,KANP2M,EAAO0L,EAAA9U,KAAK8G,8BAA8BohE,EAAG58B,aAAc48B,EAAGzrE,SAgBlE,OALqB,QADjBgN,GADAuhC,EAAMl2B,EAAA9U,KAAKmJ,sBAAsBd,EAASe,EAAMlJ,EAAOgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAC1DlI,eACOpR,KAAKwvE,QAAQ7pD,IAAIvU,KAC7CpR,KAAKuvE,QAAQ1pE,KAAKuL,GAClBpR,KAAKwvE,QAAQ5jD,IAAIxa,IAEnBy+D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EACF,GAAIk9B,EAAGtpB,KAAK7/C,EAAAC,MAAM+6C,UACvB,GAAImuB,EAAGtpB,KAAK7/C,EAAAC,MAAMk5C,MAAO,CACvB,GAAIgwB,EAAGtpB,KAAK7/C,EAAAC,MAAMs9C,eAAgB,CAChClzC,EAAO0L,EAAA9U,KAAK8G,8BAA8BohE,EAAG58B,aAAc48B,EAAGzrE,SAC9D,IAAIuuC,EAAMl2B,EAAA9U,KAAKmJ,sBAAsB,KAAMC,EAAMlJ,EAAOgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAC1ElI,EAAe3N,OAAOkvC,EAAIvhC,cAC1BtM,EAAS+qE,EAAG/qE,OAQhB,OAPKA,EAAOsU,cAAatU,EAAOsU,YAAc,IAAIuS,KAClD7mB,EAAOsU,YAAYwS,IAAIxa,GAClBpR,KAAKwvE,QAAQ7pD,IAAIvU,KACpBpR,KAAKuvE,QAAQ1pE,KAAKuL,GAClBpR,KAAKwvE,QAAQ5jD,IAAIxa,IAEnBy+D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAEP3yC,KAAKuG,MACHgW,EAAAzY,eAAemmB,wBACf4lD,EAAGzrE,cAIPpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,aAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGhB,OAAO,MAGTkrE,EAAArtE,UAAAm0E,kBAAA,SACEvG,GAKA,GAAIA,EAAGvpB,iBAAkB,CACvB,IAAIz2C,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACrEiyE,EAA4C,KAChD,GAAIxG,EAAGtpB,KAAK7/C,EAAAC,MAAMs4C,IAAK,CACrB,IAAI4wB,EAAGvpB,eAAe5/C,EAAAq4C,mBAAmB6G,QAOvC,OAJA5lD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KANPiyE,EAAe55D,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAS3E,OAAOqY,EAAA9U,KAAK8J,mBACV5B,EACAwmE,EACAA,EACI3vE,EAAAE,MAAMd,KAAK+J,EAAWzL,MAAOiyE,EAAajyE,OAC1CyL,EAAWzL,OAQnB,OALEpE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGA,MAGTkrE,EAAArtE,UAAA6uE,YAAA,SACEjB,GAOA,IAAIE,EAAWF,EAAGpsB,SACdzzC,EAAsC,KACtCqC,EAA6C,KAC7CikE,GAAW,EACf,GAAIzG,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAEhB,IADAp1C,EAAU,IAAI7J,OACN0pE,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CACjC,IAAI/qC,EAASta,KAAKu2E,uBAAuB1G,GACzC,IAAKv1D,EAAQ,OAAO,KAEpB,GADAtK,EAAQnK,KAAKyU,IACRu1D,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,YAChB,MAMA,OAJArlD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,WAIR,GAAIyrE,EAAGtpB,KAAK7/C,EAAAC,MAAM+6C,UAAW,CAClC,IAAImuB,EAAGtpB,KAAK7/C,EAAAC,MAAMs4C,IAehB,OAJAj/C,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,MAEP,KAdP,IAAIyrE,EAAGvpB,iBAOL,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KANPiO,EAAgBoK,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,cAgB5EkyE,GAAW,EAGb,GAAIA,GAAYzG,EAAGtpB,KAAK7/C,EAAAC,MAAMk5C,MAAO,CACnC,GAAIgwB,EAAGtpB,KAAK7/C,EAAAC,MAAMs9C,eAAgB,CAChC,IAAIlzC,EAAO0L,EAAA9U,KAAK8G,8BAA8BohE,EAAG58B,aAAc48B,EAAGzrE,SAC9DuuC,OAAG,EACHtgC,GACF5O,QAAQuM,GACR2iC,EAAMl2B,EAAA9U,KAAK2K,kCAAkCD,EAAetB,EAAM8+D,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAExFq5B,EAAMl2B,EAAA9U,KAAKsK,sBAAsBjC,EAASe,EAAM8+D,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExE,IAAIlI,EAAeuhC,EAAIvhC,aAMvB,OALKpR,KAAKwvE,QAAQ7pD,IAAIvU,KACpBpR,KAAKuvE,QAAQ1pE,KAAKuL,GAClBpR,KAAKwvE,QAAQ5jD,IAAIxa,IAEnBy+D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAEP3yC,KAAKuG,MACHgW,EAAAzY,eAAemmB,wBACf4lD,EAAGzrE,cAIPpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,QAGhB,OAAO,MAGTkrE,EAAArtE,UAAAs0E,uBAAA,SACE1G,GAKA,GAAIA,EAAGvpB,eAAe5/C,EAAAq4C,mBAAmB6G,QAAS,CAChD,IAAI/1C,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACrEiyE,EAA4C,KAChD,GAAIxG,EAAGtpB,KAAK7/C,EAAAC,MAAMs4C,IAAK,CACrB,IAAI4wB,EAAGvpB,iBAOL,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KANPiyE,EAAe55D,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAS3E,OAAOqY,EAAA9U,KAAK4K,wBACV1C,EACAwmE,EACAA,EACI3vE,EAAAE,MAAMd,KAAK+J,EAAWzL,MAAOiyE,EAAajyE,OAC1CyL,EAAWzL,OAQnB,OALEpE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGA,MAGTkrE,EAAArtE,UAAA4uE,kBAAA,SACEhB,EACAE,GAKA,GAAIF,EAAGvpB,iBAAkB,CACvB,IAAI+vB,EAAe55D,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAC3E,GAAIyrE,EAAGtpB,KAAK7/C,EAAAC,MAAM87C,QAAS,CACzB,GAAIotB,EAAGvpB,iBAAkB,CACvB,IAAIz2C,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SACrEuuC,EAAMl2B,EAAA9U,KAAK2J,4BAA4BzB,EAAYwmE,EAAcxG,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAE3F,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAEP3yC,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,cAIPpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGP,OAAO,MAGTkrE,EAAArtE,UAAAyuE,eAAA,SACEb,EACA2G,QAAA,IAAAA,OAAA,GAKA,IAAI/vB,EAAQopB,EAAGrpB,OAEXl2C,EAA8B,KAClC,OAFYu/D,EAAGzrD,QAGb,KAAK1d,EAAAC,MAAM8T,MACTnK,EAAYtQ,KAAKy2E,WAAW5G,GAC5B,MAEF,KAAKnpE,EAAAC,MAAM0lB,MACT/b,EAAYtQ,KAAKwwE,cAAcX,EAAIppE,EAAApE,YAAYgqB,MAAO,KAAMwjD,EAAGpsB,UAC/D,MAEF,KAAK/8C,EAAAC,MAAM+T,SACTpK,EAAYtQ,KAAK02E,cAAc7G,GAC/B,MAEF,KAAKnpE,EAAAC,MAAMgU,GACTrK,EAAYtQ,KAAK22E,iBAAiB9G,GAClC,MAEF,KAAKnpE,EAAAC,MAAMyU,IACT9K,EAAYtQ,KAAK42E,kBAAkB/G,GACnC,MAEF,KAAKnpE,EAAAC,MAAM0U,GACT/K,EAAYtQ,KAAK62E,iBAAiBhH,GAClC,MAEF,KAAKnpE,EAAAC,MAAMu5C,IACT5vC,EAAYtQ,KAAKwwE,cAAcX,EAAIppE,EAAApE,YAAY69C,IAAK,KAAM2vB,EAAGpsB,UAC7D,MAEF,KAAK/8C,EAAAC,MAAM+5C,IACTpwC,EAAYtQ,KAAKwwE,cAAcX,EAAIppE,EAAApE,YAAYyF,KAAM,KAAM+nE,EAAGpsB,UAC9D,MAEF,KAAK/8C,EAAAC,MAAMy+C,UACT90C,EAAYtQ,KAAKu0E,oBAAoB1E,EAAI2G,GACzC,MAEF,KAAK9vE,EAAAC,MAAM8U,OACL+6D,GACFx2E,KAAKuG,MACHgW,EAAAzY,eAAegzE,2DACfjH,EAAGzrE,SAGPkM,EAAYtQ,KAAK8yE,YAAYjD,GAC7B,MAEF,KAAKnpE,EAAAC,MAAMo+C,UACT,OAAOtoC,EAAA9U,KAAK6I,qBAAqBq/D,EAAGzrE,MAAMyrE,EAAGpsB,WAE/C,KAAK/8C,EAAAC,MAAMgV,OACTrL,EAAYtQ,KAAK+2E,qBAAqBlH,GACtC,MAEF,KAAKnpE,EAAAC,MAAMiV,MACTtL,EAAYtQ,KAAKg3E,oBAAoBnH,GACrC,MAEF,KAAKnpE,EAAAC,MAAMkV,IACTvL,EAAYtQ,KAAKi3E,kBAAkBpH,GACnC,MAEF,KAAKnpE,EAAAC,MAAMqV,KACT1L,EAAYtQ,KAAKk3E,mBAAmBrH,GACpC,MAEF,KAAKnpE,EAAAC,MAAMsV,MACT3L,EAAYtQ,KAAKm3E,oBAAoBtH,GACrC,MAEF,KAAKnpE,EAAAC,MAAM+O,KACT,GAAIm6D,EAAG5pB,MAAK,EAAOv/C,EAAAq4C,mBAAmB8G,SAAWn/C,EAAAC,MAAMU,WAAY,CACjEiJ,EAAYtQ,KAAK+wE,qBAAqBlB,EAAIppE,EAAApE,YAAYyF,KAAM,KAAM+nE,EAAGpsB,UACrE,MAIJ,QACEosB,EAAGhpB,MAAMJ,GACTn2C,EAAYtQ,KAAKo3E,yBAAyBvH,GAU9C,OANKv/D,EAIHu/D,EAAGjpB,QAAQH,IAHXopB,EAAGhpB,MAAMJ,GACTzmD,KAAKiwE,cAAcJ,IAIdv/D,GAGTg/D,EAAArtE,UAAAsyE,oBAAA,SACE1E,EACA2G,GAOA,IAFA,IAAIzG,EAAWF,EAAGpsB,SACdl0C,EAAa,IAAIpJ,OACb0pE,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CACjC,IAAIoB,EAAQopB,EAAGrpB,OACXl2C,EAAYtQ,KAAK0wE,eAAeb,EAAI2G,GACxC,GAAKlmE,EAKHu/D,EAAGjpB,QAAQH,GACXl3C,EAAW1J,KAAKyK,OANF,CACd,GAAIu/D,EAAG/uB,OAASp6C,EAAAC,MAAMq/C,UAAW,OAAO,KACxC6pB,EAAGhpB,MAAMJ,GACTzmD,KAAKiwE,cAAcJ,IAMvB,IAAIl9B,EAAMl2B,EAAA9U,KAAK2H,qBAAqBC,EAAYsgE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEtE,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAAw0E,WAAA,SACE5G,GAKA,IAAIhgE,EAA0C,KAC1CggE,EAAG5pB,MAAK,IAASv/C,EAAAC,MAAMU,YAAewoE,EAAGjsB,qBAC3CisB,EAAGzrD,KAAK1d,EAAAq4C,mBAAmB8G,QAC3Bh2C,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,UAEvE,IAAIuuC,EAAMl2B,EAAA9U,KAAK8H,qBAAqBI,EAAYggE,EAAGzrE,SAEnD,OADAyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAAy0E,cAAA,SACE7G,GAKA,IAAIhgE,EAA0C,KAC1CggE,EAAG5pB,MAAK,IAASv/C,EAAAC,MAAMU,YAAewoE,EAAGjsB,qBAC3CisB,EAAGzrD,KAAK1d,EAAAq4C,mBAAmB8G,QAC3Bh2C,EAAa4M,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,UAEvE,IAAIuuC,EAAMl2B,EAAA9U,KAAKwI,wBAAwBN,EAAYggE,EAAGzrE,SAEtD,OADAyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAA00E,iBAAA,SACE9G,GAKA,IAAIE,EAAWF,EAAGpsB,SACdnzC,EAAYtQ,KAAK0wE,eAAeb,GACpC,IAAKv/D,EAAW,OAAO,KAEvB,GAAIu/D,EAAGtpB,KAAK7/C,EAAAC,MAAMsV,OAEhB,GAAI4zD,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAAY,CAC5B,IAAI71C,EAAYrO,KAAK2yE,gBAAgB9C,GACrC,IAAKxhE,EAAW,OAAO,KAEvB,GAAIwhE,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAAa,CAC7B,IAAIxR,EAAMl2B,EAAA9U,KAAK0I,kBAA6BC,EAAuBjC,EAAWwhE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEpG,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAEP3yC,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,SAGhB,OAAO,MAGTkrE,EAAArtE,UAAAm1E,yBAAA,SACEvH,GAKA,IAAIxlE,EAAOrK,KAAK2yE,gBAAgB9C,GAChC,IAAKxlE,EAAM,OAAO,KAElB,IAAIsoC,EAAMl2B,EAAA9U,KAAKgK,0BAA0BtH,GAEzC,OADAwlE,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAA20E,kBAAA,SACE/G,GAKA,IAAIE,EAAWF,EAAGpsB,SAElB,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAAY,CAC5B,IAAIj7C,EAAgC,KAEpC,GAAI4mE,EAAGtpB,KAAK7/C,EAAAC,MAAM0lB,OAChBpjB,EAAcjJ,KAAKwwE,cAAcX,EAAIppE,EAAApE,YAAYgqB,MAAO,KAAMwjD,EAAGpsB,eAC5D,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAMu5C,KACvBj3C,EAAcjJ,KAAKwwE,cAAcX,EAAIppE,EAAApE,YAAY69C,IAAK,KAAM2vB,EAAGpsB,eAC1D,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAM+5C,KACvBz3C,EAAcjJ,KAAKwwE,cAAcX,EAAIppE,EAAApE,YAAYyF,KAAM,KAAM+nE,EAAGpsB,eAE3D,IAAKosB,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,cACxB97C,EAAcjJ,KAAKo3E,yBAAyBvH,IAC1B,OAAO,KAG3B,GAAIA,EAAG/uB,OAASp6C,EAAAC,MAAMo+C,UAAW,CAC/B,IAAI12C,EAAwC,KAC5C,IAAKwhE,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,cACjB12C,EAAYrO,KAAKo3E,yBAAyBvH,IAC1B,OAAO,KAGzB,GAAIA,EAAG/uB,OAASp6C,EAAAC,MAAMo+C,UAAW,CAC/B,IAAIjyC,EAAiC,KACrC,IAAK+8D,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAAa,CAE9B,KADArxC,EAAc9S,KAAK2yE,gBAAgB9C,IACjB,OAAO,KAEzB,IAAKA,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAKjB,OAJAnkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAIX,IAAIkM,EAAYtQ,KAAK0wE,eAAeb,GACpC,OAAKv/D,EAEEmM,EAAA9U,KAAKkL,mBACV5J,EACAoF,EACIA,EAAUpD,WACV,KACJ6H,EACAxC,EACAu/D,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MATD,KAavBtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGhB,OAAO,MAGTkrE,EAAArtE,UAAA40E,iBAAA,SACEhH,GAKA,IAAIE,EAAWF,EAAGpsB,SAClB,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAAY,CAC5B,IAAI71C,EAAYrO,KAAK2yE,gBAAgB9C,GACrC,IAAKxhE,EAAW,OAAO,KACvB,GAAIwhE,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAAa,CAC7B,IAAI7zC,EAAYtQ,KAAK0wE,eAAeb,GACpC,IAAKv/D,EAAW,OAAO,KACvB,IAAI+mE,EAAkC,KACtC,OAAIxH,EAAGtpB,KAAK7/C,EAAAC,MAAM+4C,SAChB23B,EAAgBr3E,KAAK0wE,eAAeb,IACT,KAEtBpzD,EAAA9U,KAAKkK,kBACVxD,EACAiC,EACA+mE,EACAxH,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGxBtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGhB,OAAO,MAGTkrE,EAAArtE,UAAA80E,qBAAA,SACElH,GAKA,IAAIE,EAAWF,EAAGpsB,SAClB,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAAY,CAC5B,IAAI71C,EAAYrO,KAAK2yE,gBAAgB9C,GACrC,IAAKxhE,EAAW,OAAO,KACvB,GAAIwhE,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAAa,CAC7B,GAAI0rB,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAAY,CAE5B,IADA,IAAIrxC,EAAQ,IAAI5N,OACR0pE,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CACjC,IAAIiyB,EAAQt3E,KAAKu3E,gBAAgB1H,GACjC,IAAKyH,EAAO,OAAO,KACnBvjE,EAAMlO,KAAiByxE,GAEzB,IAAI3kC,EAAMl2B,EAAA9U,KAAKmM,sBAAsBzF,EAAW0F,EAAO87D,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAE7E,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAEP3yC,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGhB,OAAO,MAGTkrE,EAAArtE,UAAAs1E,gBAAA,SACE1H,GAGA,IACItgE,EACAe,EAFAy/D,EAAWF,EAAGpsB,SAMlB,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAMy4C,MAAO,CACvB,IAAI1vC,EAAQ1P,KAAK2yE,gBAAgB9C,GACjC,IAAKngE,EAAO,OAAO,KACnB,GAAImgE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAAQ,CAExB,IADAv1C,EAAa,IAAIpJ,MACV0pE,EAAG5pB,QAAUv/C,EAAAC,MAAMy4C,MAAQywB,EAAGnsB,WAAah9C,EAAAC,MAAM64C,SAAWqwB,EAAGnsB,WAAah9C,EAAAC,MAAM0+C,YAAY,CAEnG,KADA/0C,EAAYtQ,KAAK0wE,eAAeb,IAChB,OAAO,KACvBtgE,EAAW1J,KAAKyK,GAElB,OAAOmM,EAAA9U,KAAKsM,iBAAiBvE,EAAOH,EAAYsgE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEtEtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAMX,GAAIyrE,EAAGtpB,KAAK7/C,EAAAC,MAAM64C,SAAU,CACjC,GAAIqwB,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAAQ,CAExB,IADAv1C,EAAa,IAAIpJ,MACV0pE,EAAG5pB,QAAUv/C,EAAAC,MAAMy4C,MAAQywB,EAAGnsB,WAAah9C,EAAAC,MAAM64C,SAAWqwB,EAAGnsB,WAAah9C,EAAAC,MAAM0+C,YAAY,CAEnG,KADA/0C,EAAYtQ,KAAK0wE,eAAeb,IAChB,OAAO,KACvBtgE,EAAW1J,KAAKyK,GAElB,OAAOmM,EAAA9U,KAAKsM,iBAAiB,KAAM1E,EAAYsgE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAErEtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe0zE,0BACf3H,EAAGzrE,SAGP,OAAO,MAGTkrE,EAAArtE,UAAA+0E,oBAAA,SACEnH,GAKA,IAAIE,EAAWF,EAAGpsB,SACdx4C,EAAajL,KAAK2yE,gBAAgB9C,GACtC,IAAK5kE,EAAY,OAAO,KACxB,IAAI0nC,EAAMl2B,EAAA9U,KAAKwM,qBAAiClJ,EAAY4kE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAElF,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAAg1E,kBAAA,SACEpH,GAQA,IACIjmE,EADAmmE,EAAWF,EAAGpsB,SAElB,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAAY,CAE5B,IADA,IAAI71C,EAAa,IAAIpJ,OACb0pE,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CAEjC,KADAz7C,EAAO5J,KAAK0wE,eAAeb,IAChB,OAAO,KAClBtgE,EAAW1J,KAAgB+D,GAE7B,IAAI0K,EAA6C,KAC7CC,EAAsC,KACtCC,EAAwC,KAC5C,GAAIq7D,EAAGtpB,KAAK7/C,EAAAC,MAAM04C,OAAQ,CACxB,IAAKwwB,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAKjB,OAJAlkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAET,IAAKyrE,EAAGvpB,iBAKN,OAJAtmD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,KAGT,GADAkQ,EAAgBmI,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,UACnEyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAKjB,OAJAnkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAET,IAAKyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAKjB,OAJAplD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAGT,IADAmQ,MACQs7D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CAEjC,KADAz7C,EAAO5J,KAAK0wE,eAAeb,IAChB,OAAO,KAClBt7D,EAAgB1O,KAAgB+D,IAGpC,GAAIimE,EAAGtpB,KAAK7/C,EAAAC,MAAMi5C,SAAU,CAC1B,IAAKiwB,EAAGtpB,KAAK7/C,EAAAC,MAAMy+C,WAKjB,OAJAplD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAGT,IADAoQ,MACQq7D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CAEjC,KADAz7C,EAAO5J,KAAK0wE,eAAeb,IAChB,OAAO,KAClBr7D,EAAkB3O,KAAgB+D,IAGtC,IAAM2K,IAAmBC,EAKvB,OAJAxU,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,SAEP,KAET,IAAIuuC,EAAMl2B,EAAA9U,KAAK0M,mBACb9E,EACA+E,EACAC,EACAC,EACAq7D,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGxB,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAOT,OALE3yC,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGT,MAGTkrE,EAAArtE,UAAA8uE,qBAAA,SACElB,EACAhoE,EACAoI,EACA8/D,GAKA,GAAIF,EAAGvpB,iBAAkB,CACvB,IAAI1lD,EAAO6b,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,SAC/D0L,EAA6C,KACjD,GAAI+/D,EAAGtpB,KAAK7/C,EAAAC,MAAMs6C,UAAW,CAE3B,KADAnxC,EAAiB9P,KAAK+yE,oBAAoBlD,IACrB,OAAO,KAC5BhoE,GAASpB,EAAApE,YAAY6jB,QAEvB,GAAI2pD,EAAGtpB,KAAK7/C,EAAAC,MAAM87C,QAAS,CACzB,IAAIn6C,EAAOtI,KAAKqxE,UAAUxB,GAC1B,IAAKvnE,EAAM,OAAO,KAClB,IAAIqqC,EAAMl2B,EAAA9U,KAAK+M,sBACb9T,EACAkP,EACAxH,EACA2H,EACApI,EACAgoE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGxB,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAEP3yC,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAGP,OAAO,MAGTkrE,EAAArtE,UAAAi1E,mBAAA,SACErH,GAKA,IAAIE,EAAWF,EAAGpsB,SACdx4C,EAAajL,KAAK2yE,gBAAgB9C,EAAE,IACxC,IAAK5kE,EAAY,OAAO,KACxB,IAAI0nC,EAAMl2B,EAAA9U,KAAKsN,oBAAoBhK,EAAY4kE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAErE,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,GAGT28B,EAAArtE,UAAAk1E,oBAAA,SACEtH,GAKA,IAAIE,EAAWF,EAAGpsB,SAClB,GAAIosB,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WAAY,CAC5B,IAAIj5C,EAAajL,KAAK2yE,gBAAgB9C,GACtC,IAAK5kE,EAAY,OAAO,KACxB,GAAI4kE,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAAa,CAC7B,IAAI7zC,EAAYtQ,KAAK0wE,eAAeb,GACpC,IAAKv/D,EAAW,OAAO,KACvB,IAAIqiC,EAAMl2B,EAAA9U,KAAKwN,qBAAqBlK,EAAYqF,EAAWu/D,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEjF,OADAu2D,EAAGtpB,KAAK7/C,EAAAC,MAAMo+C,WACPpS,EAEP3yC,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,UAIhBpE,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAGhB,OAAO,MAMTkrE,EAAArtE,UAAAw1E,qBAAA,SACE5H,GAGA,IAAI/uB,EAAQ+uB,EAAGzrD,KAAK1d,EAAAq4C,mBAAmB8G,QACnCkqB,EAAWF,EAAGpsB,SACdi0B,EAsqBR,SAAkC3wE,GAChC,OAAQA,GACN,KAAKL,EAAAC,MAAMq6C,YAAa,SACxB,KAAKt6C,EAAAC,MAAMi6C,MAAO,SAClB,KAAKl6C,EAAAC,MAAM07C,YACX,KAAK37C,EAAAC,MAAM27C,MACX,KAAK57C,EAAAC,MAAM4X,KACX,KAAK7X,EAAAC,MAAM8X,MACX,KAAK/X,EAAAC,MAAMk7C,UACX,KAAKn7C,EAAAC,MAAMm7C,YACX,KAAKp7C,EAAAC,MAAM85C,OACX,KAAK/5C,EAAAC,MAAMqV,KACX,KAAKtV,EAAAC,MAAM84C,OAAQ,UACnB,KAAK/4C,EAAAC,MAAMqR,IAAK,UAElB,SArrBmB2/D,CAAyB72B,GAC1C,GAAc,GAAV42B,EAA+B,CACjC,IAAIxoE,OAAO,EAKX,OAAI4xC,GAASp6C,EAAAC,MAAMqR,KACjB9I,EAAUlP,KAAK2yE,gBAAgB9C,EAAE,KAE7B3gE,EAAQnI,MAAQ0V,EAAA5V,SAASS,KACpBmV,EAAA9U,KAAKyF,oBACO8B,EAASjE,WACTiE,EAAS9G,cACT8G,EAASpF,UAC1B+lE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAGxBtZ,KAAKuG,MACHgW,EAAAzY,eAAemkB,wBACf4nD,EAAGzrE,SAGA,MAdc,MAgBrB8K,EAAUlP,KAAK2yE,gBAAgB9C,EAAI6H,KAKjC52B,GAASp6C,EAAAC,MAAMk7C,WAAaf,GAASp6C,EAAAC,MAAMm7C,aAE3C5yC,EAAQnI,MAAQ0V,EAAA5V,SAASQ,YACzB6H,EAAQnI,MAAQ0V,EAAA5V,SAASU,eACzB2H,EAAQnI,MAAQ0V,EAAA5V,SAASW,gBAEzBxH,KAAKuG,MACHgW,EAAAzY,eAAe8zE,0FACf1oE,EAAQ9K,OAIPqY,EAAA9U,KAAKyH,4BAA4B0xC,EAAO5xC,EAAS2gE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAhBvD,KAmBzB,IAAIjP,EAA0B,KAC9B,OAAQy2C,GAEN,KAAKp6C,EAAAC,MAAMM,KAAM,OAAOwV,EAAA9U,KAAK2F,qBAAqBuiE,EAAGzrE,SACrD,KAAKsC,EAAAC,MAAMO,KAAM,OAAOuV,EAAA9U,KAAKoH,qBAAqB8gE,EAAGzrE,SACrD,KAAKsC,EAAAC,MAAMQ,MAAO,OAAOsV,EAAA9U,KAAK6E,sBAAsBqjE,EAAGzrE,SAIvD,KAAKsC,EAAAC,MAAMu9C,UAGT,GAAI2rB,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAChB,OAAOnkD,KAAK00E,8BACV7E,EACApzD,EAAA9U,KAAK4C,gCAAgCslE,EAAGzrE,MAAM2rE,QAE9C,GAGJ,IAAItpB,EAAQopB,EAAGrpB,OACXqxB,GAAQ,EACZ,GACE,OAAQhI,EAAGzrD,KAAK1d,EAAAq4C,mBAAmB8G,SAGjC,KAAKn/C,EAAAC,MAAMq6C,YAET,OADA6uB,EAAGhpB,MAAMJ,GACFzmD,KAAKw0E,wBAAwB3E,GAGtC,KAAKnpE,EAAAC,MAAMU,WAET,OADAwoE,EAAG/oB,iBACK+oB,EAAGzrD,QAGT,KAAK1d,EAAAC,MAAMw9C,WACT,IACG0rB,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,SACd+qB,EAAGtpB,KAAK7/C,EAAAC,MAAMq+C,oBACf,CACA6yB,GAAQ,EACR,MAKJ,KAAKnxE,EAAAC,MAAMm+C,MAET,OADA+qB,EAAGhpB,MAAMJ,GACFzmD,KAAKw0E,wBAAwB3E,GAGtC,KAAKnpE,EAAAC,MAAMs+C,SACT,GACE4qB,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,QACd+qB,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,QACdm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAGd,OADA0rB,EAAGhpB,MAAMJ,GACFzmD,KAAKw0E,wBAAwB3E,GAEtCgI,GAAQ,EACR,MAEF,KAAKnxE,EAAAC,MAAM+Q,MACT,MAIF,QACEmgE,GAAQ,EAIZ,MAGF,QACEA,GAAQ,SAILA,GAKT,OAJAhI,EAAGhpB,MAAMJ,IAGTp8C,EAAOrK,KAAK2yE,gBAAgB9C,IAEvBA,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAOZ1nC,EAAA9U,KAAKiG,8BAA8BvD,EAAMwlE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OANpEtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MANS,KAWpB,KAAKsC,EAAAC,MAAMu+C,YAET,IADA,IAAIv6C,EAAqB,IAAIxE,OACrB0pE,EAAGtpB,KAAK7/C,EAAAC,MAAMw+C,eAAe,CACnC,GAAI0qB,EAAG5pB,QAAUv/C,EAAAC,MAAM+Q,MACrBrN,EAAO,UAGP,KADAA,EAAOrK,KAAK2yE,gBAAgB9C,EAAI,IACrB,OAAO,KAGpB,GADAllE,EAAmB9E,KAAKwE,IACnBwlE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMw+C,cAChB,MAMA,OAJAnlD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAIb,OAAOqY,EAAA9U,KAAK6C,6BAA6BG,EAAoBklE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAGrF,KAAK5S,EAAAC,MAAMy+C,UAKT,IAJA,IAAI0yB,EAAWjI,EAAGpsB,SACdh2C,EAAQ,IAAItH,MACZuH,EAAS,IAAIvH,MACbvF,OAAI,GACAivE,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,aAAa,CACjC,GAAKwqB,EAAGvpB,iBAWN1lD,EAAO6b,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,aAXvC,CACxB,IAAKyrE,EAAGtpB,KAAK7/C,EAAAC,MAAMs9C,eAKjB,OAJAjkD,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACf/B,EAAGzrE,SAEE,MAETxD,EAAO6b,EAAA9U,KAAKe,2BAA2BmnE,EAAG58B,aAAc48B,EAAGzrE,UACtD8D,IAAIzB,EAAApE,YAAY01E,QAKvB,GADAtqE,EAAM5H,KAAKjF,GACPivE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAAQ,CACxB,IAAIxjD,EAAQtB,KAAK2yE,gBAAgB9C,EAAI,GACrC,IAAKvuE,EAAO,OAAO,KACnBoM,EAAO7H,KAAKvE,OACP,IAAKV,EAAKmH,GAAGtB,EAAApE,YAAY01E,QAO9B,OAJA/3E,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KANPsJ,EAAO7H,KAAKjF,GAQd,IAAKivE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAM0+C,YAChB,MAMA,OAJArlD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAIb,OAAOqY,EAAA9U,KAAK6F,8BAA8BC,EAAOC,EAAQmiE,EAAGzrE,MAAM0zE,EAAUjI,EAAGv2D,MAGjF,KAAK5S,EAAAC,MAAMs6C,SACT,IAAI/1C,EAASlL,KAAKqxE,UAAUxB,GAC5B,OAAK3kE,EACA2kE,EAAGtpB,KAAK7/C,EAAAC,MAAMu6C,cAOnB72C,EAAOrK,KAAK2yE,gBAAgB9C,EAAE,KAEvBpzD,EAAA9U,KAAKoD,0BACV0R,EAAAnF,cAAc0gE,OACd3tE,EACAa,EACA2kE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MALN,MAPhBtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MANW,KAiBtB,KAAKsC,EAAAC,MAAMU,WACT,OAAOoV,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEpF,KAAK5S,EAAAC,MAAM2R,KACT,OAAOmE,EAAA9U,KAAKkH,qBAAqBghE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEzD,KAAK5S,EAAAC,MAAMgR,YACT,OAAO8E,EAAA9U,KAAKuE,4BAA4B2jE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEhE,KAAK5S,EAAAC,MAAM0R,MACT,OAAOoE,EAAA9U,KAAKgH,sBAAsBkhE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAE1D,KAAK5S,EAAAC,MAAMs9C,cACT,OAAOxnC,EAAA9U,KAAK8G,8BAA8BohE,EAAG58B,aAAc48B,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAEnF,KAAK5S,EAAAC,MAAMk+C,eACT,OAAOpoC,EAAA9U,KAAKuF,+BAA+B2iE,EAAGloB,cAAekoB,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAErF,KAAK5S,EAAAC,MAAM09C,aACT,OAAO5nC,EAAA9U,KAAK+E,6BAA6BmjE,EAAG7mB,YAAa6mB,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAIjF,KAAK5S,EAAAC,MAAMg7C,MACT,IAAIs2B,EAAgBpI,EAAGvoB,oBACvB,OAAKuoB,EAAGtpB,KAAK7/C,EAAAC,MAAMg7C,OAOZllC,EAAA9U,KAAKqG,8BACViqE,EACApI,EAAGpoB,kBACHooB,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OATtBtZ,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAQX,KAAKsC,EAAAC,MAAMkR,SACT,OAAO7X,KAAKw0E,wBAAwB3E,GAEtC,KAAKnpE,EAAAC,MAAM8Q,MACT,OAAOzX,KAAK60E,qBAAqBhF,GAEnC,QAYE,OAXI/uB,GAASp6C,EAAAC,MAAMq/C,UACjBhmD,KAAKuG,MACHgW,EAAAzY,eAAeojD,uBACf2oB,EAAGzrE,MAAM2rE,IAGX/vE,KAAKuG,MACHgW,EAAAzY,eAAeo0E,oBACfrI,EAAGzrE,SAGA,OAKbkrE,EAAArtE,UAAAk2E,qCAAA,SACEtI,GAKA,IAAIppB,EAAQopB,EAAGrpB,OACf,IAAKqpB,EAAGtpB,KAAK7/C,EAAAC,MAAMs6C,UAAW,OAAO,KACrC,IAAI74C,EAAgB,IAAIjC,MACxB,EAAG,CACD,GAAI0pE,EAAG5pB,SAAWv/C,EAAAC,MAAMu6C,YACtB,MAEF,IAAI54C,EAAOtI,KAAKqxE,UAAUxB,GAAI,GAAM,GACpC,IAAKvnE,EAEH,OADAunE,EAAGhpB,MAAMJ,GACF,KAETr+C,EAAcvC,KAAKyC,SACZunE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,QACvB,OAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMu6C,cAAgB2uB,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,WACvC97C,GAETynE,EAAGhpB,MAAMJ,GACF,OAGT6oB,EAAArtE,UAAAowE,eAAA,SACExC,GAMA,IADA,IAAIlmE,EAAO,IAAIxD,OACP0pE,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,aAAa,CACjC,IAAI95C,EAAOrK,KAAK2yE,gBAAgB9C,EAAI,GACpC,IAAKxlE,EAAM,OAAO,KAElB,GADAV,EAAK9D,KAAKwE,IACLwlE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,OAAQ,CACzB,GAAIm4D,EAAGtpB,KAAK7/C,EAAAC,MAAMw9C,YAChB,MAMA,OAJAnkD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,MAIb,OAAOuF,GAGT2lE,EAAArtE,UAAA0wE,gBAAA,SACE9C,EACA6H,QAAA,IAAAA,MAAA,GAEAj0E,OAAiB,GAAVi0E,GAEP,IAAIrtE,EAAOrK,KAAKy3E,qBAAqB5H,GACrC,IAAKxlE,EAAM,OAAO,KAOlB,IAJA,IACIy2C,EAEAs3B,EAHArI,GAFJ1lE,EAAOrK,KAAKq4E,yBAAyBxI,EAAIxlE,IAErBjG,MAAMmB,MAEtB6e,EAA0B,MAG3Bg0D,EAAiBE,EAAoBx3B,EAAQ+uB,EAAG5pB,UAAYyxB,GAC7D,CAEA,OADA7H,EAAGzrD,OACK08B,GAEN,KAAKp6C,EAAAC,MAAMs4C,GACT,IAAI/zC,EAASlL,KAAKqxE,UAAUxB,GAC5B,IAAK3kE,EAAQ,OAAO,KACpBb,EAAOoS,EAAA9U,KAAKoD,0BACV0R,EAAAnF,cAAc2nC,GACd50C,EACAa,EACA2kE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,MAGF,KAAK5S,EAAAC,MAAMmR,WACT,IAAI9K,EAAShN,KAAKqxE,UAAUxB,GAC5B,IAAK7iE,EAAQ,OAAO,KACpB3C,EAAOoS,EAAA9U,KAAKoF,2BACV1C,EACA2C,EACA6iE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,MAGF,KAAK5S,EAAAC,MAAMu+C,YAET,KADA9gC,EAAOpkB,KAAK2yE,gBAAgB9C,IACjB,OAAO,KAClB,IAAKA,EAAGtpB,KAAK7/C,EAAAC,MAAMw+C,cAKjB,OAJAnlD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAETiG,EAAOoS,EAAA9U,KAAKyE,8BACV/B,EACA+Z,EACAyrD,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,MAGF,KAAK5S,EAAAC,MAAMk7C,UACX,KAAKn7C,EAAAC,MAAMm7C,YAEPz3C,EAAKtD,MAAQ0V,EAAA5V,SAASQ,YACtBgD,EAAKtD,MAAQ0V,EAAA5V,SAASU,eACtB8C,EAAKtD,MAAQ0V,EAAA5V,SAASW,gBAEtBxH,KAAKuG,MACHgW,EAAAzY,eAAe8zE,0FACfvtE,EAAKjG,OAGTiG,EAAOoS,EAAA9U,KAAKsH,6BACV6xC,EACAz2C,EACAwlE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,MAGF,KAAK5S,EAAAC,MAAMs+C,SACT,IAAI32C,EAAStO,KAAK2yE,gBAAgB9C,GAClC,IAAKvhE,EAAQ,OAAO,KACpB,IAAKuhE,EAAGtpB,KAAK7/C,EAAAC,MAAMm+C,OAKjB,OAJA9kD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEP,KAET,IAAImK,EAASvO,KAAK2yE,gBAAgB9C,EAAI6H,EAAU,EAC5C,EACD,GAEH,IAAKnpE,EAAQ,OAAO,KACpBlE,EAAOoS,EAAA9U,KAAKyG,wBACV/D,EACAiE,EACAC,EACAshE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,MAGF,KAAK5S,EAAAC,MAAM+Q,MACT,IAAI6gE,GAA6BluE,GACjC,EAAG,CAED,KADAA,EAAOrK,KAAK2yE,gBAAgB9C,EAAI,IACrB,OAAO,KAClB0I,EAAW1yE,KAAKwE,SACTwlE,EAAGtpB,KAAK7/C,EAAAC,MAAM+Q,QACvBrN,EAAOoS,EAAA9U,KAAKoE,sBAAsBwsE,EAAY1I,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MACpE,MAEF,QAGE,GAAIwnC,GAASp6C,EAAAC,MAAM29C,IAAK,CACtB,GAAIurB,EAAGvpB,iBACLliC,EAAO3H,EAAA9U,KAAKe,2BAA2BmnE,EAAG/oB,iBAAkB+oB,EAAGzrE,cAO/D,KALAggB,EAAOpkB,KAAK2yE,gBAAgB9C,EAC1B2I,EAAmB13B,GACfs3B,EACAA,EAAiB,IAEZ,OAAO,KAEpB,GAAIh0D,EAAKrd,MAAQ0V,EAAA5V,SAASQ,WACxBgD,EAAOoS,EAAA9U,KAAKmG,+BACVzD,EACsB+Z,EACtByrD,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,UAEnB,IAAI8K,EAAKrd,MAAQ0V,EAAA5V,SAASS,KAQ/B,OAJAtH,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACfxtD,EAAKhgB,OAEA,KANP,KADAiG,EAAOrK,KAAKy4E,iBAAiB5I,EAAIE,EAAU1lE,EAAsB+Z,IACtD,OAAO,UAUf,CAML,KALAA,EAAOpkB,KAAK2yE,gBAAgB9C,EAC1B2I,EAAmB13B,GACfs3B,EACAA,EAAiB,IAEZ,OAAO,KAClB/tE,EAAOoS,EAAA9U,KAAKyD,uBAAuB01C,EAAOz2C,EAAM+Z,EAAMyrD,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,OAKlFjP,EAAOrK,KAAKq4E,yBAAyBxI,EAAIxlE,GAE3C,OAAOA,GAGDilE,EAAArtE,UAAAw2E,iBAAR,SACE5I,EACAE,EACA1lE,EACA7J,GAEA,IAAIk4E,EAASl4E,EAAKyK,WAClB,OAAQytE,EAAO3xE,MACb,KAAK0V,EAAA5V,SAASQ,WACZ7G,EAAKyK,WAAawR,EAAA9U,KAAKmG,+BACrBzD,EACsBquE,EACtB7I,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,MAExB,MAEF,KAAKmD,EAAA5V,SAASS,KACZ,IAAIqxE,EAAQ34E,KAAKy4E,iBAAiB5I,EAAIE,EAAU1lE,EAAsBquE,GACtE,IAAKC,EAAO,OAAO,KACnBn4E,EAAKyK,WAAa0tE,EAClBn4E,EAAK4D,MAAQyrE,EAAGzrE,MAAM2rE,EAAUF,EAAGv2D,KACnC,MAEF,QAKE,OAJAtZ,KAAKuG,MACHgW,EAAAzY,eAAe8tE,oBACfpxE,EAAK4D,OAEA,KAGX,OAAO5D,GAGD8uE,EAAArtE,UAAAo2E,yBAAR,SACExI,EACAxlE,GAEA,GAAIoS,EAAArV,eAAeiD,EAAKtD,MAEtB,IADA,IAAIqB,EAAyC,KAE3CynE,EAAGtpB,KAAK7/C,EAAAC,MAAMu9C,YAEdznC,EAAA/U,sBAAsB2C,EAAKtD,OAA6E,QAAnEqB,EAAgBpI,KAAKm4E,qCAAqCtI,KAC/F,CACA,IAAIlmE,EAAO3J,KAAKqyE,eAAexC,GAC/B,IAAKlmE,EAAM,MACXU,EAAOoS,EAAA9U,KAAK8D,qBACVpB,EACAjC,EACAuB,EACAkmE,EAAGzrE,MAAMiG,EAAKjG,MAAMmB,MAAOsqE,EAAGv2D,MAIpC,OAAOjP,GAITilE,EAAArtE,UAAAguE,cAAA,SAAcJ,GAGZ,IAFAA,EAAG5pB,MAAK,GACJ4pB,EAAGjsB,oBAAoBisB,EAAGzrD,SAC3B,CACD,IAAIs/B,EAAYmsB,EAAG5pB,MAAK,GACxB,GACEvC,GAAah9C,EAAAC,MAAMq/C,WACnBtC,GAAah9C,EAAAC,MAAMo+C,UACnB,CACA8qB,EAAGzrD,OACH,MAEF,GAAIyrD,EAAGjsB,mBAAoB,MAC3B,OAAQisB,EAAGzrD,QACT,KAAK1d,EAAAC,MAAMU,WACTwoE,EAAG/oB,iBACH,MAEF,KAAKpgD,EAAAC,MAAMs9C,cACT4rB,EAAG58B,aACH,MAEF,KAAKvsC,EAAAC,MAAMk+C,eACTgrB,EAAGloB,cACH,MAEF,KAAKjhD,EAAAC,MAAM09C,aACTwrB,EAAG7mB,eAQXsmB,EAAArtE,UAAA22E,UAAA,SAAU/I,GAER,IAAIgJ,EAAQ,EACRhB,GAAQ,EACZ,GACE,OAAQhI,EAAGzrD,QACT,KAAK1d,EAAAC,MAAMq/C,UACThmD,KAAKuG,MACHgW,EAAAzY,eAAe6gD,YACfkrB,EAAGzrE,QAAS,KAEdyzE,GAAQ,EACR,MAEF,KAAKnxE,EAAAC,MAAMy+C,YACPyzB,EACF,MAEF,KAAKnyE,EAAAC,MAAM0+C,aACPwzB,IACUhB,GAAQ,GACpB,MAEF,KAAKnxE,EAAAC,MAAMU,WACTwoE,EAAG/oB,iBACH,MAEF,KAAKpgD,EAAAC,MAAMs9C,cACT4rB,EAAG58B,aACH,MAEF,KAAKvsC,EAAAC,MAAMk+C,eACTgrB,EAAGloB,cACH,MAEF,KAAKjhD,EAAAC,MAAM09C,aACTwrB,EAAG7mB,mBAIA6uB,IAEbvI,EApjHA,CAA4B/yD,EAAAtW,mBAomH5B,SAASqyE,EAAoBvxE,GAC3B,OAAQA,GACN,KAAKL,EAAAC,MAAM+Q,MAAO,SAClB,KAAKhR,EAAAC,MAAM87C,OACX,KAAK/7C,EAAAC,MAAM+7C,YACX,KAAKh8C,EAAAC,MAAMg8C,aACX,KAAKj8C,EAAAC,MAAMk8C,yBACX,KAAKn8C,EAAAC,MAAMi8C,gBACX,KAAKl8C,EAAAC,MAAMm8C,aACX,KAAKp8C,EAAAC,MAAMo8C,eACX,KAAKr8C,EAAAC,MAAMq8C,yBACX,KAAKt8C,EAAAC,MAAMs8C,+BACX,KAAKv8C,EAAAC,MAAMu8C,2CACX,KAAKx8C,EAAAC,MAAMw8C,iBACX,KAAKz8C,EAAAC,MAAM08C,aACX,KAAK38C,EAAAC,MAAMy8C,WAAY,SACvB,KAAK18C,EAAAC,MAAMs+C,SAAU,SACrB,KAAKv+C,EAAAC,MAAM67C,QAAS,SACpB,KAAK97C,EAAAC,MAAM47C,oBAAqB,SAChC,KAAK77C,EAAAC,MAAMw7C,IAAK,SAChB,KAAKz7C,EAAAC,MAAMy7C,MAAO,SAClB,KAAK17C,EAAAC,MAAMu7C,UAAW,UACtB,KAAKx7C,EAAAC,MAAM06C,cACX,KAAK36C,EAAAC,MAAM26C,mBACX,KAAK56C,EAAAC,MAAM46C,qBACX,KAAK76C,EAAAC,MAAM66C,0BAA2B,UACtC,KAAK96C,EAAAC,MAAMs4C,GACX,KAAKv4C,EAAAC,MAAMo5C,GACX,KAAKr5C,EAAAC,MAAMmR,WACX,KAAKpR,EAAAC,MAAMs6C,SACX,KAAKv6C,EAAAC,MAAMu6C,YACX,KAAKx6C,EAAAC,MAAMw6C,gBACX,KAAKz6C,EAAAC,MAAMy6C,mBAAoB,UAC/B,KAAK16C,EAAAC,MAAMo7C,kBACX,KAAKr7C,EAAAC,MAAMq7C,wBACX,KAAKt7C,EAAAC,MAAMs7C,oCAAqC,UAChD,KAAKv7C,EAAAC,MAAM4X,KACX,KAAK7X,EAAAC,MAAM8X,MAAO,UAClB,KAAK/X,EAAAC,MAAM+6C,SACX,KAAKh7C,EAAAC,MAAMg7C,MACX,KAAKj7C,EAAAC,MAAMi7C,QAAS,UACpB,KAAKl7C,EAAAC,MAAM86C,kBAAmB,UAC9B,KAAK/6C,EAAAC,MAAMk7C,UACX,KAAKn7C,EAAAC,MAAMm7C,YAAa,UACxB,KAAKp7C,EAAAC,MAAM29C,IACX,KAAK59C,EAAAC,MAAMqR,IACX,KAAKtR,EAAAC,MAAMu+C,YAAa,UAE1B,SAIF,SAASszB,EAAmBzxE,GAC1B,OAAQA,GACN,KAAKL,EAAAC,MAAM87C,OACX,KAAK/7C,EAAAC,MAAM+7C,YACX,KAAKh8C,EAAAC,MAAMg8C,aACX,KAAKj8C,EAAAC,MAAMk8C,yBACX,KAAKn8C,EAAAC,MAAMi8C,gBACX,KAAKl8C,EAAAC,MAAMm8C,aACX,KAAKp8C,EAAAC,MAAMo8C,eACX,KAAKr8C,EAAAC,MAAMq8C,yBACX,KAAKt8C,EAAAC,MAAMs8C,+BACX,KAAKv8C,EAAAC,MAAMu8C,2CACX,KAAKx8C,EAAAC,MAAMw8C,iBACX,KAAKz8C,EAAAC,MAAM08C,aACX,KAAK38C,EAAAC,MAAMy8C,WACX,KAAK18C,EAAAC,MAAMs+C,SACX,KAAKv+C,EAAAC,MAAM86C,kBAAmB,OAAO,EACrC,QAAS,OAAO,GAzqHP/hD,EAAA4vE,SAujHb,SAAkBwJ,GAChBA,IAAA,eACAA,IAAA,iBACAA,IAAA,mBACAA,IAAA,iBACAA,IAAA,2BACAA,IAAA,6BACAA,IAAA,2BACAA,IAAA,6BACAA,IAAA,2BACAA,IAAA,6BACAA,IAAA,8BACAA,IAAA,wBACAA,IAAA,4BACAA,IAAA,kBACAA,IAAA,wBACAA,IAAA,oCACAA,IAAA,kCACAA,IAAA,gCACAA,IAAA,kCACAA,IAAA,gBACAA,IAAA,gCACAA,IAAA,wBAtBF,CAAkBp5E,EAAAo5E,aAAAp5E,EAAAo5E,sICzoHlB34E,EAAA,IACAA,EAAA,IACAA,EAAA,IACAA,EAAA,IAEA,IAAAuc,EAAAvc,EAAA,GAEAuc,EAAAmpB,OAAO5jC,UAAUixC,OAAS,WACxB,OAAO6lC,SAASC,WAAWh5E,KAAKmuB,KAAK8qD,eAGvCv8D,EAAAmpB,OAAO5jC,UAAUkxC,QAAU,WACzB,OAAO4lC,SAASC,WAAWh5E,KAAKmuB,KAAK+qD,+BCpBvC,SAAAxyD,GAEA,MAAAqyD,EAAAryD,EAAAyyD,UAAoCh5E,EAAQ,IAG5C,QAAAyB,KAFA8kB,EAAAqyD,WAEAA,GACAn3E,EAAAsP,WAAA,cAAAtP,EAAAsP,WAAA,gBAAAwV,EAAA9kB,GAAAm3E,EAAAn3E,IAKA8kB,EAAA0yD,kBAAAL,EAAAM,QACA3yD,EAAA4yD,cAAAP,EAAAQ,MACA7yD,EAAA8yD,cAAAT,EAAAU,SACA/yD,EAAAgzD,QAAA,SAAAtwC,EAAAoR,GAAqCu+B,EAAAY,OAAAvwC,GAAAoR,GACrC9zB,EAAAkzD,OAAA,SAAAxwC,GAA+B,OAAA2vC,EAAAY,OAAAvwC,qCCf/BzpC,EAAAD,QAAAO,oBCAA,SAAAymB,GAEA,IAAAmzD,EAAA,oBAAA/6B,qBAAA,IAAAp4B,MAAA3mB,KAEA85E,EAAAC,WAAA,EAEA,IAAAC,EAAA,IAAAC,aAAA,GACAC,EAAA,IAAAC,YAAAH,EAAAr0C,QAiJA,SAAAy0C,IACAz0D,MAAA00D,kBACA10D,MAAA00D,kBAAAp6E,KAAAm6E,GAEAn6E,KAAAq6E,MAAAr6E,KAAAY,KAAA,KAAAZ,KAAAmE,QAAA,UAAAuhB,OAAA20D,MAWA,SAAAC,EAAAn2E,GACAnE,KAAAmE,WAAA,mBACAuhB,MAAA00D,kBACA10D,MAAA00D,kBAAAp6E,KAAAs6E,GAEAt6E,KAAAq6E,MAAAr6E,KAAAY,KAAA,KAAAZ,KAAAmE,QAAA,UAAAuhB,OAAA20D,MAnKAt5E,OAAAw5E,iBACAV,EAAA,YAAAv4E,GAA0C,OAAAA,GAAA,SAE1Cw4B,WAAgBx4B,OAAA,IAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,IAAAk5E,UAAA,KAGhBz5E,OAAAw5E,iBACAV,EAAA,aAAAv4E,GAA4C,OAAAA,GAAA,SAE5Cw4B,WAAgBx4B,OAAA,MAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,MAAAk5E,UAAA,KAGhBz5E,OAAAw5E,iBACAV,EAAA,IAAAA,EAAA,eAAAv4E,GAAmE,SAAAA,IAEnEw4B,WAAgBx4B,OAAA,WAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,WAAAk5E,UAAA,KAGhBz5E,OAAAw5E,iBACAV,EAAA,YAAAv4E,GAA0C,WAAAA,IAE1Cw4B,WAAgBx4B,MAAA,EAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,IAAAk5E,UAAA,KAGhBz5E,OAAAw5E,iBACAV,EAAA,aAAAv4E,GAA4C,aAAAA,IAE5Cw4B,WAAgBx4B,MAAA,EAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,MAAAk5E,UAAA,KAGhBz5E,OAAAw5E,iBACAV,EAAA,IAAAA,EAAA,eAAAv4E,GAAmE,OAAAA,IAAA,IAEnEw4B,WAAgBx4B,MAAA,EAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,WAAAk5E,UAAA,KAGhBz5E,OAAAw5E,iBACAV,EAAA,cAAAv4E,GAA8C,QAAAA,IAE9Cw4B,WAAgBx4B,MAAA,EAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,EAAAk5E,UAAA,KAGhBz5E,OAAAw5E,iBACAV,EAAA,aAAAv4E,GAA4C,OAAAm5E,KAAAC,OAAAp5E,KAE5Cq5E,SAAgBr5E,MAAAm5E,KAAAC,OAAA,cAAAF,UAAA,GAChB1gD,WAAgBx4B,MAAAm5E,KAAAC,OAAA,eAAAF,UAAA,GAChBzgD,WAAgBz4B,MAAAm5E,KAAAC,OAAA,cAAAF,UAAA,GAChBI,kBAAwBt5E,MAAAm5E,KAAAC,OAAA,gBAAAF,UAAA,GACxBK,kBAAwBv5E,OAAA,SAAAk5E,UAAA,GACxBM,kBAAwBx5E,MAAA,SAAAk5E,UAAA,GACxBO,mBAAwBz5E,MAAA05E,IAAAR,UAAA,GACxBS,mBAAwB35E,OAAA05E,IAAAR,UAAA,GACxBU,KAAU55E,MAAA45E,IAAAV,UAAA,KAGVz5E,OAAAw5E,iBACAV,EAAA,aAAAv4E,GAA4C,OAAAA,IAE5Cq5E,SAAgBr5E,MAAA,sBAAAk5E,UAAA,GAChB1gD,WAAgBx4B,MAAA,OAAAk5E,UAAA,GAChBzgD,WAAgBz4B,MAAA,uBAAAk5E,UAAA,GAChBI,kBAAwBt5E,MAAA,wBAAAk5E,UAAA,GACxBK,kBAAwBv5E,OAAA,iBAAAk5E,UAAA,GACxBM,kBAAwBx5E,MAAA,iBAAAk5E,UAAA,GACxBO,mBAAwBz5E,MAAA05E,IAAAR,UAAA,GACxBS,mBAAwB35E,OAAA05E,IAAAR,UAAA,GACxBU,KAAU55E,MAAA45E,IAAAV,UAAA,KAGVX,EAAA,IAAAY,KAAAU,MAEAtB,EAAA,aAAAv4E,GACA,IAAAZ,EAAA+5E,KAAAU,MAAA75E,MACA,OAAAA,EAAA,GAAAZ,KAGAm5E,EAAA,gBAAAv4E,GAGA,kBADAA,GAAA,WADAA,OAAA,gBACAA,IAAA,eACAA,IAAA,oBAGAu4E,EAAA,cAAAv4E,EAAAq3B,GAEA,OAAAr3B,IADAq3B,GAAA,IACAr3B,IAAA,GAAAq3B,GAGAkhD,EAAA,cAAAv4E,EAAAq3B,GAEA,OAAAr3B,KADAq3B,GAAA,IACAr3B,GAAA,GAAAq3B,GAGAkhD,EAAA,IAAAY,KAAAW,IAEAvB,EAAA,IAAAY,KAAApvB,IAEAwuB,EAAA,IAAAY,KAAAtlD,IAEA0kD,EAAA,KAAAY,KAAA5+B,KAEAg+B,EAAA,MAAAY,KAAAY,MAGAxB,EAAA,iBAAAv4E,GACA,WAAAm5E,KAAAW,IAAA95E,EAAAm5E,KAAAa,MAAAh6E,IACA,EAAAm5E,KAAAc,MAAA,GAAAj6E,GAEAm5E,KAAAc,MAAAj6E,IAGAu4E,EAAA,gBAAA/nE,EAAAC,EAAA1D,GACA,OAAAA,EAAAyD,EAAAC,GAGA8nE,EAAA,KAAAY,KAAAe,KAEA3B,EAAA,MAAAY,KAAAa,MAEAzB,EAAA,kBAAA4B,EAAAC,GACA,OAAAjB,KAAAW,IAAAK,GAAAhB,KAAAkB,KAAAD,IAGA7B,EAAA,eAAAv4E,GACA,IAAAgiD,EAAAhiD,GAAA,WACAiiD,GAAA,SAAAjiD,IAAA,EAIA,OAFAgiD,GADAhiD,EAAAgiD,EAAAC,IACA,WACAA,GAAA,MAAAjiD,IAAA,KAIAu4E,EAAA,iBAAAv4E,GACA,OAAAA,GAAA,QAAAA,GAAA,iBAAAA,GAUA64E,EAAAl4E,UAAAlB,OAAAY,OAAA+jB,MAAAzjB,WACAk4E,EAAAl4E,UAAArB,KAAA,mBACAu5E,EAAAl4E,UAAAkC,QAAA,cAEA01E,EAAA,uBACA,UAAAM,GAWAG,EAAAr4E,UAAAlB,OAAAY,OAAA+jB,MAAAzjB,WACAq4E,EAAAr4E,UAAArB,KAAA,iBAEAi5E,EAAA,gBAAA+B,EAAAz3E,GACA,GAAAy3E,EAAA,OAAAA,EACA,UAAAtB,EAAAn2E,IAGA01E,EAAA,oBAAAv4E,GACA,OAAAA,GAGAu4E,EAAA,kBAAAn/B,EAAAmhC,GACA,SAAAC,SAAAphC,OAAAqhC,IAGA5gC,OAAA,uBAAAD,GACA,OAAAC,OAAAkM,aAAA5xC,MAAA0lC,OAAAD,IAGAC,OAAA,wBAAAD,GACA,OAAAC,OAAA6gC,cAAAvmE,MAAA0lC,OAAAD,IAGA2+B,EAAA,UAAAoC,OAAAC,UAEArC,EAAA,iBAAA78D,GACA,uBAAAA,GAGA68D,EAAA,qBAAA78D,GACA,uBAAAA,GAAA,iBAAAA,GAGA68D,EAAA,kBAAA78D,GACA,uBAAAA,gBAAAm+B,QAGA0+B,EAAA,QAAA1zE,MAAAg2E,QAEAtC,EAAA,mBAAAxvE,GACA,OAAAA,GAGAwvE,EAAA,cAAA4B,EAAAC,GACA,OAAAD,EAAAC,GAGA7B,EAAA,eAAA4B,EAAAC,GACA,OAAAjB,KAAAC,OAAAe,EAAAC,IAGA7B,EAAA,OAAAY,KACAZ,EAAA,OAAAuC,QAAA,SAAAX,GACa,OAAb1B,EAAA,GAAA0B,EAAaY,QAAApC,EAAA,QAAAwB,OAGb5B,EAAA,aACA,IAAAyC,EAAA,IAAAxpC,WAAA,GACAypC,EAAA,EACA,OACAl2C,SAAAwzC,EAAA,4BAAAjhD,GACA,KAAAA,KAAA,YACA,GAAA2jD,EAAA3jD,EAAA0jD,EAAAh3E,OAAA,CACA,IAAAk3E,EAAAF,GACAA,EAAA,IAAAxpC,WAAA2nC,KAAApvB,IAAA,MAAAixB,EAAAh3E,OAAAszB,EAAA,EAAA0jD,EAAAh3E,UACA4C,IAAAs0E,GAEA,IAAApzC,EAAAmzC,EAEA,OADA,GAAAA,GAAA3jD,KAAA2jD,EAAA,KAAAA,IACAnzC,GAEA5V,KAAAqmD,EAAA,wBAAAzwC,KACAqzC,KAAA5C,EAAA,wBAAA6C,EAAAC,EAAA/jD,GACA0jD,EAAAM,WAAAF,EAAAC,IAAA/jD,MAjBA,GAsBAihD,EAAA,MAAAA,EAAA,kBAAAzwC,EAAA9nC,EAAAqkC,GACA22C,KAAAlzC,GAAA,EAAAzD,IAAArkC,GAGAu4E,EAAA,KAAAA,EAAA,iBAAAzwC,EAAAzD,GACA,OAAA22C,KAAAlzC,GAAA,EAAAzD,yCCnQA,SAAAjf,GAAA,MAAAqzD,EAAA,IAAAC,aAAA,GACA6C,EAAA,IAAAC,aAAA/C,EAAAr0C,QACAq3C,EAAA,IAAAC,WAAAjD,EAAAr0C,QAEAhf,EAAAu2D,WAAA,SAAA37E,GAEA,OADAu7E,EAAA,GAAAv7E,EACAy7E,EAAA,IAGAr2D,EAAAw2D,WAAA,SAAA57E,GAEA,OADAy7E,EAAA,GAAAz7E,EACAu7E,EAAA,IAGAn2D,EAAAy2D,WAAA,SAAA77E,GAEA,OADAy4E,EAAA,GAAAz4E,EACA2gB,QAAA86D,EAAA,GAAAA,EAAA,KAGAr2D,EAAA02D,WAAA,SAAA97E,GAGA,OAFAy7E,EAAA,GAAArtC,QAAApuC,GACAy7E,EAAA,GAAAptC,SAAAruC,GACAy4E,EAAA,wCCtBA,SAAArzD,GAAA,MAAA22D,EAAA32D,EAAA22D,MAA4Bl9E,EAAQ,IAEpCumB,EAAA6N,SAAA8oD,EAAAC,KAEA52D,EAAA4N,QAAA+oD,EAAAE,IAEA72D,EAAAzE,QAAA,SAAAu7D,EAAAC,GACA,OAAAJ,EAAAK,SAAAF,EAAAC,IAGA/2D,EAAAgpB,QAAA,SAAApuC,GACA,OAAAA,EAAAq8E,KAGAj3D,EAAAipB,SAAA,SAAAruC,GACA,OAAAA,EAAAs8E,MAGAl3D,EAAA0hC,QAAA,SAAA98C,EAAAC,GACA,OAAAD,EAAAsgB,IAAArgB,IAGAmb,EAAA45C,QAAA,SAAAh1D,EAAAC,GACA,OAAAD,EAAAuyE,IAAAtyE,IAGAmb,EAAA2hC,QAAA,SAAA/8C,EAAAC,GACA,OAAAD,EAAAwyE,IAAAvyE,IAGAmb,EAAAq3D,QAAA,SAAAzyE,EAAAC,GACA,OAAAD,EAAA0yE,IAAAzyE,IAGAmb,EAAAu3D,UAAA,SAAA3yE,EAAAC,GACA,OAAAD,EAAA4yE,aAAAF,IAAAzyE,EAAA2yE,cAAAC,YAGAz3D,EAAA03D,QAAA,SAAA9yE,EAAAC,GACA,OAAAD,EAAA+yE,IAAA9yE,IAGAmb,EAAA43D,UAAA,SAAAhzE,EAAAC,GACA,OAAAD,EAAA4yE,aAAAG,IAAA9yE,EAAA2yE,cAAAC,YAGAz3D,EAAA0N,QAAA,SAAA9oB,EAAAC,GACA,OAAAD,EAAAizE,IAAAhzE,IAGAmb,EAAA+N,OAAA,SAAAnpB,EAAAC,GACA,OAAAD,EAAAkzE,GAAAjzE,IAGAmb,EAAA+3D,QAAA,SAAAnzE,EAAAC,GACA,OAAAD,EAAAozE,IAAAnzE,IAGAmb,EAAA2N,QAAA,SAAA/oB,EAAAC,GACA,OAAAD,EAAAqzE,IAAApzE,IAGAmb,EAAAk4D,QAAA,SAAAtzE,EAAAC,GACA,OAAAD,EAAAuzE,IAAAtzE,IAGAmb,EAAAolC,UAAA,SAAAxgD,EAAAC,GACA,OAAAD,EAAAwzE,KAAAvzE,IAGAmb,EAAAgO,QAAA,SAAApzB,GACA,OAAAA,EAAAy9E,OAGAr4D,EAAAs4D,OAAA,SAAA1zE,EAAAC,GACA,OAAAD,EAAA2zE,GAAA1zE,IAGAmb,EAAAyN,OAAA,SAAA7oB,EAAAC,GACA,OAAAD,EAAA4zE,GAAA3zE,IAGAmb,EAAAklC,UAAA,SAAAtqD,EAAA6vD,GACA1tD,OAAA0tD,GAAA,IAAAA,IAAA,IACA,IAAAkE,EAAAgoB,EAAA8B,QAAAhuB,EAAA,GACA,OAAA7vD,EAAAsqB,IAAAypC,GAAAkpB,IAAAlpB,EAAA0pB,QAGAr4D,EAAA65C,UAAA,SAAAj/D,GACA,WAAAA,EAAAs8E,MAAAt8E,EAAAq8E,KAAA,GAAAr8E,EAAAq8E,KAAAz8D,GAAA6Y,YACA,IAAAz4B,EAAAs8E,MAAAt8E,EAAAq8E,KAAAz8D,GAAA4Y,WAAAx4B,EAAAq8E,IAAA,GAGAj3D,EAAA+5C,WAAA,SAAAn/D,GACA,WAAAA,EAAAs8E,MAAAt8E,EAAAq8E,KAAA,GAAAr8E,EAAAq8E,KAAAx8D,IAAA4Y,YACA,IAAAz4B,EAAAs8E,MAAAt8E,EAAAq8E,KAAAx8D,IAAA2Y,WAAAx4B,EAAAq8E,IAAA,GAGAj3D,EAAAi6C,WAAA,SAAAr/D,GACA,WAAAA,EAAAs8E,MAAAt8E,EAAAq8E,KAAA,IACA,IAAAr8E,EAAAs8E,MAAAt8E,EAAAq8E,IAAA,GAGAj3D,EAAA85C,UAAA,SAAAl/D,GACA,WAAAA,EAAAs8E,MAAAt8E,EAAAq8E,KAAA,GAAAr8E,EAAAq8E,KAAAp8D,GAAAwY,WAGArT,EAAAg6C,WAAA,SAAAp/D,GACA,WAAAA,EAAAs8E,MAAAt8E,EAAAq8E,KAAA,GAAAr8E,EAAAq8E,KAAAn8D,IAAAuY,WAGArT,EAAAk6C,WAAA,SAAAt/D,GACA,WAAAA,EAAAs8E,MAGAl3D,EAAAm6C,YAAA,SAAAv/D,GACA,WAAAA,EAAAs8E,OAAA,IAAAt8E,EAAAq8E,KAAA,IAAAr8E,EAAAq8E,MAGA,MAAAyB,EAAA/B,EAAAgC,WAAAx9D,IAAAg5D,kBACAyE,EAAAjC,EAAAgC,WAAAx9D,IAAAi5D,kBAEAp0D,EAAAo6C,WAAA,SAAAx/D,GACA,OAAAA,EAAAi+E,IAAAH,IAAA99E,EAAAk+E,IAAAF,IAGA,MAAAG,EAAApC,EAAAgC,WAAAv9D,IAAA+4D,kBACA6E,EAAArC,EAAAgC,WAAAv9D,IAAAg5D,kBAEAp0D,EAAAs6C,WAAA,SAAA1/D,GACA,OAAAA,EAAAi+E,IAAAE,IAAAn+E,EAAAk+E,IAAAE,IAGAh5D,EAAAq6C,WAAA,SAAAz/D,GACA,OAAAolB,EAAA+zD,KAAAC,OAAAp5E,EAAAq+E,aAGAj5D,EAAAu6C,WAAA,SAAA3/D,GACA,OAAAA,EAAAq+E,YAGAj5D,EAAA2iD,cAAA,SAAA/nE,EAAAs+E,GACA,OAAAA,EAAAt+E,EAAA48E,aAAA58E,GAAAuD,SAAA,sCC9IAlF,EAAAD,QAAA29E,EAKA,IAAAwC,EAAA,KAEA,IACAA,EAAA,IAAAC,YAAAC,SAAA,IAAAD,YAAAj6C,OAAA,IAAAiN,YACA,u2BACSpzC,QACR,MAAAm/C,IAcD,SAAAw+B,EAAAM,EAAAC,EAAAgC,GAMA5/E,KAAA29E,IAAA,EAAAA,EAMA39E,KAAA49E,KAAA,EAAAA,EAMA59E,KAAA4/E,aAoCA,SAAAI,EAAAC,GACA,YAAAA,KAAA,YAXA5C,EAAAp7E,UAAAi+E,WAEAn/E,OAAAC,eAAAq8E,EAAAp7E,UAAA,cAAqDX,OAAA,IAkBrD+7E,EAAA2C,SAOA,IAAAG,KAOAC,KAQA,SAAAjB,EAAA79E,EAAAs+E,GACA,IAAAK,EAAAI,EAAAC,EACA,OAAAV,GAEAU,EAAA,IADAh/E,KAAA,IACAA,EAAA,OACA++E,EAAAD,EAAA9+E,IAEA++E,GAEAJ,EAAAvC,EAAAp8E,GAAA,EAAAA,GAAA,WACAg/E,IACAF,EAAA9+E,GAAA2+E,GACAA,IAGAK,GAAA,MADAh/E,GAAA,IACAA,EAAA,OACA++E,EAAAF,EAAA7+E,IAEA++E,GAEAJ,EAAAvC,EAAAp8E,IAAA,WACAg/E,IACAH,EAAA7+E,GAAA2+E,GACAA,GAmBA,SAAAZ,EAAA/9E,EAAAs+E,GACA,GAAAW,MAAAj/E,GACA,OAAAs+E,EAAAY,EAAAlD,EACA,GAAAsC,EAAA,CACA,GAAAt+E,EAAA,EACA,OAAAk/E,EACA,GAAAl/E,GAAAm/E,EACA,OAAAC,MACK,CACL,GAAAp/E,IAAAq/E,EACA,OAAA7mD,EACA,GAAAx4B,EAAA,GAAAq/E,EACA,OAAA5mD,EAEA,OAAAz4B,EAAA,EACA+9E,GAAA/9E,EAAAs+E,GAAAgB,MACAlD,EAAAp8E,EAAAu/E,EAAA,EAAAv/E,EAAAu/E,EAAA,EAAAjB,GAmBA,SAAAlC,EAAAoD,EAAAC,EAAAnB,GACA,WAAAvC,EAAAyD,EAAAC,EAAAnB,GA5CAvC,EAAA8B,UAkCA9B,EAAAgC,aAsBAhC,EAAAK,WASA,IAAAsD,EAAAvG,KAAAwG,IASA,SAAAC,EAAAxmC,EAAAklC,EAAA/D,GACA,OAAAnhC,EAAAp1C,OACA,MAAAogB,MAAA,gBACA,WAAAg1B,GAAA,aAAAA,GAAA,cAAAA,GAAA,cAAAA,EACA,OAAA4iC,EASA,GARA,iBAAAsC,GAEA/D,EAAA+D,EACAA,GAAA,GAEAA,OAEA/D,KAAA,IACA,MAAAA,EACA,MAAAsF,WAAA,SAEA,IAAAh/E,EACA,IAAAA,EAAAu4C,EAAA6zB,QAAA,QACA,MAAA7oD,MAAA,mBACA,OAAAvjB,EACA,OAAA++E,EAAAxmC,EAAA90C,UAAA,GAAAg6E,EAAA/D,GAAA+E,MAQA,IAHA,IAAAQ,EAAA/B,EAAA2B,EAAAnF,EAAA,IAEAj1C,EAAA02C,EACAj9E,EAAA,EAAmBA,EAAAq6C,EAAAp1C,OAAgBjF,GAAA,GACnC,IAAAu4B,EAAA6hD,KAAAtlD,IAAA,EAAAulB,EAAAp1C,OAAAjF,GACAiB,EAAAw6E,SAAAphC,EAAA90C,UAAAvF,IAAAu4B,GAAAijD,GACA,GAAAjjD,EAAA,GACA,IAAAyoD,EAAAhC,EAAA2B,EAAAnF,EAAAjjD,IACAgO,IAAAk3C,IAAAuD,GAAAz1D,IAAAyzD,EAAA/9E,SAGAslC,GADAA,IAAAk3C,IAAAsD,IACAx1D,IAAAyzD,EAAA/9E,IAIA,OADAslC,EAAAg5C,WACAh5C,EAoBA,SAAA06C,EAAA9mC,EAAAolC,GACA,uBAAAplC,EACA6kC,EAAA7kC,EAAAolC,GACA,iBAAAplC,EACA0mC,EAAA1mC,EAAAolC,GAEAlC,EAAAljC,EAAAmjC,IAAAnjC,EAAAojC,KAAA,kBAAAgC,IAAAplC,EAAAolC,UAfAvC,EAAA6D,aAyBA7D,EAAAiE,YAUA,IAcAT,EAAAU,WAOAd,EAAAI,IAOAF,EAAAF,EAAA,EAOAe,EAAArC,EA5BA,OAkCA7B,EAAA6B,EAAA,GAMA9B,EAAAC,OAMA,IAAAkD,EAAArB,EAAA,MAMA9B,EAAAmD,QAMA,IAAAjD,EAAA4B,EAAA,GAMA9B,EAAAE,MAMA,IAAAkE,EAAAtC,EAAA,MAMA9B,EAAAoE,OAMA,IAAAC,EAAAvC,GAAA,GAMA9B,EAAAqE,UAMA,IAAA3nD,EAAA2jD,GAAA,iBAMAL,EAAAtjD,YAMA,IAAA2mD,EAAAhD,GAAA,SAMAL,EAAAqD,qBAMA,IAAA5mD,EAAA4jD,EAAA,kBAMAL,EAAAvjD,YAMA,IAAA6nD,EAAAtE,EAAAp7E,UAMA0/E,EAAAC,MAAA,WACA,OAAA5hF,KAAA4/E,SAAA5/E,KAAA29E,MAAA,EAAA39E,KAAA29E,KAOAgE,EAAAhC,SAAA,WACA,OAAA3/E,KAAA4/E,UACA5/E,KAAA49E,OAAA,GAAAiD,GAAA7gF,KAAA29E,MAAA,GACA39E,KAAA49E,KAAAiD,GAAA7gF,KAAA29E,MAAA,IAUAgE,EAAA98E,SAAA,SAAAg3E,GAEA,IADAA,KAAA,IACA,MAAAA,EACA,MAAAsF,WAAA,SACA,GAAAnhF,KAAA6hF,SACA,UACA,GAAA7hF,KAAA8hF,aAAA,CACA,GAAA9hF,KAAAi/E,GAAAnlD,GAAA,CAGA,IAAAioD,EAAA1C,EAAAxD,GACAmC,EAAAh+E,KAAAg+E,IAAA+D,GACAC,EAAAhE,EAAAF,IAAAiE,GAAAlE,IAAA79E,MACA,OAAAg+E,EAAAn5E,SAAAg3E,GAAAmG,EAAAJ,QAAA/8E,SAAAg3E,GAEA,UAAA77E,KAAA4gF,MAAA/7E,SAAAg3E,GAQA,IAHA,IAAAuF,EAAA/B,EAAA2B,EAAAnF,EAAA,GAAA77E,KAAA4/E,UACAqC,EAAAjiF,KACA4mC,EAAA,KACA,CACA,IAAAs7C,EAAAD,EAAAjE,IAAAoD,GAEAe,GADAF,EAAApE,IAAAqE,EAAApE,IAAAsD,IAAAQ,UAAA,GACA/8E,SAAAg3E,GAEA,IADAoG,EAAAC,GACAL,SACA,OAAAM,EAAAv7C,EAEA,KAAAu7C,EAAA78E,OAAA,GACA68E,EAAA,IAAAA,EACAv7C,EAAA,GAAAu7C,EAAAv7C,IASA+6C,EAAAS,YAAA,WACA,OAAApiF,KAAA49E,MAOA+D,EAAAU,oBAAA,WACA,OAAAriF,KAAA49E,OAAA,GAOA+D,EAAAW,WAAA,WACA,OAAAtiF,KAAA29E,KAOAgE,EAAAY,mBAAA,WACA,OAAAviF,KAAA29E,MAAA,GAOAgE,EAAAa,cAAA,WACA,GAAAxiF,KAAA8hF,aACA,OAAA9hF,KAAAi/E,GAAAnlD,GAAA,GAAA95B,KAAA4gF,MAAA4B,gBAEA,IADA,IAAAhoC,EAAA,GAAAx6C,KAAA49E,KAAA59E,KAAA49E,KAAA59E,KAAA29E,IACA8E,EAAA,GAAsBA,EAAA,GACtB,IAAAjoC,EAAA,GAAAioC,GAD+BA,KAG/B,UAAAziF,KAAA49E,KAAA6E,EAAA,GAAAA,EAAA,GAOAd,EAAAE,OAAA,WACA,WAAA7hF,KAAA49E,MAAA,IAAA59E,KAAA29E,KAOAgE,EAAAe,IAAAf,EAAAE,OAMAF,EAAAG,WAAA,WACA,OAAA9hF,KAAA4/E,UAAA5/E,KAAA49E,KAAA,GAOA+D,EAAAgB,WAAA,WACA,OAAA3iF,KAAA4/E,UAAA5/E,KAAA49E,MAAA,GAOA+D,EAAAiB,MAAA,WACA,aAAA5iF,KAAA29E,MAOAgE,EAAAkB,OAAA,WACA,aAAA7iF,KAAA29E,MAQAgE,EAAAmB,OAAA,SAAAluD,GAGA,OAFAorD,EAAAprD,KACAA,EAAA0sD,EAAA1sD,KACA50B,KAAA4/E,WAAAhrD,EAAAgrD,UAAA5/E,KAAA49E,OAAA,OAAAhpD,EAAAgpD,OAAA,SAEA59E,KAAA49E,OAAAhpD,EAAAgpD,MAAA59E,KAAA29E,MAAA/oD,EAAA+oD,MASAgE,EAAA1C,GAAA0C,EAAAmB,OAOAnB,EAAAoB,UAAA,SAAAnuD,GACA,OAAA50B,KAAAi/E,GAAArqD,IASA+sD,EAAAqB,IAAArB,EAAAoB,UAQApB,EAAAzC,GAAAyC,EAAAoB,UAOApB,EAAAsB,SAAA,SAAAruD,GACA,OAAA50B,KAAAkjF,KAAAtuD,GAAA,GASA+sD,EAAAwB,GAAAxB,EAAAsB,SAOAtB,EAAAyB,gBAAA,SAAAxuD,GACA,OAAA50B,KAAAkjF,KAAAtuD,IAAA,GASA+sD,EAAAnC,IAAAmC,EAAAyB,gBAQAzB,EAAA0B,GAAA1B,EAAAyB,gBAOAzB,EAAA2B,YAAA,SAAA1uD,GACA,OAAA50B,KAAAkjF,KAAAtuD,GAAA,GASA+sD,EAAA4B,GAAA5B,EAAA2B,YAOA3B,EAAA6B,mBAAA,SAAA5uD,GACA,OAAA50B,KAAAkjF,KAAAtuD,IAAA,GASA+sD,EAAApC,IAAAoC,EAAA6B,mBAQA7B,EAAA8B,GAAA9B,EAAA6B,mBAQA7B,EAAA+B,QAAA,SAAA9uD,GAGA,GAFAorD,EAAAprD,KACAA,EAAA0sD,EAAA1sD,IACA50B,KAAAi/E,GAAArqD,GACA,SACA,IAAA+uD,EAAA3jF,KAAA8hF,aACA8B,EAAAhvD,EAAAktD,aACA,OAAA6B,IAAAC,GACA,GACAD,GAAAC,EACA,EAEA5jF,KAAA4/E,SAGAhrD,EAAAgpD,OAAA,EAAA59E,KAAA49E,OAAA,GAAAhpD,EAAAgpD,OAAA59E,KAAA49E,MAAAhpD,EAAA+oD,MAAA,EAAA39E,KAAA29E,MAAA,OAFA39E,KAAA69E,IAAAjpD,GAAAktD,cAAA,KAYAH,EAAAuB,KAAAvB,EAAA+B,QAMA/B,EAAAkC,OAAA,WACA,OAAA7jF,KAAA4/E,UAAA5/E,KAAAi/E,GAAAnlD,GACAA,EACA95B,KAAA++E,MAAAnzD,IAAA2xD,IAQAoE,EAAAf,IAAAe,EAAAkC,OAOAlC,EAAA/1D,IAAA,SAAAk4D,GACA9D,EAAA8D,KACAA,EAAAxC,EAAAwC,IAIA,IAAAC,EAAA/jF,KAAA49E,OAAA,GACAoG,EAAA,MAAAhkF,KAAA49E,KACAqG,EAAAjkF,KAAA29E,MAAA,GACAuG,EAAA,MAAAlkF,KAAA29E,IAEAwG,EAAAL,EAAAlG,OAAA,GACAwG,EAAA,MAAAN,EAAAlG,KACAyG,EAAAP,EAAAnG,MAAA,GAGA2G,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAYA,OAVAD,IADAC,GAAAP,GAHA,MAAAJ,EAAAnG,QAIA,GAGA4G,IADAC,GAAAP,EAAAI,KACA,GAGAC,IADAC,GAAAP,EAAAI,KACA,GAEAE,GAAAP,EAAAI,EAEAzG,GANA8G,GAAA,QAMA,IATAC,GAAA,QAQAH,GAAA,QACA,IAHAC,GAAA,OAGAvkF,KAAA4/E,WAQA+B,EAAA+C,SAAA,SAAAC,GAGA,OAFA3E,EAAA2E,KACAA,EAAArD,EAAAqD,IACA3kF,KAAA4rB,IAAA+4D,EAAA/D,QASAe,EAAA9D,IAAA8D,EAAA+C,SAOA/C,EAAAiD,SAAA,SAAAC,GACA,GAAA7kF,KAAA6hF,SACA,OAAAvE,EAKA,GAJA0C,EAAA6E,KACAA,EAAAvD,EAAAuD,IAGAhF,EAKA,OAAAnC,EAJAmC,EAAA/B,IAAA99E,KAAA29E,IACA39E,KAAA49E,KACAiH,EAAAlH,IACAkH,EAAAjH,MACAiC,EAAAiF,WAAA9kF,KAAA4/E,UAGA,GAAAiF,EAAAhD,SACA,OAAAvE,EACA,GAAAt9E,KAAAi/E,GAAAnlD,GACA,OAAA+qD,EAAAjC,QAAA9oD,EAAAwjD,EACA,GAAAuH,EAAA5F,GAAAnlD,GACA,OAAA95B,KAAA4iF,QAAA9oD,EAAAwjD,EAEA,GAAAt9E,KAAA8hF,aACA,OAAA+C,EAAA/C,aACA9hF,KAAA4gF,MAAA9C,IAAA+G,EAAAjE,OAEA5gF,KAAA4gF,MAAA9C,IAAA+G,GAAAjE,MACK,GAAAiE,EAAA/C,aACL,OAAA9hF,KAAA89E,IAAA+G,EAAAjE,aAGA,GAAA5gF,KAAAmjF,GAAA3B,IAAAqD,EAAA1B,GAAA3B,GACA,OAAAnC,EAAAr/E,KAAA2/E,WAAAkF,EAAAlF,WAAA3/E,KAAA4/E,UAKA,IAAAmE,EAAA/jF,KAAA49E,OAAA,GACAoG,EAAA,MAAAhkF,KAAA49E,KACAqG,EAAAjkF,KAAA29E,MAAA,GACAuG,EAAA,MAAAlkF,KAAA29E,IAEAwG,EAAAU,EAAAjH,OAAA,GACAwG,EAAA,MAAAS,EAAAjH,KACAyG,EAAAQ,EAAAlH,MAAA,GACAoH,EAAA,MAAAF,EAAAlH,IAEA2G,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAAAC,EAAA,EAqBA,OAnBAD,IADAC,GAAAP,EAAAa,KACA,GAGAR,IADAC,GAAAP,EAAAc,KACA,GACAP,GAAA,MAEAD,IADAC,GAAAN,EAAAG,KACA,GAGAC,IADAC,GAAAP,EAAAe,KACA,GACAR,GAAA,MAEAD,IADAC,GAAAN,EAAAI,KACA,GACAE,GAAA,MAEAD,IADAC,GAAAL,EAAAE,KACA,GAEAE,GAAAP,EAAAgB,EAAAf,EAAAK,EAAAJ,EAAAG,EAAAF,EAAAC,EAEAzG,GAZA8G,GAAA,QAYA,IAlBAC,GAAA,QAiBAH,GAAA,QACA,IAHAC,GAAA,OAGAvkF,KAAA4/E,WASA+B,EAAA7D,IAAA6D,EAAAiD,SAQAjD,EAAAqD,OAAA,SAAAC,GAGA,GAFAjF,EAAAiF,KACAA,EAAA3D,EAAA2D,IACAA,EAAApD,SACA,MAAAn8D,MAAA,oBAaA,IAWAw/D,EAAAjD,EAAAkD,EArBA,GAAAtF,EAIA,OAAA7/E,KAAA4/E,WACA,aAAA5/E,KAAA49E,OACA,IAAAqH,EAAAtH,MAAA,IAAAsH,EAAArH,KAUAF,GANA19E,KAAA4/E,SAAAC,EAAAuF,MAAAvF,EAAAwF,OACArlF,KAAA29E,IACA39E,KAAA49E,KACAqH,EAAAtH,IACAsH,EAAArH,MAEAiC,EAAAiF,WAAA9kF,KAAA4/E,UARA5/E,KAWA,GAAAA,KAAA6hF,SACA,OAAA7hF,KAAA4/E,SAAAY,EAAAlD,EAEA,GAAAt9E,KAAA4/E,SA6BK,CAKL,GAFAqF,EAAArF,WACAqF,IAAA/G,cACA+G,EAAA1B,GAAAvjF,MACA,OAAAwgF,EACA,GAAAyE,EAAA1B,GAAAvjF,KAAA8+E,KAAA,IACA,OAAA2C,EACA0D,EAAA3E,MAtCA,CAGA,GAAAxgF,KAAAi/E,GAAAnlD,GACA,OAAAmrD,EAAAhG,GAAA1B,IAAA0H,EAAAhG,GAAAyC,GACA5nD,EACAmrD,EAAAhG,GAAAnlD,GACAyjD,GAIA2H,EADAllF,KAAA6+E,IAAA,GACAb,IAAAiH,GAAAtG,IAAA,IACAM,GAAA3B,GACA2H,EAAAnD,aAAAvE,EAAAmE,GAEAO,EAAAjiF,KAAA69E,IAAAoH,EAAAnH,IAAAoH,IACAC,EAAAD,EAAAt5D,IAAAq2D,EAAAjE,IAAAiH,UAIS,GAAAA,EAAAhG,GAAAnlD,GACT,OAAA95B,KAAA4/E,SAAAY,EAAAlD,EACA,GAAAt9E,KAAA8hF,aACA,OAAAmD,EAAAnD,aACA9hF,KAAA4gF,MAAA5C,IAAAiH,EAAArE,OACA5gF,KAAA4gF,MAAA5C,IAAAiH,GAAArE,MACS,GAAAqE,EAAAnD,aACT,OAAA9hF,KAAAg+E,IAAAiH,EAAArE,aACAuE,EAAA7H,EAmBA,IADA2E,EAAAjiF,KACAiiF,EAAA1C,IAAA0F,IAAA,CAGAC,EAAAzK,KAAApvB,IAAA,EAAAovB,KAAAY,MAAA4G,EAAAtC,WAAAsF,EAAAtF,aAWA,IAPA,IAAA2F,EAAA7K,KAAA5+B,KAAA4+B,KAAA8K,IAAAL,GAAAzK,KAAA+K,KACAC,EAAAH,GAAA,KAAAtE,EAAA,EAAAsE,EAAA,IAIAI,EAAArG,EAAA6F,GACAS,EAAAD,EAAA5H,IAAAmH,GACAU,EAAA7D,cAAA6D,EAAApC,GAAAtB,IAGA0D,GADAD,EAAArG,EADA6F,GAAAO,EACAzlF,KAAA4/E,WACA9B,IAAAmH,GAKAS,EAAA7D,WACA6D,EAAAnI,GAEA4H,IAAAv5D,IAAA85D,GACAzD,IAAApE,IAAA8H,GAEA,OAAAR,GASAxD,EAAA3D,IAAA2D,EAAAqD,OAOArD,EAAAiE,OAAA,SAAAX,GAKA,OAJAjF,EAAAiF,KACAA,EAAA3D,EAAA2D,IAGApF,EAOAnC,GANA19E,KAAA4/E,SAAAC,EAAAgG,MAAAhG,EAAAiG,OACA9lF,KAAA29E,IACA39E,KAAA49E,KACAqH,EAAAtH,IACAsH,EAAArH,MAEAiC,EAAAiF,WAAA9kF,KAAA4/E,UAGA5/E,KAAA69E,IAAA79E,KAAAg+E,IAAAiH,GAAAnH,IAAAmH,KASAtD,EAAAtD,IAAAsD,EAAAiE,OAQAjE,EAAAM,IAAAN,EAAAiE,OAMAjE,EAAA5C,IAAA,WACA,OAAArB,GAAA19E,KAAA29E,KAAA39E,KAAA49E,KAAA59E,KAAA4/E,WAQA+B,EAAApD,IAAA,SAAA3pD,GAGA,OAFAorD,EAAAprD,KACAA,EAAA0sD,EAAA1sD,IACA8oD,EAAA19E,KAAA29E,IAAA/oD,EAAA+oD,IAAA39E,KAAA49E,KAAAhpD,EAAAgpD,KAAA59E,KAAA4/E,WAQA+B,EAAAnD,GAAA,SAAA5pD,GAGA,OAFAorD,EAAAprD,KACAA,EAAA0sD,EAAA1sD,IACA8oD,EAAA19E,KAAA29E,IAAA/oD,EAAA+oD,IAAA39E,KAAA49E,KAAAhpD,EAAAgpD,KAAA59E,KAAA4/E,WAQA+B,EAAAjD,IAAA,SAAA9pD,GAGA,OAFAorD,EAAAprD,KACAA,EAAA0sD,EAAA1sD,IACA8oD,EAAA19E,KAAA29E,IAAA/oD,EAAA+oD,IAAA39E,KAAA49E,KAAAhpD,EAAAgpD,KAAA59E,KAAA4/E,WAQA+B,EAAAoE,UAAA,SAAAC,GAGA,OAFAhG,EAAAgG,KACAA,IAAApE,SACA,IAAAoE,GAAA,IACAhmF,KACAgmF,EAAA,GACAtI,EAAA19E,KAAA29E,KAAAqI,EAAAhmF,KAAA49E,MAAAoI,EAAAhmF,KAAA29E,MAAA,GAAAqI,EAAAhmF,KAAA4/E,UAEAlC,EAAA,EAAA19E,KAAA29E,KAAAqI,EAAA,GAAAhmF,KAAA4/E,WASA+B,EAAAhD,IAAAgD,EAAAoE,UAOApE,EAAAsE,WAAA,SAAAD,GAGA,OAFAhG,EAAAgG,KACAA,IAAApE,SACA,IAAAoE,GAAA,IACAhmF,KACAgmF,EAAA,GACAtI,EAAA19E,KAAA29E,MAAAqI,EAAAhmF,KAAA49E,MAAA,GAAAoI,EAAAhmF,KAAA49E,MAAAoI,EAAAhmF,KAAA4/E,UAEAlC,EAAA19E,KAAA49E,MAAAoI,EAAA,GAAAhmF,KAAA49E,MAAA,OAAA59E,KAAA4/E,WASA+B,EAAA9C,IAAA8C,EAAAsE,WAOAtE,EAAAuE,mBAAA,SAAAF,GAIA,GAHAhG,EAAAgG,KACAA,IAAApE,SAEA,KADAoE,GAAA,IAEA,OAAAhmF,KAEA,IAAA49E,EAAA59E,KAAA49E,KACA,OAAAoI,EAAA,GAEAtI,EADA19E,KAAA29E,MACAqI,EAAApI,GAAA,GAAAoI,EAAApI,IAAAoI,EAAAhmF,KAAA4/E,UAEAlC,EADS,KAAAsI,EACTpI,EAEAA,IAAAoI,EAAA,GAFA,EAAAhmF,KAAA4/E,WAYA+B,EAAA7C,KAAA6C,EAAAuE,mBAQAvE,EAAAwE,MAAAxE,EAAAuE,mBAMAvE,EAAAxD,SAAA,WACA,OAAAn+E,KAAA4/E,SAEAlC,EAAA19E,KAAA29E,IAAA39E,KAAA49E,MAAA,GADA59E,MAQA2hF,EAAAzD,WAAA,WACA,OAAAl+E,KAAA4/E,SACA5/E,KACA09E,EAAA19E,KAAA29E,IAAA39E,KAAA49E,MAAA,IAQA+D,EAAAyE,QAAA,SAAA/C,GACA,OAAAA,EAAArjF,KAAAqmF,YAAArmF,KAAAsmF,aAOA3E,EAAA0E,UAAA,WACA,IAAA5I,EAAAz9E,KAAA49E,KACAJ,EAAAx9E,KAAA29E,IACA,OACA,IAAAH,EACAA,IAAA,MACAA,IAAA,OACAA,IAAA,GACA,IAAAC,EACAA,IAAA,MACAA,IAAA,OACAA,IAAA,KAQAkE,EAAA2E,UAAA,WACA,IAAA7I,EAAAz9E,KAAA49E,KACAJ,EAAAx9E,KAAA29E,IACA,OACAF,IAAA,GACAA,IAAA,OACAA,IAAA,MACA,IAAAA,EACAD,IAAA,GACAA,IAAA,OACAA,IAAA,MACA,IAAAA,IAWAH,EAAAkJ,UAAA,SAAAr9C,EAAA02C,EAAAyD,GACA,OAAAA,EAAAhG,EAAAmJ,YAAAt9C,EAAA02C,GAAAvC,EAAAoJ,YAAAv9C,EAAA02C,IASAvC,EAAAmJ,YAAA,SAAAt9C,EAAA02C,GACA,WAAAvC,EACAn0C,EAAA,GACAA,EAAA,MACAA,EAAA,OACAA,EAAA,OACAA,EAAA,GACAA,EAAA,MACAA,EAAA,OACAA,EAAA,OACA02C,IAUAvC,EAAAoJ,YAAA,SAAAv9C,EAAA02C,GACA,WAAAvC,EACAn0C,EAAA,OACAA,EAAA,OACAA,EAAA,MACAA,EAAA,GACAA,EAAA,OACAA,EAAA,OACAA,EAAA,MACAA,EAAA,GACA02C,qRC7xCA,IAAArjE,EAAApc,EAAA,GAIAsc,EAAAtc,EAAA,GASAqc,EAAArc,EAAA,GAMAuc,EAAAvc,EAAA,GAcAs7C,EAAAt7C,EAAA,GAWAwc,EAAAxc,EAAA,IAIAsG,EAAAtG,EAAA,GAKA,SAAgB68D,EACd0pB,EACAzkF,EACAmG,EACAogC,EACA2sB,EACA1H,GAEA,IAEIppD,EACAC,EACAC,EACAouC,EALAhzC,EAAS+mF,EAAS/mF,OAWtB,OAAQsC,EAAU8gB,cAIhB,IAAK,YACH,IAAIza,EAAOq+E,EAAqBD,EAAUt+E,EAAeogC,EAAUilB,GAEnE,OADAi5B,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACvBtZ,EACEA,EAAKP,GAAE,KAAwBO,EAAKP,GAAE,KACzCpI,EAAO2nC,UAAU,GACjB3nC,EAAO2nC,UAAU,GAHH3nC,EAAO6sC,oBAK3B,IAAK,UACClkC,EAAOq+E,EAAqBD,EAAUt+E,EAAeogC,EAAUilB,GAEnE,OADAi5B,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACvBtZ,EACEA,EAAKP,GAAE,GACVpI,EAAO2nC,UAAU,GACjB3nC,EAAO2nC,UAAU,GAHH3nC,EAAO6sC,oBAK3B,IAAK,WACClkC,EAAOq+E,EAAqBD,EAAUt+E,EAAeogC,EAAUilB,GAEnE,OADAi5B,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACvBtZ,EACEA,EAAKP,GAAE,GACVpI,EAAO2nC,UAAU,GACjB3nC,EAAO2nC,UAAU,GAHH3nC,EAAO6sC,oBAK3B,IAAK,cACClkC,EAAOq+E,EAAqBD,EAAUt+E,EAAeogC,EAAUilB,GAEnE,OADAi5B,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACvBtZ,GACLo+E,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACrBtZ,EAAKP,GAAE,KACVpI,EAAO2nC,UAAU,GACjB3nC,EAAO2nC,UAAU,IAJH3nC,EAAO6sC,oBAM3B,IAAK,WACClkC,EAAOq+E,EAAqBD,EAAUt+E,EAAeogC,EAAUilB,GAEnE,GADAi5B,EAASh8B,YAAcluC,EAAAyE,KAAKW,MACvBtZ,EAAM,OAAO3I,EAAO6sC,oBAEzB,GADI+P,EAAYj0C,EAAKwzC,eACN,CACb,IAAIh8B,EAAiB4mE,EAASn6D,QAAQzM,eACtC,GAAIA,GAAkBy8B,EAAUxqB,eAAejS,GAAiB,OAAOngB,EAAO2nC,UAAU,GAE1F,OAAO3nC,EAAO2nC,UAAU,GAE1B,IAAK,UACCh/B,EAAOq+E,EAAqBD,EAAUt+E,EAAeogC,EAAUilB,GAEnE,OADAi5B,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACvBtZ,EAEgB,QADjBi0C,EAAYj0C,EAAKwzC,iBAC+D,OAAvDS,EAAUrqB,eAAeupB,EAAAn/B,aAAaW,aAC/Dtd,EAAO2nC,UAAU,GACjB3nC,EAAO2nC,UAAU,GAJH3nC,EAAO6sC,oBAM3B,IAAK,YAQH,GAPAk6C,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACxBxZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,OAKX,OAJAohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,IAAIngC,EAAUq6E,EAASlmE,SAASm6C,kBAAkBnyB,EAAS,GAAIk+C,EAAS7zD,gBAAiBlW,EAAAyoD,WAAWwhB,SACpG,OAAOjnF,EAAO2nC,UAAUj7B,EAAU,EAAI,GAExC,IAAK,aAQH,GAPAq6E,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACxBxZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,OAKX,OAJAohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,IAAIq6C,EAAOH,EAAS93B,4BAA4BpmB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,GAErE,OADAslE,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACrBjiB,EAAO2nC,UAAU5qB,EAAA2Y,gBAAgBwxD,IAASnqE,EAAA4Y,aAAa+C,MAAQ,EAAI,GAE5E,IAAK,YACH,IAAKquD,EAASn6D,QAAQrM,MAEpB,OADAwmE,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACrBjiB,EAAO2nC,UAAU,GAEtBh/B,EAAOq+E,EAAqBD,EAAUt+E,EAAeogC,EAAUilB,GAEnE,OADAi5B,EAASh8B,YAAcluC,EAAAyE,KAAKW,KACvBtZ,EAEgB,QADjBi0C,EAAYj0C,EAAKwzC,iBACSS,EAAU70B,aAAa+zB,EAAAx8B,eAAezI,WAEhE7W,EAAO2nC,UAAU,GADjB3nC,EAAO2nC,UAAU,GAHH3nC,EAAO6sC,oBAS3B,IAAK,MACH,GAAuB,GAAnBhE,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,KAEzD,OAAQslE,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACA,OACE4rC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQG,OAAQl1B,GACzC,MAEF,QACA,OACA,OACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQG,OAAQl1B,GACzC,MAEF,OACE,GAAIqiF,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,OACEmG,EAAMhzC,EAAOuoC,YACXw+C,EAAS1lE,QAAQkB,SACbxF,EAAA0c,QAAQwwC,OACRltD,EAAA0c,QAAQG,OACZl1B,GAEF,MAEF,OACA,OACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQwwC,OAAQvlE,GACzC,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,MACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,KAEzD,OAAQslE,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACA,OACE4rC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQI,OAAQn1B,GACzC,MAEF,QACA,OACA,OACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQI,OAAQn1B,GACzC,MAEF,OACE,GAAIqiF,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,OACEmG,EAAMhzC,EAAOuoC,YACXw+C,EAAS1lE,QAAQkB,SACbxF,EAAA0c,QAAQywC,OACRntD,EAAA0c,QAAQI,OACZn1B,GAEF,MAEF,OACA,OACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQywC,OAAQxlE,GACzC,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,SACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,KAEzD,OAAQslE,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACA,OACE4rC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQK,UAAWp1B,GAC5C,MAEF,QACA,OACA,OACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQK,UAAWp1B,GAC5C,MAEF,OACE,GAAIqiF,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,OACEmG,EAAMhzC,EAAOuoC,YACXw+C,EAAS1lE,QAAQkB,SACbxF,EAAA0c,QAAQ0wC,UACRptD,EAAA0c,QAAQK,UACZp1B,GAEF,MAEF,OACA,OACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQ0wC,UAAWzlE,GAC5C,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,OACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,KAGzD,OADA9c,EAAOoiF,EAASx3B,kBAAkB1mB,EAAS,GAAIk+C,EAASh8B,YAAW,KAC3Dg8B,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACA,OACA,QACE4rC,EAAM+zC,EAASlwB,uBACb72D,EAAO0oC,aAAa3rB,EAAAwZ,SAASu0C,QAASpmE,EAAMC,GAC5CoiF,EAASh8B,aAIb,OACA,OACE/X,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAASu0C,QAASpmE,EAAMC,GAClD,MAEF,OACE,GAAIoiF,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,OACEmG,EAAMhzC,EAAO0oC,aACXq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAASy0C,QACTjuD,EAAAwZ,SAASu0C,QACbpmE,EACAC,GAEF,MAEF,OACA,OACEquC,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAASy0C,QAAStmE,EAAMC,GAClD,MAEF,QACEoiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,OACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,KAGzD,OADA9c,EAAOoiF,EAASx3B,kBAAkB1mB,EAAS,GAAIk+C,EAASh8B,YAAW,KAC3Dg8B,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACA,OACA,QACE4rC,EAAM+zC,EAASlwB,uBACb72D,EAAO0oC,aAAa3rB,EAAAwZ,SAASw0C,QAASrmE,EAAMC,GAC5CoiF,EAASh8B,aAEX,MAEF,OACA,OACE/X,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAASw0C,QAASrmE,EAAMC,GAClD,MAEF,OACE,GAAIoiF,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,OACEmG,EAAMhzC,EAAO0oC,aACXq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAAS00C,QACTluD,EAAAwZ,SAASw0C,QACbrmE,EACAC,GAEF,MAEF,OACA,OACEquC,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAAS00C,QAASvmE,EAAMC,GAClD,MAEF,QACEoiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,MACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAEzD,OAAQ4kE,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OAEE,IAAI+sD,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKG,KAAK,GACvEuxB,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,GACvC1E,EAAO0oC,aAAa3rB,EAAAwZ,SAASyiC,OAC3Bh5D,EAAO2nC,UAAU,GACjB3nC,EAAOgpC,eAAemrB,EAAU1mC,MAAK,IAEvCztB,EAAO0oC,aAAa3rB,EAAAwZ,SAASqB,MAC3B53B,EAAOgpC,eAAemrB,EAAU1mC,MAAK,GACrCztB,EAAO2nC,UAAU,KAGrB,MAEF,OACMwsB,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoBq2D,EAAS1lE,QAAQW,WAAW,GACzFgxB,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,GACvC1E,EAAO0oC,aACLq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAAS0iC,OACTl8C,EAAAwZ,SAASyiC,OACb+tB,EAAS1lE,QAAQW,UAAUq7B,aAAar9C,GACxCA,EAAOgpC,eAAemrB,EAAU1mC,MAAOs5D,EAAS1lE,QAAQ6rC,iBAE1DltD,EAAO0oC,aACLq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAASuB,MACT/a,EAAAwZ,SAASqB,MACb53B,EAAOgpC,eAAemrB,EAAU1mC,MAAOs5D,EAAS1lE,QAAQ6rC,gBACxD65B,EAAS1lE,QAAQW,UAAUq7B,aAAar9C,KAG5C,MAEF,OACMm0D,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKI,KAAK,GACvEsxB,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,GACvC1E,EAAO0oC,aAAa3rB,EAAAwZ,SAAS0iC,OAC3Bj5D,EAAO+nC,UAAU,EAAG,GACpB/nC,EAAOgpC,eAAemrB,EAAU1mC,MAAK,IAEvCztB,EAAO0oC,aAAa3rB,EAAAwZ,SAASuB,MAC3B93B,EAAOgpC,eAAemrB,EAAU1mC,MAAK,GACrCztB,EAAO+nC,UAAU,EAAG,KAGxB,MAEF,OACE,GAAIg/C,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,OACA,OACA,OACA,OACA,QACEmG,EAAMtuC,EACN,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQkwC,OAAQjlE,GACzC,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQ2wC,OAAQ1lE,GACzC,MAEF,QACEsuC,EAAMhzC,EAAO6sC,oBACb,MAEF,QACEk6C,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,MACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAGzD,OADAxd,EAAOoiF,EAASx3B,kBAAkB1mB,EAAS,GAAIk+C,EAASh8B,YAAW,KAC3Dg8B,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACE,IAAI4oB,EAAO+2D,EAAS7zD,gBAAgBlD,KAChCm3D,EAAaJ,EAAS7zD,gBAAgB/C,aACxC42D,EAASh8B,aACR/6B,EAAKyF,YAAY/wB,EAAMqiF,EAASh8B,cAE/Bq8B,EAAaL,EAAS7zD,gBAAgBxC,oBACxCq2D,EAASh8B,aACR/6B,EAAKyF,YAAY9wB,EAAMoiF,EAASh8B,cAEnCg8B,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASqB,MAC3B53B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACA,OACA,OACA,QACMuC,EAAO+2D,EAAS7zD,gBAAgBlD,KAChCm3D,EAAaJ,EAAS7zD,gBAAgB/C,aACxC42D,EAASh8B,aACR/6B,EAAKyF,YAAY/wB,EAAMqiF,EAASh8B,cAE/Bq8B,EAAaL,EAAS7zD,gBAAgBxC,oBACxCq2D,EAASh8B,aACR/6B,EAAKyF,YAAY9wB,EAAMoiF,EAASh8B,cAEnCg8B,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASsB,MAC3B73B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACM05D,EAAaJ,EAAS7zD,gBAAgB/C,aAAatT,EAAAyE,KAAKI,KAAK,GAC7D0lE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKI,KAAK,GACxEqlE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASuB,MAC3B93B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACM05D,EAAaJ,EAAS7zD,gBAAgB/C,aAAatT,EAAAyE,KAAKI,KAAK,GAC7D0lE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKI,KAAK,GACxEqlE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASwB,MAC3B/3B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACM05D,EAAaJ,EAAS7zD,gBAAgB/C,aAAa42D,EAAS1lE,QAAQW,WAAW,GAC/EolE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoBq2D,EAAS1lE,QAAQW,WAAW,GAC1F+kE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aACLq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAASuB,MACT/a,EAAAwZ,SAASqB,MACb53B,EAAOgpC,eAAem+C,EAAW15D,MAAOs5D,EAAS1lE,QAAQ6rC,gBACzDltD,EAAOgpC,eAAeo+C,EAAW35D,MAAOs5D,EAAS1lE,QAAQ6rC,kBAG7D,MAEF,OACE,GAAI65B,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAEEs6C,EAAaJ,EAAS7zD,gBAAgB/C,aAAa42D,EAAS1lE,QAAQW,WAAW,GAC/EolE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoBq2D,EAAS1lE,QAAQW,WAAW,GAC1F+kE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aACLq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAASwB,MACThb,EAAAwZ,SAASsB,MACb73B,EAAOgpC,eAAem+C,EAAW15D,MAAOs5D,EAAS1lE,QAAQ6rC,gBACzDltD,EAAOgpC,eAAeo+C,EAAW35D,MAAOs5D,EAAS1lE,QAAQ6rC,kBAG7D,MAEF,QACEla,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAAS60C,OAAQ1mE,EAAMC,GACjD,MAEF,QACEquC,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAASg1C,OAAQ7mE,EAAMC,GACjD,MAEF,QACEoiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,MACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAGzD,OADAxd,EAAOoiF,EAASx3B,kBAAkB1mB,EAAS,GAAIk+C,EAASh8B,YAAW,KAC3Dg8B,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACM4oB,EAAO+2D,EAAS7zD,gBAAgBlD,KAChCm3D,EAAaJ,EAAS7zD,gBAAgB/C,aACxC42D,EAASh8B,aACR/6B,EAAKyF,YAAY/wB,EAAMqiF,EAASh8B,cAE/Bq8B,EAAaL,EAAS7zD,gBAAgBxC,oBACxCq2D,EAASh8B,aACR/6B,EAAKyF,YAAY9wB,EAAMoiF,EAASh8B,cAEnCg8B,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASS,MAC3Bh3B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACA,OACA,OACA,QACMuC,EAAO+2D,EAAS7zD,gBAAgBlD,KAChCm3D,EAAaJ,EAAS7zD,gBAAgB/C,aACxC42D,EAASh8B,aACR/6B,EAAKyF,YAAY/wB,EAAMqiF,EAASh8B,cAE/Bq8B,EAAaL,EAAS7zD,gBAAgBxC,oBACxCq2D,EAASh8B,aACR/6B,EAAKyF,YAAY9wB,EAAMoiF,EAASh8B,cAEnCg8B,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASU,MAC3Bj3B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACM05D,EAAaJ,EAAS7zD,gBAAgB/C,aAAatT,EAAAyE,KAAKI,KAAK,GAC7D0lE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKI,KAAK,GACxEqlE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASW,MAC3Bl3B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACM05D,EAAaJ,EAAS7zD,gBAAgB/C,aAAatT,EAAAyE,KAAKI,KAAK,GAC7D0lE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKI,KAAK,GACxEqlE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aAAa3rB,EAAAwZ,SAASY,MAC3Bn3B,EAAOgpC,eAAem+C,EAAW15D,MAAK,GACtCztB,EAAOgpC,eAAeo+C,EAAW35D,MAAK,KAG1C,MAEF,OACM05D,EAAaJ,EAAS7zD,gBAAgB/C,aAAa42D,EAAS1lE,QAAQW,WAAW,GAC/EolE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoBq2D,EAAS1lE,QAAQW,WAAW,GAC1F+kE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aACLq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAASW,MACTna,EAAAwZ,SAASS,MACbh3B,EAAOgpC,eAAem+C,EAAW15D,MAAOs5D,EAAS1lE,QAAQ6rC,gBACzDltD,EAAOgpC,eAAeo+C,EAAW35D,MAAOs5D,EAAS1lE,QAAQ6rC,kBAG7D,MAEF,OACE,GAAI65B,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAEEs6C,EAAaJ,EAAS7zD,gBAAgB/C,aAAa42D,EAAS1lE,QAAQW,WAAW,GAC/EolE,EAAaL,EAAS7zD,gBAAgBxC,oBAAoBq2D,EAAS1lE,QAAQW,WAAW,GAC1F+kE,EAAS7zD,gBAAgBzC,cAAc02D,GACvCn0C,EAAMhzC,EAAOisC,aACXjsC,EAAOkpC,eAAei+C,EAAW15D,MAAO/oB,GACxC1E,EAAOkpC,eAAek+C,EAAW35D,MAAO9oB,GACxC3E,EAAO0oC,aACLq+C,EAAS1lE,QAAQkB,SACbxF,EAAAwZ,SAASY,MACTpa,EAAAwZ,SAASU,MACbj3B,EAAOgpC,eAAem+C,EAAW15D,MAAOs5D,EAAS1lE,QAAQ6rC,gBACzDltD,EAAOgpC,eAAeo+C,EAAW35D,MAAOs5D,EAAS1lE,QAAQ6rC,kBAG7D,MAEF,QACEla,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAAS40C,OAAQzmE,EAAMC,GACjD,MAEF,QACEquC,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAAS+0C,OAAQ5mE,EAAMC,GACjD,MAEF,QACEoiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,OACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAEzD,OAAQ4kE,EAASh8B,YAAY3jD,MAC3B,OACE,GAAI2/E,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,QACEmG,EAAMtuC,EACN,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQmwC,QAASllE,GAC1C,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQ4wC,QAAS3lE,GAC1C,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,QACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAEzD,OAAQ4kE,EAASh8B,YAAY3jD,MAC3B,OACE,GAAI2/E,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,QACEmG,EAAMtuC,EACN,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQowC,SAAUnlE,GAC3C,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQ6wC,SAAU5lE,GAC3C,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,WACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAGzD,OADAxd,EAAOoiF,EAASx3B,kBAAkB1mB,EAAS,GAAIk+C,EAASh8B,YAAW,KAC3Dg8B,EAASh8B,YAAY3jD,MAC3B,QACE4rC,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAAS20C,YAAaxmE,EAAMC,GACtD,MAEF,QACEquC,EAAMhzC,EAAO0oC,aAAa3rB,EAAAwZ,SAAS80C,YAAa3mE,EAAMC,GACtD,MAEF,QACEoiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,UACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAEzD,OAAQ4kE,EAASh8B,YAAY3jD,MAC3B,OACE,GAAI2/E,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,QACEmG,EAAMtuC,EACN,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQswC,WAAYrlE,GAC7C,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQ+wC,WAAY9lE,GAC7C,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,cACH,GAAuB,GAAnBnK,EAASljC,OAYX,OAXM8C,GAAyC,GAAxBA,EAAc9C,SAC/B8C,GAAiBA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAChFs+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,MAG/E6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,IAAMpkC,GAAyC,GAAxBA,EAAc9C,OAMnC,OALI8C,GAAiBA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAChFs+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAEtElF,EAAO6sC,oBAEhB,OAAQpkC,EAAc,GAAGrB,MACvB,OACA,OACE1C,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKY,IAAG,KACvD8wB,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQixC,eAAgBhmE,GACjD,MAEF,OACA,OACEA,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KACvD6wB,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQkxC,eAAgBjmE,GACjD,MAEF,OACE,GAAI+D,EAAc,GAAGL,GAAE,KAMrB,OALA2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbsiF,EAASh8B,YAActiD,EAAc,GAC9BzI,EAAO6sC,oBAIlB,OACEnoC,EAAOqiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQkB,SACb1F,EAAAyE,KAAKa,IACLtF,EAAAyE,KAAKY,IAAG,KAId8wB,EAAMhzC,EAAOuoC,YACXw+C,EAAS1lE,QAAQkB,SACbxF,EAAA0c,QAAQkxC,eACR5tD,EAAA0c,QAAQixC,eACZhmE,GAEF,MAEF,QACEA,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,KACvDuxB,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQmxC,eAAgBlmE,GACjD,MAEF,QACEA,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKI,IAAG,KACvDsxB,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQoxC,eAAgBnmE,GACjD,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAKjB,OADAk6C,EAASh8B,YAActiD,EAAc,GAC9BuqC,EAET,IAAK,OACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAEzD,OAAQ4kE,EAASh8B,YAAY3jD,MAC3B,QACE4rC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQuwC,QAAStlE,GAC1C,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQgxC,QAAS/lE,GAC1C,MAGF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,QACH,GAAuB,GAAnBnK,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,GAAiBA,EAAc9C,OAAQ,CAEzC,GADAohF,EAASh8B,YAActiD,EAAc,GACT,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKa,IAAG,KAEzD,OAAQ4kE,EAASh8B,YAAY3jD,MAC3B,OACE,GAAI2/E,EAASh8B,YAAY3iD,GAAE,KAAuB,CAChD2+E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBACb,MAIJ,QACEmG,EAAMtuC,EACN,MAGF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQqwC,SAAUplE,GAC3C,MAEF,QACEsuC,EAAMhzC,EAAOuoC,YAAYxrB,EAAA0c,QAAQ8wC,SAAU7lE,GAC3C,MAEF,QACEqiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAKT,IAAK,OACH,OAAInK,EAASljC,OAAS,GAAKkjC,EAASljC,OAAS,GACrC8C,GAAyC,GAAxBA,EAAc9C,QACnCohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAG3E2jC,EAASljC,OAAS,EACpBohF,EAASngF,MACPgW,EAAAzY,eAAes5D,wCACf3P,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAGlD6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAG7ClF,EAAO6sC,qBAEVpkC,GAAyC,GAAxBA,EAAc9C,QAQrCjB,EAAOqiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,MAIxBgkB,EAA4B,GAAnB6C,EAASljC,OAAc0hF,EAAuBN,EAAUl+C,EAAS,IAAM,GACvE,EACJ7oC,EAAO6sC,qBAEhBk6C,EAASh8B,YAActiD,EAAc,GAC9BzI,EAAOspC,WACZ7gC,EAAc,GAAGoe,SACjBpe,EAAc,GAAGL,GAAG,GACpB1D,EACA+D,EAAc,GAAGL,GAAE,IACnBotD,EAAeptD,GAAE,IACjBotD,EAAev8B,KAAOxwB,EAAc,GAAGwwB,MAClC8tD,EAASh8B,YAAcyK,GAAgBllC,gBACvCy2D,EAASh8B,YAActiD,EAAc,IAAI6nB,eAC9C0V,MA3BIv9B,GAAiBA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAChFs+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAEtElF,EAAO6sC,qBAyBlB,IAAK,QAEH,GADAk6C,EAASh8B,YAAcluC,EAAAyE,KAAKc,KACxBymB,EAASljC,OAAS,GAAKkjC,EAASljC,OAAS,EAkB3C,OAjBM8C,GAAyC,GAAxBA,EAAc9C,QACnCohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAG3E2jC,EAASljC,OAAS,EACpBohF,EAASngF,MACPgW,EAAAzY,eAAes5D,wCACf3P,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAGlD6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAG7ClF,EAAO6sC,oBAEhB,IAAMpkC,GAAyC,GAAxBA,EAAc9C,OAKnC,OAJAohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAEtElF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,KAI5Brd,EAAOoiF,EAASx3B,kBACd1mB,EAAS,GACTpgC,EAAc,GACdA,EAAc,GAAGL,GAAE,GAChB,EACA,EAAwB,GAGzBO,OAAI,EAoBR,OAlBEF,EAAc,GAAGL,GAAE,MAEhB2+E,EAASh8B,YAAY3iD,GAAE,IACxB2+E,EAASh8B,YAAY9xB,KAAOxwB,EAAc,GAAGwwB,OAG/Ct0B,EAAOoiF,EAASnwB,kBACdjyD,EACAoiF,EAASh8B,YAAatiD,EAAc,GAAE,IAGtCogC,EAAS,IAEXlgC,EAAOF,EAAc,IAErBE,EAAOo+E,EAASh8B,aAEd/kB,EAA4B,GAAnB6C,EAASljC,OAAc0hF,EAAuBN,EAAUl+C,EAAS,IAAM,GACvE,EACJ7oC,EAAO6sC,qBAEhBk6C,EAASh8B,YAAcluC,EAAAyE,KAAKc,KACrBpiB,EAAO2pC,YAAYlhC,EAAc,GAAGoe,SAAUniB,EAAMC,EAAMgE,EAAK2nB,eAAgB0V,IAExF,IAAK,SAEH,GADA+gD,EAASh8B,YAAcg8B,EAAS1lE,QAAQW,UACjB,GAAnB6mB,EAASljC,OAWX,OAVM8C,GAAyC,GAAxBA,EAAc9C,QACnCohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAG/E6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEVpkC,GAAyC,GAAxBA,EAAc9C,QACnCohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAG/E,IAAI2hB,EAAoBpe,EAAe,GAAGoe,SAkB1C,OAjBIkgE,EAAS1lE,QAAQkB,SAEfizC,EAAeptD,GAAE,IAAuBotD,EAAev8B,MAAQ,IACjE8tD,EAASh8B,YAAcluC,EAAAyE,KAAKQ,IAC5BkxB,EAAMhzC,EAAO2nC,UAAU9gB,IAEvBmsB,EAAMhzC,EAAO+nC,UAAUlhB,EAAU,GAI/B2uC,EAAeptD,GAAE,IAA8C,IAAvBotD,EAAev8B,MACzD8tD,EAASh8B,YAAcluC,EAAAyE,KAAKS,IAC5BixB,EAAMhzC,EAAO+nC,UAAUlhB,EAAU,IAEjCmsB,EAAMhzC,EAAO2nC,UAAU9gB,GAGpBmsB,EAET,IAAK,UAEH,GADA+zC,EAASh8B,YAAcg8B,EAAS1lE,QAAQW,UACjB,GAAnB6mB,EAASljC,OAWX,OAVM8C,GAAyC,GAAxBA,EAAc9C,QACnCohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAG/E6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,IAAMpkC,GAAyC,GAAxBA,EAAc9C,OAKnC,OAJAohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAEtElF,EAAO6sC,oBAEhB,IACIy6C,OAAS,EACb,OAFIzgE,EAAoBpe,EAAe,GAAGoe,UAGxC,KAAK,EAAKygE,EAAY,EAAG,MACzB,KAAK,EAAKA,EAAY,EAAG,MACzB,KAAK,EAAKA,EAAY,EAAG,MACzB,KAAK,EAAKA,EAAY,EAAG,MACzB,QAA0B,OAAfxjF,QAAO,GAAe9D,EAAO6sC,oBAmB1C,OAjBIk6C,EAAS1lE,QAAQkB,SAEfizC,EAAeptD,GAAE,IAAuBotD,EAAev8B,MAAQ,IACjE8tD,EAASh8B,YAAcluC,EAAAyE,KAAKQ,IAC5BkxB,EAAMhzC,EAAO2nC,UAAU2/C,IAEvBt0C,EAAMhzC,EAAO+nC,UAAUu/C,EAAW,GAIhC9xB,EAAeptD,GAAE,IAA8C,IAAvBotD,EAAev8B,MACzD8tD,EAASh8B,YAAcluC,EAAAyE,KAAKS,IAC5BixB,EAAMhzC,EAAO+nC,UAAUu/C,EAAW,IAElCt0C,EAAMhzC,EAAO2nC,UAAU2/C,GAGpBt0C,EAET,IAAK,WAEH,GADA+zC,EAASh8B,YAAcg8B,EAAS1lE,QAAQW,UACpC6mB,EAASljC,OAAS,EAWpB,OAVM8C,GAAyC,GAAxBA,EAAc9C,QACnCohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAG/E6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,IAAMpkC,GAAyC,GAAxBA,EAAc9C,OAKnC,OAJAohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAEtElF,EAAO6sC,oBAEhB,IAAI+P,EACJ,KADIA,EAAYn0C,EAAc,GAAG0zC,gBAM/B,OAJA4qC,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAENzE,EAAO6sC,oBAEhB,IAAI7G,OAAM,EACV,GAAI6C,EAASljC,OAAQ,CACnB,GACEkjC,EAAS,GAAGzhC,MAAQ0V,EAAA5V,SAASG,SACTwhC,EAAS,GAAIpxB,aAAeqF,EAAAvF,YAAYkB,OAM5D,OAJAsuE,EAASngF,MACPgW,EAAAzY,eAAemmB,wBACfue,EAAS,GAAGpkC,OAEPzE,EAAO6sC,oBAEhB,IAAIja,EAAsCiW,EAAS,GAAIlnC,MACnDkxB,EAAQ+pB,EAAUvsC,QAAUusC,EAAUvsC,QAAQ9O,IAAIqxB,GAAa,KACnE,IAAMC,GAASA,EAAMzrB,MAAQ00C,EAAAz8B,YAAYoS,MAKvC,OAJAs1D,EAASngF,MACPgW,EAAAzY,eAAeojF,yBACf1+C,EAAS,GAAGpkC,MAAOm4C,EAAUx5B,aAAcwP,GAEtC5yB,EAAO6sC,oBAEhB7G,EAAiBnT,EAAOnB,kBAExBsU,EAAS4W,EAAU/qB,oBAErB,OAAIk1D,EAAS1lE,QAAQkB,SAEfizC,EAAeptD,GAAE,IAAuBotD,EAAev8B,MAAQ,IACjE8tD,EAASh8B,YAAcluC,EAAAyE,KAAKQ,IACrB9hB,EAAO2nC,UAAU3B,IAEjBhmC,EAAO+nC,UAAU/B,GAItBwvB,EAAeptD,GAAE,IAA8C,IAAvBotD,EAAev8B,MACzD8tD,EAASh8B,YAAcluC,EAAAyE,KAAKS,IACrB/hB,EAAO+nC,UAAU/B,IAEjBhmC,EAAO2nC,UAAU3B,GAO9B,IAAK,SACH,GAAuB,GAAnB6C,EAASljC,OAcX,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAAS93B,4BAA4BpmB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,GAE/D9Y,EAAOo+E,EAASh8B,YAOpB,OANApmD,EAAOoiF,EAASx3B,kBAAkB1mB,EAAS,GAAIlgC,EAAI,KACnD/D,EAAOmiF,EAASh0B,cACdg0B,EAAS93B,4BAA4BpmB,EAAS,GAAIhsB,EAAAyE,KAAKW,KAAI,GAC3D8kE,EAASh8B,aAEXg8B,EAASh8B,YAAcpiD,EACfo+E,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACA,OACA,QAIA,QACE4rC,EAAMhzC,EAAOisC,aAAavnC,EAAMC,EAAMC,GACtC,MAEF,QACEmiF,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMhzC,EAAO6sC,oBAIjB,OAAOmG,EAET,IAAK,cAaH,OAZuB,GAAnBnK,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAGhDuD,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGzBpjB,EAAO6sC,oBAKhB,IAAK,cAcH,OAbAk6C,EAASh8B,YAAcluC,EAAAyE,KAAKG,IACL,GAAnBonB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAGhDuD,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGzBpjB,EAAO4oC,WAAW7rB,EAAAqoB,OAAOsmC,eAElC,IAAK,cAiBH,OAhBAqb,EAASh8B,YAAcluC,EAAAyE,KAAKG,IACL,GAAnBonB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElDR,EAAO1E,EAAO6sC,qBAEdnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIhsB,EAAAyE,KAAKG,IAAG,KAErDhZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGzBpjB,EAAO4oC,WAAW7rB,EAAAqoB,OAAOumC,WAAY,MAAQjnE,IAGtD,IAAK,cAOH,GANI+D,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,OAMX,OALAohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKc,KACrBpiB,EAAO6sC,oBAqBhB,MAnBAnoC,EAAOqiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,KAI5Brd,EAAOoiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,KAI5Bpd,EAAOmiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,KAI5B+kE,EAASh8B,YAAcluC,EAAAyE,KAAKc,KACtB,IAAI2D,MAAM,mBAGlB,IAAK,cAOH,GANItd,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,OAMX,OALAohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKc,KACrBpiB,EAAO6sC,oBAqBhB,MAnBAnoC,EAAOqiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,KAI5Brd,EAAOoiF,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKQ,IAAG,KAIVld,EAAOmiF,EAASx3B,kBACd1mB,EAAS,GACTk+C,EAAS1lE,QAAQW,UAAS,KAI5B+kE,EAASh8B,YAAcluC,EAAAyE,KAAKc,KACtB,IAAI2D,MAAM,mBAMlB,IAAK,aACH,OAAMtd,GAAyC,GAAxBA,EAAc9C,OAQd,GAAnBkjC,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAActiD,EAAc,GAC9BzI,EAAO6sC,sBAEhBnoC,EAAOqiF,EAAS93B,4BACdpmB,EAAS,GACTpgC,EAAc,GAAE,GAGlBs+E,EAASh8B,YAActiD,EAAc,GACjCs+E,EAASh8B,YAAY9xB,MAAQxwB,EAAc,GAAGwwB,MAChD8tD,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAENzE,EAAO6sC,qBAITnoC,IA9BD+D,GAAiBA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAChFs+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAEtElF,EAAO6sC,qBA2BlB,IAAK,SACH,GAAIhE,EAASljC,OAAS,GAAKkjC,EAASljC,OAAS,EAqB3C,OApBI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,GAAG2zC,iBACtC,GAAxB3zC,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAIvD2jC,EAASljC,OAAS,EACpBohF,EAASngF,MACPgW,EAAAzY,eAAes5D,wCACf3P,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAEzC2jC,EAASljC,OAAS,GAC3BohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAG7ClF,EAAO6sC,oBAEhB,GAAIpkC,EAAe,CAEjB,GADIA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,GAAG2zC,iBACtC,GAAxB3zC,EAAc9C,OAKhB,OAJAohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBnoC,EAAOqiF,EAASx3B,kBAAkB1mB,EAAS,GAAIpgC,EAAc,GAAE,UAE/D/D,EAAOqiF,EAAS93B,4BAA4BpmB,EAAS,GAAIhsB,EAAAyE,KAAKW,KAAI,GAGhEtZ,EAAOo+E,EAASh8B,YAIpB,GAHAg8B,EAASh8B,YAAcpiD,EAAKyzC,gBAGxB2qC,EAAS1lE,QAAQoB,SACnB,OAAI+yC,GAAkB34C,EAAAyE,KAAKc,MACzB2kE,EAASh8B,YAAcluC,EAAAyE,KAAKc,KACrBpiB,EAAO6rC,aAETnnC,EAGT,IAAI8iF,EAAQxyB,EAAa+xB,EAA6B,GAAnBl+C,EAASljC,OAAckjC,EAAS,GAAK,KAAMilB,GAI9E,GAFAi5B,EAASh8B,YAAcpiD,EAAKyzC,gBAExBoZ,GAAkB34C,EAAAyE,KAAKc,KAAM,CAC/B,OAAQ2kE,EAASh8B,YAAY3jD,MAC3B,QACE4rC,EAAMhzC,EAAO2rC,SACX3rC,EAAOuoC,YAAYxrB,EAAA0c,QAAQC,OACzBh1B,GAEF8iF,GAEF,MAEF,OACA,OACEx0C,EAAMhzC,EAAO2rC,SACX3rC,EAAOuoC,YAAYxrB,EAAA0c,QAAQE,OACzBj1B,GAEF8iF,GAEF,MAEF,OACA,OACEx0C,EAAMhzC,EAAO2rC,SACX3rC,EAAOuoC,YACLw+C,EAAS1lE,QAAQkB,SACbxF,EAAA0c,QAAQE,OACR5c,EAAA0c,QAAQC,OACZh1B,GAEF8iF,GAEF,MAGF,QACEx0C,EAAMhzC,EAAO2rC,SACX3rC,EAAO0oC,aAAa3rB,EAAAwZ,SAASG,MAC3BhyB,EACA1E,EAAOmoC,UAAU,IAEnBq/C,GAEF,MAEF,QACEx0C,EAAMhzC,EAAO2rC,SACX3rC,EAAO0oC,aAAa3rB,EAAAwZ,SAASI,MAC3BjyB,EACA1E,EAAOqoC,UAAU,IAEnBm/C,GAEF,MAEF,QACET,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMw0C,EAIVT,EAASh8B,YAAcluC,EAAAyE,KAAKc,UAE5B,OAAQ2kE,EAASh8B,YAAY3jD,MAC3B,OACA,OACA,OACA,OACA,QACM4oB,EAAO+2D,EAAS7zD,gBAAgBlD,KAChCmkC,EAAY4yB,EAAS7zD,gBAAgBxC,oBACvCq2D,EAASh8B,aACR/6B,EAAKyF,YAAY/wB,EAAMqiF,EAASh8B,cAEnC/X,EAAMhzC,EAAO2rC,SACX3rC,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,GACvC1E,EAAOgpC,eAAemrB,EAAU1mC,MAAK,GACrC+5D,GAEF,MAEF,OACA,OACA,QACMrzB,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKG,KAAK,GACvEuxB,EAAMhzC,EAAO2rC,SACX3rC,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,GACvC1E,EAAOgpC,eAAemrB,EAAU1mC,MAAK,GACrC+5D,GAEF,MAEF,OACA,OACMrzB,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKI,KAAK,GACvEsxB,EAAMhzC,EAAO2rC,SACX3rC,EAAOuoC,YAAYxrB,EAAA0c,QAAQE,OACzB35B,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,IAEzC8iF,EACAxnF,EAAOgpC,eAAemrB,EAAU1mC,MAAK,IAEvC,MAEF,OACA,OACM0mC,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoBq2D,EAAS1lE,QAAQW,WAAW,GACzFgxB,EAAMhzC,EAAO2rC,SACX3rC,EAAOuoC,YACLw+C,EAAS1lE,QAAQkB,SACbxF,EAAA0c,QAAQE,OACR5c,EAAA0c,QAAQC,OACZ15B,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,IAEzC8iF,EACAxnF,EAAOgpC,eAAemrB,EAAU1mC,MAAOs5D,EAAS1lE,QAAQ6rC,iBAE1D,MAEF,QACMiH,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKY,KAAK,GACvE8wB,EAAMhzC,EAAO2rC,SACX3rC,EAAO0oC,aAAa3rB,EAAAwZ,SAASG,MAC3B12B,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,GACvC1E,EAAOmoC,UAAU,IAEnBq/C,EACAxnF,EAAOgpC,eAAemrB,EAAU1mC,MAAK,IAEvC,MAEF,QACM0mC,EAAY4yB,EAAS7zD,gBAAgBxC,oBAAoB7T,EAAAyE,KAAKa,KAAK,GACvE6wB,EAAMhzC,EAAO2rC,SACX3rC,EAAO0oC,aAAa3rB,EAAAwZ,SAASI,MAC3B32B,EAAOkpC,eAAeirB,EAAU1mC,MAAO/oB,GACvC1E,EAAOqoC,UAAU,IAEnBm/C,EACAxnF,EAAOgpC,eAAemrB,EAAU1mC,MAAK,IAEvC,MAEF,QACEs5D,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAEbuuC,EAAMw0C,EAKZ,OAAOx0C,EAET,IAAK,YAOH,OANIvqC,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,uBAEZ7c,EAAO+2D,EAAS7zD,gBAAgBlD,MAC/BznB,IAAG,MACRyqC,EAAM+zC,EAAS93B,4BAA4BpmB,EAAS,GAAI2sB,EAAc,GACtExlC,EAAKyD,MAAK,MACHuf,GAET,IAAK,gBACH,GAAInK,EAASljC,OAAS,EAcpB,OAbI8C,IACEA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IACnC,GAAxBA,EAAc9C,QAChBohF,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,MAI3D6hF,EAASngF,MACPgW,EAAAzY,eAAes5D,wCACf3P,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAE3ClF,EAAO6sC,oBAEhB,IAAIljC,OAAU,EACd,GAAIlB,EAAe,CACjB,GAA4B,GAAxBA,EAAc9C,OAMhB,OALI8C,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAC/Ds+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAc9C,OAAOT,SAAS,KAEhDlF,EAAO6sC,oBAEhBljC,EAAalB,EAAc,QAE3BkB,EAAa6rD,EAGf,GADA9wD,EAAOqiF,EAAS93B,4BAA4BpmB,EAAS,GAAIhsB,EAAAyE,KAAKQ,IAAG,GACpC,GAAzBilE,EAASh8B,YAAY3jD,KAKvB,OAJA2/E,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfugB,EAAS,GAAGpkC,OAEPzE,EAAO6sC,oBAOhB,IALA,IAAI2yB,EAAc32B,EAASljC,OAAS,EAChC8hF,EAAe,IAAIjhF,MAAqBg5D,GACxCkoB,EAAiB,IAAIlhF,MAAcg5D,EAAc,GACjD1D,EAAmBnyD,EAAW2mB,eAC9Bq3D,EAAmB,IAAInhF,MAAkBg5D,GACpC9+D,EAAI,EAAGA,EAAI8+D,IAAe9+D,EAAG,CACpC+mF,EAAa/mF,GAAKqmF,EAAS93B,4BAA4BpmB,EAAS,EAAInoC,GAAImc,EAAAyE,KAAKG,IAAG,GAChF,IAAImmE,EAAcb,EAASh8B,YAC3B28B,EAAehnF,GAAKknF,EAAYv2D,oBAChCs2D,EAAiBjnF,GAAKknF,EAAYt3D,eAEpCo3D,EAAeloB,GAAe71D,EAAW0nB,oBACzC,IAAIsb,EAAW+6C,EAAevhF,KAAK,IAC/BwnC,EAAU3tC,EAAOunC,2BAA2Bu0B,EAAkB6rB,GAKlE,OAJKh6C,IAASA,EAAU3tC,EAAOgnC,gBAAgB2F,EAAUmvB,EAAkB6rB,IAC3EZ,EAASh8B,YAAcphD,EAGhB3J,EAAO0sC,mBAAmBhoC,EAAM+iF,EAAc96C,GAEvD,IAAK,cACH,IAAMlkC,GAAyC,GAAxBA,EAAc9C,OAMnC,OALI8C,GAAiBA,EAAc9C,SAAQohF,EAASh8B,YAActiD,EAAc,IAChFs+E,EAASngF,MACPgW,EAAAzY,eAAe+hE,oCACfpY,EAAWrpD,MAAO,IAAKgE,EAAgBA,EAAc9C,OAAOT,SAAS,IAAM,KAEtElF,EAAO6sC,oBAEhB,IAAIo3B,EAAgBx7D,EAAc,GAAG0zC,eACrC,OAAK8nB,EAOE8iB,EAAS7iB,mBAAmBD,EAAep7B,EAAUilB,IAN1Di5B,EAASngF,MACPgW,EAAAzY,eAAemkB,wBACfwlC,EAAWrpD,OAENzE,EAAO6sC,qBAOlB,IAAK,QAKH,OAJAk6C,EAASngF,MACPgW,EAAAzY,eAAe0jF,eACf/5B,EAAWrpD,OAAQokC,EAASljC,OAASkjC,EAAS,GAAKilB,GAAYrpD,MAAMS,YAEhElF,EAAO6sC,oBAEhB,IAAK,UAKH,OAJAk6C,EAASpgF,QACPiW,EAAAzY,eAAe0jF,eACf/5B,EAAWrpD,OAAQokC,EAASljC,OAASkjC,EAAS,GAAKilB,GAAYrpD,MAAMS,YAEhElF,EAAO6rC,YAEhB,IAAK,OAKH,OAJAk7C,EAASrgF,KACPkW,EAAAzY,eAAe0jF,eACf/5B,EAAWrpD,OAAQokC,EAASljC,OAASkjC,EAAS,GAAKilB,GAAYrpD,MAAMS,YAEhElF,EAAO6rC,YAKhB,IAAK,KAOH,OANIpjC,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKC,GACrBvhB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKC,GAAE,KAKX,IAAK,MAOH,OANI9Y,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKE,IACrBxhB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKE,IAAG,KAKZ,IAAK,MAOH,OANI/Y,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKG,IACrBzhB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKG,IAAG,KAKZ,IAAK,MAOH,OANIhZ,GACFs+E,EAASngF,MACPgW,EAAAzY,eAAek4D,sBACfvO,EAAWrpD,MAAOnC,EAAU8gB,cAGT,GAAnBylB,EAASljC,QACXohF,EAASngF,MACPgW,EAAAzY,eAAeomB,+BACfujC,EAAWrpD,MAAO,IAAKokC,EAASljC,OAAOT,SAAS,KAElD6hF,EAASh8B,YAAcluC,EAAAyE,KAAKI,IACrB1hB,EAAO6sC,qBAETk6C,EAASx3B,kBACd1mB,EAAS,GACThsB,EAAAyE,KAAKI,IA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AAM,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,OAEtCE,GACJ,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,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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.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.PARENTHESIZED: 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,\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; 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}\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;\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\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 '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 /** 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.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 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\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 6,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 7,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 8,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 9,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 10,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 11,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 12,\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\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n _BinaryenRemoveFunctionType(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\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 = allocString(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 memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenGetGlobal(this.ref, cStr, type);\n } finally {\n memory.free(cStr);\n }\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 = allocString(name);\n try {\n return _BinaryenSetGlobal(this.ref, cStr, value);\n } finally {\n memory.free(cStr);\n }\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = allocString(label);\n try {\n return _BinaryenBreak(this.ref, cStr, condition, value);\n } finally {\n memory.free(cStr);\n }\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 = allocString(label);\n try {\n return _BinaryenLoop(this.ref, cStr, body);\n } finally {\n memory.free(cStr);\n }\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] = allocString(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = allocString(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cStr);\n memory.free(cArr);\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cArr = allocPtrArray(operands);\n var cStr = allocString(typeName);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cStr);\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 = allocString(name);\n try {\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n } finally {\n memory.free(cStr);\n }\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveGlobal(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = allocString(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 memory.free(cStr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = allocString(name);\n try {\n _BinaryenRemoveFunction(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n private cachedTemporaryName: usize = 0;\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.cachedTemporaryName;\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\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 = assert(this.cachedTemporaryName);\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 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalName);\n try {\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n } finally {\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n removeExport(externalName: string): void {\n var cStr = allocString(externalName);\n try {\n _BinaryenRemoveExport(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = allocString(internalName);\n var cStr2 = allocString(externalModuleName);\n var cStr3 = allocString(externalBaseName);\n try {\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n } finally {\n memory.free(cStr3);\n memory.free(cStr2);\n memory.free(cStr1);\n }\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 ): void {\n var cStr = allocString(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);\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 memory.free(cStr);\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] = allocString(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 for (let i = numNames; i >= 0; --i) memory.free(names[i]);\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 cachedPrecomputeName: usize = 0; // for free'ing\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 let name = allocString(\"precompute\");\n this.cachedPrecomputeName = name;\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\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 dispose(): void {\n assert(this.ref);\n memory.free(this.cachedByValue);\n memory.free(this.cachedTemporaryName);\n memory.free(this.cachedPrecomputeName);\n memory.free(this.cachedPrecomputeNames);\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 * 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 /** 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 || Function(\"return this\")() || (1, eval)(\"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 * 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 * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAllocate,\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\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 // determine initial page size\n var numPages = this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0;\n module.setMemory(\n numPages,\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 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 // check that modifiers are matching\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n if (body) {\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 } 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\n var ref: FunctionRef;\n var signature = instance.signature;\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n if (body) {\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\n let returnType = instance.signature.returnType;\n\n // compile body\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let stmt: ExpressionRef;\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n assert(instance.is(CommonFlags.ARROW));\n 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 flow.finalize();\n } else {\n assert(body.kind == NodeKind.BLOCK);\n let stmts = this.compileStatements((body).statements);\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 flow.finalize();\n if (isConstructor) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n\n // implicitly return `this` if the constructor doesn't always return on its own\n if (!flow.is(FlowFlags.RETURNS)) {\n\n // if all branches are guaranteed to allocate, skip the final conditional allocation\n if (flow.is(FlowFlags.ALLOCATES)) {\n stmts.push(module.createGetLocal(0, nativeSizeType));\n\n // if not all branches are guaranteed to allocate, also append a conditional allocation\n } else {\n let parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n stmts.push(module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, declaration.name)\n ));\n }\n }\n\n // make sure 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 stmt = !stmts.length\n ? module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType());\n }\n this.currentFunction = previousFunction;\n\n // create the function\n ref = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmt\n );\n\n // concrete functions 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 } else {\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the function import\n ref = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, ref);\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 var toType = this.resolver.resolveType( // reports\n 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\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 parent = assert(operatorInstance.parent);\n assert(parent.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 // 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 parent = assert(instance.parent);\n assert(parent.kind == ElementKind.CLASS);\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n (parent).type,\n \"this\"\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(thisArg),\n parentBase.type,\n \"super\"\n );\n }\n } else {\n let thisLocal = flow.addScopedLocal((parent).type, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let parentBase = (parent).base;\n if (parentBase) {\n flow.addScopedLocalAlias(\n thisLocal.index,\n parentBase.type,\n \"super\"\n );\n }\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); // 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 scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n this.currentType = scopedThis.type;\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let thisType = (parent).type;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // must be conditional because `this` could have been provided by a derived class\n this.currentType = thisType;\n return module.createTeeLocal(0,\n this.makeConditionalAllocate(parent, expression)\n );\n }\n }\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 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 parent = assert(currentFunction.parent);\n assert(parent.kind == ElementKind.CLASS);\n let base = (parent).base;\n if (base) {\n let superType = base.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 switch (contextualType.kind) {\n\n // compile to contextualType if matching\n\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_i32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.USIZE: {\n if (!this.options.isWasm64) {\n if (i64_is_u32(intValue)) return module.createI32(i64_low(intValue));\n break;\n }\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createI64(i64_low(intValue), i64_high(intValue));\n }\n case TypeKind.F32: {\n if (i64_is_f32(intValue)) return module.createF32(i64_to_f32(intValue));\n break;\n }\n case TypeKind.F64: {\n if (i64_is_f64(intValue)) return module.createF64(i64_to_f64(intValue));\n break;\n }\n case TypeKind.VOID: {\n break; // compiles to best fitting type below, being dropped\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // otherwise compile to best fitting native type\n\n if (i64_is_i32(intValue)) {\n this.currentType = Type.i32;\n return module.createI32(i64_low(intValue));\n } else if (i64_is_u32(intValue)) {\n this.currentType = Type.u32;\n return module.createI32(i64_low(intValue));\n } else {\n this.currentType = Type.i64;\n return module.createI64(i64_low(intValue), i64_high(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 compileAllocate(this, classReference, expression)\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 compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n // traverse to the top-most visible constructor\n var currentClassInstance: Class | null = classInstance;\n var constructorInstance: Function | null = null;\n do {\n constructorInstance = currentClassInstance.constructorInstance;\n if (constructorInstance) break; // TODO: check visibility\n } while (currentClassInstance = currentClassInstance.base);\n\n // if a constructor is present, call it with a zero `this`\n var expr: ExpressionRef;\n if (constructorInstance) {\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n\n // otherwise simply allocate a new instance and initialize its fields\n } else {\n if (argumentExpressions.length) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\n );\n }\n expr = this.makeAllocate(classInstance, reportNode);\n }\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); // 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 parent = (target).parent;\n assert(parent !== null && parent.kind == ElementKind.ENUM);\n if (!this.compileEnum(parent)) {\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 parent = assert(instance.parent);\n assert(parent.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 expression for an instance of the specified class. */\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var nativeSizeType = this.options.nativeSizeType;\n\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\n var initializers = new Array();\n initializers.push(\n module.createSetLocal(tempLocal.index,\n compileAllocate(this, classInstance, reportNode)\n )\n );\n\n // apply field initializers\n if (classInstance.members) {\n for (let member of classInstance.members.values()) {\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 initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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 { // initialize with zero\n // TODO: might be unnecessary if the ctor initializes the field\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n initializers.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(tempLocal.index, 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\n // return `this`\n initializers.push(\n module.createGetLocal(tempLocal.index, nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal);\n this.currentType = classInstance.type;\n return module.createBlock(null, initializers, nativeSizeType);\n }\n\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\n // requires that `this` is the first local\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n this.currentType = classInstance.type;\n return module.createIf(\n nativeSizeType == NativeType.I64\n ? module.createBinary(\n BinaryOp.NeI64,\n module.createGetLocal(0, NativeType.I64),\n module.createI64(0)\n )\n : module.createGetLocal(0, NativeType.I32),\n module.createGetLocal(0, nativeSizeType),\n module.createTeeLocal(0,\n this.makeAllocate(classInstance, reportNode)\n )\n );\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 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 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 _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}\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 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 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 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 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} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\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 /** Whether the last resolved type has been resolved from a placeholder, i.e. `T`. */\n currentTypeIsPlaceholder: bool = false;\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 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 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, 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 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 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 reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, 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 resolveExpression(\n expression: Expression,\n contextualFunction: Function,\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 let type = this.resolveType(\n (expression).toType,\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (type) {\n let classType = type.classReference;\n if (classType) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return classType;\n }\n }\n return null;\n }\n case NodeKind.BINARY: { // TODO: string concatenation, mostly\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.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 reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, 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.cachedFunctionTarget;\n if (!functionTarget) {\n functionTarget = new FunctionTarget(this.program, signature);\n signature.cachedFunctionTarget = functionTarget;\n }\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 thisType = classInstance.type;\n contextualTypeArguments.set(\"this\", thisType);\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 if (!instance.members) instance.members = new Map();\n let fieldDeclaration = (member).declaration;\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// TODO: Extract this into separate module, preferrable pluggable\nexport class NEARBindingsBuilder extends ExportsWalker {\n private typeMapping: { [key: string]: string } = {\n \"i32\": \"Integer\",\n \"String\": \"String\",\n \"bool\": \"Boolean\"\n };\n\n private nonNullableTypes = [\"i32\", \"bool\"];\n\n private sb: string[] = [];\n private generatedEncodeFunctions = new Set();\n private generatedDecodeFunctions = new Set();\n\n static build(program: Program): string {\n return new NEARBindingsBuilder(program).build();\n }\n\n visitGlobal(element: Global): void {\n // Do nothing\n }\n\n visitEnum(element: Enum): void {\n // Do nothing\n }\n\n visitClass(element: Class): void {\n // Do nothing\n }\n\n visitFunction(element: Function): void {\n this.generateArgsParser(element);\n this.generateWrapperFunction(element);\n }\n\n private generateArgsParser(element: Function) {\n let signature = element.signature;\n let fields = signature.parameterNames ? signature.parameterNames.map((paramName, i) => {\n return { simpleName: paramName, type: signature.parameterTypes[i] };\n }) : [];\n fields.forEach(field => this.generateDecodeFunction(field.type));\n this.sb.push(`export class __near_ArgsParser_${element.simpleName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_ArgsParser_${element.simpleName}>;\n handledRoot: boolean = false;\n `);\n if (signature.parameterNames) {\n fields.forEach((field) => {\n this.sb.push(`__near_param_${field.simpleName}: ${field.type};`);\n });\n this.generateHandlerMethods(\"this.__near_param_\", fields);\n } else {\n this.generateHandlerMethods(\"this.__near_param_\", []);\n }\n this.sb.push(`}`);\n }\n\n private generateWrapperFunction(element: Function) {\n let signature = element.signature;\n let returnType = signature.returnType;\n this.generateEncodeFunction(returnType);\n this.sb.push(`export function near_func_${element.simpleName}(): void {\n let json = new Uint8Array(input_read_len());\n input_read_into(json.buffer.data);\n let handler = new __near_ArgsParser_${element.simpleName}();\n handler.buffer = json;\n handler.decoder = new JSONDecoder<__near_ArgsParser_${element.simpleName}>(handler);\n handler.decoder.deserialize(json);`);\n if (returnType.toString() != \"void\") {\n this.sb.push(`let result = ${element.simpleName}(`);\n } else {\n this.sb.push(`${element.simpleName}(`);\n }\n if (signature.parameterNames) {\n this.sb.push(signature.parameterNames.map(paramName => `handler.__near_param_${paramName}`).join(\",\"));\n }\n this.sb.push(\");\");\n if (returnType.toString() != \"void\") {\n this.sb.push(`\n let encoder = new JSONEncoder();\n encoder.pushObject(null);\n `);\n this.generateFieldEncoder(returnType, '\"result\"', \"result\");\n this.sb.push(`\n encoder.popObject();\n return_value(near.bufferWithSize(encoder.serialize()).buffer.data);\n `);\n }\n this.sb.push(`}`);\n }\n\n private generateHandlerMethods(valuePrefix: string, fields: any[]) : void {\n for (let fieldType in this.typeMapping) {\n let setterType = this.typeMapping[fieldType];\n let matchingFields = fields.filter(field => field.type.toString() == fieldType);\n if (matchingFields.length > 0) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {`);\n matchingFields.forEach(field => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = value;\n return;\n }`);\n });\n this.sb.push(`\n super.set${setterType}(name, value);\n }`);\n }\n }\n this.sb.push(\"setNull(name: string): void {\");\n fields.forEach((field) => {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = <${field.type.toString()}>null;\n return;\n }`);\n });\n this.sb.push(`\n super.setNull(name);\n }`);\n\n let nonBasicFields = fields.filter(field => !(field.type.toString() in this.typeMapping));\n this.sb.push(`\n pushObject(name: string): bool {`);\n this.sb.push(`if (!this.handledRoot) {\n assert(name == null);\n this.handledRoot = true;\n return true;\n } else {\n assert(name != null);\n }`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => !this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushObject(name);\n }`);\n this.sb.push(`\n pushArray(name: string): bool {`);\n this.generatePushHandler(valuePrefix, nonBasicFields.filter(field => this.isArrayType(field.type)));\n this.sb.push(`\n return super.pushArray(name);\n }`);\n }\n\n private generatePushHandler(valuePrefix: string, fields: any[]) {\n fields.forEach((field) => {\n if (!(field.type.toString() in this.typeMapping)) {\n this.sb.push(`if (name == \"${field.simpleName}\") {\n ${valuePrefix}${field.simpleName} = __near_decode_${this.encodeType(field.type)}(this.buffer, this.decoder.state);\n return false;\n }`);\n }\n });\n }\n\n private generateArrayHandlerMethods(valuePrefix: string, fieldType: Type) : void {\n let setterType = this.typeMapping[fieldType.toString()];\n if (setterType) {\n this.sb.push(`set${setterType}(name: string, value: ${fieldType}): void {\n ${valuePrefix}.push(value);\n }\n setNull(name: string): void {\n ${valuePrefix}.push(<${fieldType}>null);\n }\n pushArray(name: string): bool {\n assert(name == null && !this.handledRoot);\n this.handledRoot = true;\n return true;\n }`);\n } else {\n this.sb.push(`pushObject(name: string): bool {\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }\n pushArray(name: string): bool {\n assert(name == null);\n if (!this.handledRoot) {\n this.handledRoot = true;\n return true;\n }\n ${valuePrefix}.push(__near_decode_${this.encodeType(fieldType)}(this.buffer, this.decoder.state));\n return false;\n }`);\n }\n }\n\n private generateEncodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedEncodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedEncodeFunctions.add(typeName);\n\n if (this.isArrayType(type)) {\n // Array\n this.generateEncodeFunction(type.classReference.typeArguments![0]);\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.sb.push(`for (let i = 0; i < value.length; i++) {`);\n this.generateFieldEncoder(type.classReference.typeArguments![0], \"null\", \"value[i]\");\n this.sb.push(\"}\");\n\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateEncodeFunction(field.type);\n });\n\n this.sb.push(`export function __near_encode_${typeName}(\n value: ${type.toString()},\n encoder: JSONEncoder): void {`);\n this.getFields(type.classReference).forEach((field) => {\n let fieldType = field.type;\n let fieldName = field.simpleName;\n let sourceExpr = `value.${fieldName}`;\n this.generateFieldEncoder(fieldType, `\"${fieldName}\"`, sourceExpr);\n });\n }\n\n this.sb.push(\"}\");\n }\n\n private generateHandler(type: Type) {\n let typeName = this.encodeType(type);\n this.sb.push(`export class __near_JSONHandler_${typeName} extends ThrowingJSONHandler {\n buffer: Uint8Array;\n decoder: JSONDecoder<__near_JSONHandler_${typeName}>;\n handledRoot: boolean = false;\n value: ${type} = new ${type}();`);\n if (this.isArrayType(type)) {\n this.generateArrayHandlerMethods(\"this.value\", type.classReference!.typeArguments![0]);\n } else {\n this.generateHandlerMethods(\"this.value.\", this.getFields(type.classReference!));\n }\n this.sb.push(\"}\\n\");\n }\n\n private generateDecodeFunction(type: Type) {\n if (!type.classReference) {\n return;\n }\n\n let typeName = this.encodeType(type);\n if (this.generatedDecodeFunctions.has(typeName) || typeName in this.typeMapping) {\n return;\n }\n this.generatedDecodeFunctions.add(typeName);\n\n this.generateHandler(type);\n if (this.isArrayType(type)) {\n // Array\n this.generateDecodeFunction(type.classReference.typeArguments![0]);\n } else {\n // Object\n this.getFields(type.classReference).forEach(field => {\n this.generateDecodeFunction(field.type);\n });\n }\n\n this.sb.push(`export function __near_decode_${typeName}(\n buffer: Uint8Array, state: DecoderState): ${type} {\n let handler = new __near_JSONHandler_${typeName}();\n handler.buffer = buffer;\n handler.decoder = new JSONDecoder<__near_JSONHandler_${typeName}>(handler);\n handler.decoder.deserialize(buffer, state);\n return handler.value;\n }\\n`);\n }\n\n private generateFieldEncoder(fieldType: Type, fieldExpr: string, sourceExpr: string) {\n let setterType = this.typeMapping[fieldType.toString()];\n if (!setterType) {\n // Object / array\n let pushType = this.isArrayType(fieldType) ? \"Array\" : \"Object\";\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.push${pushType}(${fieldExpr});\n __near_encode_${this.encodeType(fieldType)}(${sourceExpr}, encoder);\n encoder.pop${pushType}();\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n } else {\n // Basic types\n if (this.nonNullableTypes.indexOf(fieldType.toString()) != -1) {\n this.sb.push(`encoder.set${setterType}(${fieldExpr}, ${sourceExpr});`);\n } else {\n this.sb.push(`if (${sourceExpr} != null) {\n encoder.set${setterType}(${fieldExpr}, ${sourceExpr});\n } else {\n encoder.setNull(${fieldExpr});\n }`);\n }\n }\n }\n\n private encodeType(type: Type) : string {\n return (type.toString())\n .replace(/_/g, '__')\n .replace(/>/g, '')\n .replace(/[...element.members.values()].filter(member => member instanceof Field);\n }\n\n visitInterface(element: Interface): void {\n // Do nothing\n }\n\n visitField(element: Field): void {\n throw new Error(\"Shouldn't be called\");\n }\n\n visitNamespace(element: Element): void {\n // Do nothing\n }\n\n build(): string {\n this.sb.push(`\n import { near } from \"./near\";\n import { JSONEncoder} from \"./json/encoder\"\n import { JSONDecoder, ThrowingJSONHandler, DecoderState } from \"./json/decoder\"\n\n // Runtime functions\n @external(\"env\", \"return_value\")\n declare function return_value(value_ptr: u32): void;\n @external(\"env\", \"input_read_len\")\n declare function input_read_len(): u32;\n @external(\"env\", \"input_read_into\")\n declare function input_read_into(ptr: usize): void;\n `);\n let mainSource = this.program.sources\n .filter(s => s.normalizedPath.indexOf(\"~lib\") != 0)[0];\n this.sb.push(mainSource.text);\n this.walk();\n return this.sb.join(\"\\n\");\n }\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 // 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 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(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 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 // 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: 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: 0, writable: false },\n \"MAX_VALUE\": { value: 1, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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 \"POSITIVE_INFINITY\": { value: Infinity, writable: false },\n \"NEGATIVE_INFINITY\": { value: -Infinity, writable: false },\n \"NaN\": { value: NaN, 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[\"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 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 };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[ptr + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[ptr + (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(operands[0], compiler.currentFunction, ReportMode.SWALLOW);\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 // possibly overflows, e.g. abs(-128) == 128\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createSelect( // x > 0 ? x : 0-x\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI32, // ifFalse\n module.createI32(0),\n module.createGetLocal(tempLocal.index, NativeType.I32)\n ),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, NativeType.I32),\n module.createI32(0)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n compiler.options.usizeType.toNativeZero(module),\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n ),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType),\n compiler.options.usizeType.toNativeZero(module)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createBinary(BinaryOp.SubI64,\n module.createI64(0, 0),\n module.createGetLocal(tempLocal.index, NativeType.I64),\n ),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal.index, NativeType.I64),\n module.createI64(0, 0)\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 // 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 a memory allocation for an instance of the specified class. */\nexport function compileAllocate(\n compiler: Compiler,\n classInstance: Class,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n assert(classInstance.program == program);\n var module = compiler.module;\n var options = compiler.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n compiler.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(compiler, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance) {\n program.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.range, \"memory.allocate\"\n );\n return module.createUnreachable();\n }\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\n\n compiler.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/** 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 NEARBindingsBuilder\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// TODO: Make pluggable tree walkers instead of hardcoding various formats here\nexport function buildNEAR(program: Program): string {\n return NEARBindingsBuilder.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/src/definitions.ts b/src/definitions.ts index 17e7d64c75..15b166e8cb 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -461,6 +461,14 @@ export class NEARBindingsBuilder extends ExportsWalker { import { near } from "./near"; import { JSONEncoder} from "./json/encoder" import { JSONDecoder, ThrowingJSONHandler, DecoderState } from "./json/decoder" + + // Runtime functions + @external("env", "return_value") + declare function return_value(value_ptr: u32): void; + @external("env", "input_read_len") + declare function input_read_len(): u32; + @external("env", "input_read_into") + declare function input_read_into(ptr: usize): void; `); let mainSource = this.program.sources .filter(s => s.normalizedPath.indexOf("~lib") != 0)[0]; diff --git a/tests/near-bindgen/main.ts b/tests/near-bindgen/main.ts index 8a60dba454..9776350e29 100644 --- a/tests/near-bindgen/main.ts +++ b/tests/near-bindgen/main.ts @@ -8,14 +8,6 @@ import { near } from "./near" @external("env", "log") declare function log(str: string): void; -// Runtime functions -@external("env", "return_value") -declare function return_value(value_ptr: u32): void; -@external("env", "input_read_len") -declare function input_read_len(): u32; -@external("env", "input_read_into") -declare function input_read_into(ptr: usize): void; - export class FooBar { foo: i32 = 0; bar: i32 = 1; diff --git a/tests/near-bindgen/main_near.ts.expected b/tests/near-bindgen/main_near.ts.expected index 1660697263..2f08ef09db 100644 --- a/tests/near-bindgen/main_near.ts.expected +++ b/tests/near-bindgen/main_near.ts.expected @@ -1,3 +1,12 @@ +import { near } from "./near"; +import { JSONEncoder } from "./json/encoder"; +import { JSONDecoder, ThrowingJSONHandler, DecoderState } from "./json/decoder"; + +// Runtime functions +declare function return_value(value_ptr: u32): void; +declare function input_read_len(): u32; +declare function input_read_into(ptr: usize): void; + import "allocator/arena"; // TODO: Why cannot import from index? // import { JSONEncoder, JSONDecoder } from "./json"; @@ -12,11 +21,6 @@ import { near } from "./near"; declare function log(str: string): void; -// Runtime functions -declare function return_value(value_ptr: u32): void; -declare function input_read_len(): u32; -declare function input_read_into(ptr: usize): void; - export class FooBar { foo: i32 = 0; bar: i32 = 1; diff --git a/tests/near-bindgen/test.wat.expected b/tests/near-bindgen/test.wat.expected index 743442ad1d..dcd4002c0b 100644 --- a/tests/near-bindgen/test.wat.expected +++ b/tests/near-bindgen/test.wat.expected @@ -95,12 +95,6 @@ (data (i32.const 2416) "\06\00\00\00r\00e\00s\00u\00l\00t\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 $json/decoder/TRUE_STR i32 (i32.const 8)) (global $json/decoder/FALSE_STR i32 (i32.const 24)) (global $json/decoder/NULL_STR i32 (i32.const 40)) @@ -109,6 +103,12 @@ (global $json/decoder/CHAR_9 (mut i32) (i32.const 0)) (global $json/decoder/CHAR_A (mut i32) (i32.const 0)) (global $json/decoder/CHAR_A_LOWER (mut i32) (i32.const 0)) + (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 $~lib/internal/string/MAX_LENGTH i32 (i32.const 536870910)) (global $~lib/internal/arraybuffer/HEADER_SIZE i32 (i32.const 8)) (global $~lib/internal/arraybuffer/MAX_BLENGTH i32 (i32.const 1073741816)) @@ -4355,7 +4355,7 @@ if i32.const 0 i32.const 1312 - i32.const 253 + i32.const 257 i32.const 6 call $~lib/env/abort unreachable @@ -4373,7 +4373,7 @@ if i32.const 0 i32.const 1312 - i32.const 257 + i32.const 261 i32.const 6 call $~lib/env/abort unreachable @@ -6372,7 +6372,7 @@ if i32.const 0 i32.const 1312 - i32.const 312 + i32.const 316 i32.const 4 call $~lib/env/abort unreachable @@ -7436,7 +7436,7 @@ if i32.const 0 i32.const 1312 - i32.const 288 + i32.const 292 i32.const 4 call $~lib/env/abort unreachable @@ -8798,16 +8798,6 @@ call $json/encoder/JSONEncoder#setInteger ) (func $start (; 139 ;) (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 i32.const 56 i32.const 0 call $~lib/string/String#charCodeAt @@ -8824,6 +8814,16 @@ i32.const 0 call $~lib/string/String#charCodeAt set_global $json/decoder/CHAR_A_LOWER + 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 call $test/runTest ) (func $null (; 140 ;) (type $v)