From 83e2b37d99671d7ee14a2e00998be40f10a81654 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 21:30:25 -0500 Subject: [PATCH 1/5] Implement exception handling and try-catch-finally support Adds support for WebAssembly exception handling, including throw, try, catch, and finally constructs. The compiler now emits proper throw instructions and manages exception tags when the exception-handling feature is enabled. Try-finally and try-catch-finally blocks are compiled with correct control flow, including deferred returns and pending action dispatch. Flow context is extended to track try-finally state. Adds comprehensive tests for exception handling. --- src/compiler.ts | 360 +- src/flow.ts | 23 + tests/compiler/exceptions.debug.wat | 6097 +++++++++++++++++++++++++ tests/compiler/exceptions.json | 3 + tests/compiler/exceptions.release.wat | 4387 ++++++++++++++++++ tests/compiler/exceptions.ts | 498 ++ 6 files changed, 11358 insertions(+), 10 deletions(-) create mode 100644 tests/compiler/exceptions.debug.wat create mode 100644 tests/compiler/exceptions.json create mode 100644 tests/compiler/exceptions.release.wat create mode 100644 tests/compiler/exceptions.ts diff --git a/src/compiler.ts b/src/compiler.ts index 36f09ab8aa..0cce599e01 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -61,6 +61,8 @@ import { getConstValueInteger } from "./module"; +import * as binaryen from "./glue/binaryen"; + import { CommonFlags, STATIC_DELIMITER, @@ -476,6 +478,8 @@ export class Compiler extends DiagnosticEmitter { hasCustomFunctionExports: bool = false; /** Whether the module would use the exported runtime to lift/lower. */ desiresExportRuntime: bool = false; + /** Whether the exception tag has been created. */ + exceptionTagEnsured: bool = false; /** Compiles a {@link Program} to a {@link Module} using the specified options. */ static compile(program: Program): Module { @@ -2843,6 +2847,28 @@ export class Compiler extends DiagnosticEmitter { // Remember that this flow returns flow.set(FlowFlags.Returns | FlowFlags.Terminates); + // Handle try-finally context: defer return until after finally + let tryFinallyContext = flow.getTryFinallyContext(); + if (tryFinallyContext) { + let pendingActionLocal = tryFinallyContext.tryFinallyPendingActionLocal; + let pendingValueLocal = tryFinallyContext.tryFinallyPendingValueLocal; + let dispatchLabel = assert(tryFinallyContext.tryFinallyDispatchLabel); + let stmts = new Array(); + + // Store return value if any + if (expr && returnType != Type.void) { + stmts.push(module.local_set(pendingValueLocal, expr, returnType.isManaged)); + } + + // Set pending action to RETURN (1) + stmts.push(module.local_set(pendingActionLocal, module.i32(1), false)); + + // Branch to finally dispatch + stmts.push(module.br(dispatchLabel)); + + return module.flatten(stmts); + } + // Handle inline return if (flow.isInline) { let inlineReturnLabel = assert(flow.inlineReturnLabel); @@ -2988,12 +3014,26 @@ export class Compiler extends DiagnosticEmitter { private compileThrowStatement( statement: ThrowStatement ): ExpressionRef { - // TODO: requires exception-handling spec. + let module = this.module; let flow = this.currentFlow; // Remember that this branch throws flow.set(FlowFlags.Throws | FlowFlags.Terminates); + // If exception handling feature is enabled, use actual throw instruction + if (this.options.hasFeature(Feature.ExceptionHandling)) { + let value = statement.value; + // Compile the thrown value - should be Error or subclass + let valueExpr = this.compileExpression(value, Type.auto); + + // Ensure exception tag exists + let tagName = this.ensureExceptionTag(); + + // Emit throw instruction with the error pointer + return module.throw(tagName, [valueExpr]); + } + + // Fallback: convert throw to abort() call when exception handling is disabled let stmts = new Array(); let value = statement.value; let message: Expression | null = null; @@ -3004,20 +3044,307 @@ export class Compiler extends DiagnosticEmitter { stmts.push( this.makeAbort(message, statement) ); - return this.module.flatten(stmts); + return module.flatten(stmts); } private compileTryStatement( statement: TryStatement ): ExpressionRef { - // TODO: can't yet support something like: try { return ... } finally { ... } - // worthwhile to investigate lowering returns to block results (here)? - this.error( - DiagnosticCode.Not_implemented_0, - statement.range, - "Exceptions" - ); - return this.module.unreachable(); + let module = this.module; + let outerFlow = this.currentFlow; + + // Check feature flag + if (!this.options.hasFeature(Feature.ExceptionHandling)) { + this.error( + DiagnosticCode.Feature_0_is_not_enabled, + statement.range, + "exception-handling" + ); + return module.unreachable(); + } + + // Ensure exception tag exists + let tagName = this.ensureExceptionTag(); + + // Generate unique label for this try block + let label = outerFlow.pushControlFlowLabel(); + let tryLabel = `try|${label}`; + + // Compile try block body + let tryFlow = outerFlow.fork(); + this.currentFlow = tryFlow; + let tryStmts = new Array(); + this.compileStatements(statement.bodyStatements, tryStmts); + let tryBodyExpr = module.flatten(tryStmts); + let tryFlowTerminates = tryFlow.isAny(FlowFlags.Terminates); + + let catchTags: string[] = []; + let catchBodies: ExpressionRef[] = []; + let catchFlow: Flow | null = null; + let catchFlowTerminates = false; + + // Compile catch clause if present + let catchStatements = statement.catchStatements; + let catchVariable = statement.catchVariable; + if (catchStatements) { + catchFlow = outerFlow.fork(); + this.currentFlow = catchFlow; + + let catchStmts = new Array(); + + // The pop instruction MUST be the very first instruction in the catch block + // WebAssembly requires this - we can't wrap it in local.tee or anything else + let popExpr = module.pop(this.options.sizeTypeRef); + + // If there's a catch variable, bind it to the popped exception value + if (catchVariable) { + let catchVarName = catchVariable.text; + // The exception value is a pointer to Error object + let errorClass = this.program.lookup(CommonNames.Error); + let errorType: Type; + if (errorClass && errorClass.kind == ElementKind.ClassPrototype) { + let resolved = this.resolver.resolveClass(errorClass, null); + errorType = resolved ? resolved.type : this.options.usizeType; + } else { + errorType = this.options.usizeType; // Fallback to usize if Error class not found + } + + // Create a scoped local for the catch variable + let catchLocal = catchFlow.addScopedLocal(catchVarName, errorType); + // Use direct local.set without shadow stack to ensure pop is first + catchStmts.push(binaryen._BinaryenLocalSet(module.ref, catchLocal.index, popExpr)); + // Mark the catch variable as initialized + catchFlow.setLocalFlag(catchLocal.index, LocalFlags.Initialized); + } else { + // No catch variable, but still need to pop the exception value + catchStmts.push(module.drop(popExpr)); + } + + // Compile catch block statements + this.compileStatements(catchStatements, catchStmts); + + catchTags.push(tagName); + catchBodies.push(module.flatten(catchStmts)); + catchFlowTerminates = catchFlow.isAny(FlowFlags.Terminates); + } + + // Handle finally clause if present + let finallyStatements = statement.finallyStatements; + if (finallyStatements) { + // Set up pending action pattern for deferred control flow + // pendingAction: 0=normal, 1=return, 2=break, 3=continue + let returnType = outerFlow.returnType; + let targetFunction = outerFlow.targetFunction; + + // Create locals for pending action tracking + let pendingActionLocal = targetFunction.addLocal(Type.i32); + let pendingValueLocal: Local | null = returnType != Type.void + ? targetFunction.addLocal(returnType) + : null; + let pendingValueLocalIndex = pendingValueLocal ? pendingValueLocal.index : -1; + + // Create labels + let dispatchLabel = `finally_dispatch|${label}`; + let outerTryLabel = `try_finally|${label}`; + + // Set up try-finally context on the flows BEFORE compiling try/catch bodies + // We need to recompile try and catch with the context set + outerFlow.popControlFlowLabel(label); + + // Re-fork flows with try-finally context + let label2 = outerFlow.pushControlFlowLabel(); + tryLabel = `try|${label2}`; + + tryFlow = outerFlow.fork(); + tryFlow.tryFinallyPendingActionLocal = pendingActionLocal.index; + tryFlow.tryFinallyPendingValueLocal = pendingValueLocalIndex; + tryFlow.tryFinallyDispatchLabel = dispatchLabel; + tryFlow.tryFinallyReturnType = returnType; + + this.currentFlow = tryFlow; + let tryStmts2 = new Array(); + this.compileStatements(statement.bodyStatements, tryStmts2); + tryBodyExpr = module.flatten(tryStmts2); + tryFlowTerminates = tryFlow.isAny(FlowFlags.Terminates); + + // Recompile catch with context if present + catchTags = []; + catchBodies = []; + catchFlow = null; + catchFlowTerminates = false; + + if (catchStatements) { + catchFlow = outerFlow.fork(); + catchFlow.tryFinallyPendingActionLocal = pendingActionLocal.index; + catchFlow.tryFinallyPendingValueLocal = pendingValueLocalIndex; + catchFlow.tryFinallyDispatchLabel = dispatchLabel; + catchFlow.tryFinallyReturnType = returnType; + + this.currentFlow = catchFlow; + + let catchStmts2 = new Array(); + let popExpr = module.pop(this.options.sizeTypeRef); + + if (catchVariable) { + let catchVarName = catchVariable.text; + let errorClass = this.program.lookup(CommonNames.Error); + let errorType: Type; + if (errorClass && errorClass.kind == ElementKind.ClassPrototype) { + let resolved = this.resolver.resolveClass(errorClass, null); + errorType = resolved ? resolved.type : this.options.usizeType; + } else { + errorType = this.options.usizeType; + } + let catchLocal = catchFlow.addScopedLocal(catchVarName, errorType); + catchStmts2.push(binaryen._BinaryenLocalSet(module.ref, catchLocal.index, popExpr)); + catchFlow.setLocalFlag(catchLocal.index, LocalFlags.Initialized); + } else { + catchStmts2.push(module.drop(popExpr)); + } + + this.compileStatements(catchStatements, catchStmts2); + + catchTags.push(tagName); + catchBodies.push(module.flatten(catchStmts2)); + catchFlowTerminates = catchFlow.isAny(FlowFlags.Terminates); + } + + this.currentFlow = outerFlow; + + // Build the inner try-catch (if there's a catch clause) + let innerTryExpr: ExpressionRef; + if (catchBodies.length > 0) { + innerTryExpr = module.try(tryLabel, tryBodyExpr, catchTags, catchBodies, null); + } else { + innerTryExpr = tryBodyExpr; + } + + // Compile finally statements for the catch_all path (exception handling) + let finallyFlow1 = outerFlow.fork(); + this.currentFlow = finallyFlow1; + let finallyStmts1 = new Array(); + this.compileStatements(finallyStatements, finallyStmts1); + let finallyExpr1 = module.flatten(finallyStmts1); + + // Create catch_all body: run finally, then rethrow + let catchAllBody = module.block(null, [ + finallyExpr1, + module.rethrow(outerTryLabel) + ]); + + // Outer try with catch_all for exception path + let outerTryExpr = module.try( + outerTryLabel, + innerTryExpr, + [], + [catchAllBody], + null + ); + + // Compile finally statements for the normal/deferred path + let finallyFlow2 = outerFlow.fork(); + this.currentFlow = finallyFlow2; + let finallyStmts2 = new Array(); + this.compileStatements(finallyStatements, finallyStmts2); + let finallyExpr2 = module.flatten(finallyStmts2); + let finallyTerminates = finallyFlow2.isAny(FlowFlags.Terminates); + let finallyReturns = finallyFlow2.isAny(FlowFlags.Returns); + + this.currentFlow = outerFlow; + outerFlow.popControlFlowLabel(label2); + + // Build the dispatch logic after finally + let dispatchStmts = new Array(); + + // Run finally code + dispatchStmts.push(finallyExpr2); + + // If finally always returns/terminates, skip dispatch logic + if (!finallyTerminates) { + // Dispatch based on pendingAction + // if (pendingAction == 1) return pendingValue; + if (returnType != Type.void && pendingValueLocal) { + dispatchStmts.push( + module.if( + module.binary(BinaryOp.EqI32, + module.local_get(pendingActionLocal.index, TypeRef.I32), + module.i32(1) + ), + module.return(module.local_get(pendingValueLocal.index, returnType.toRef())) + ) + ); + } else { + dispatchStmts.push( + module.if( + module.binary(BinaryOp.EqI32, + module.local_get(pendingActionLocal.index, TypeRef.I32), + module.i32(1) + ), + module.return() + ) + ); + } + } + + // Wrap the try in a block that return can branch to + let tryBlock = module.block(dispatchLabel, [outerTryExpr]); + + // Only add unreachable if all paths terminate (no normal completion possible) + // If try or catch can complete normally, we need to fall through + let allPathsTerminate = catchFlow + ? (tryFlowTerminates && catchFlowTerminates) + : tryFlowTerminates; + if (!finallyTerminates && allPathsTerminate) { + dispatchStmts.push(module.unreachable()); + } + + let fullBlock = module.block(null, [ + tryBlock, + ...dispatchStmts + ]); + + // Merge flow states + // If finally always terminates, the whole construct terminates + if (finallyTerminates) { + outerFlow.set(FlowFlags.Terminates); + if (finallyReturns) { + outerFlow.set(FlowFlags.Returns); + } + } else if (catchFlow) { + if (tryFlowTerminates && catchFlowTerminates) { + outerFlow.set(FlowFlags.Terminates); + } else { + outerFlow.inheritAlternatives(tryFlow, catchFlow); + } + } else { + outerFlow.mergeSideEffects(tryFlow); + } + + return fullBlock; + } + + // No finally clause + outerFlow.popControlFlowLabel(label); + this.currentFlow = outerFlow; + + // Merge flow states + if (catchFlow) { + if (tryFlowTerminates && catchFlowTerminates) { + outerFlow.set(FlowFlags.Terminates); + } else if (!catchStatements) { + // No catch, only try + outerFlow.inherit(tryFlow); + } else { + outerFlow.inheritAlternatives(tryFlow, catchFlow); + } + } + + // If no catch handlers, just return the try body (exceptions propagate) + if (catchBodies.length == 0) { + return tryBodyExpr; + } + + return module.try(tryLabel, tryBodyExpr, catchTags, catchBodies, null); } /** Compiles a variable statement. Returns `0` if an initializer is not necessary. */ @@ -6534,6 +6861,19 @@ export class Compiler extends DiagnosticEmitter { return name; } + /** Ensures the exception tag for exception handling exists. */ + ensureExceptionTag(): string { + let tagName = "error"; + if (!this.exceptionTagEnsured) { + let module = this.module; + let sizeTypeRef = this.options.sizeTypeRef; + // Tag with single param: pointer to Error object + module.addTag(tagName, sizeTypeRef, TypeRef.None); + this.exceptionTagEnsured = true; + } + return tagName; + } + /** Ensures compilation of the varargs stub for the specified function. */ ensureVarargsStub(original: Function): Function { // A varargs stub is a function called with omitted arguments being zeroed, diff --git a/src/flow.ts b/src/flow.ts index ddc7941916..0fae47236e 100644 --- a/src/flow.ts +++ b/src/flow.ts @@ -265,12 +265,35 @@ export class Flow { trueFlows: Map | null = null; /** Alternative flows if a compound expression is false-ish. */ falseFlows: Map | null = null; + /** Try-finally context: local index for pending action (0=none, 1=return, 2=break, 3=continue). */ + tryFinallyPendingActionLocal: i32 = -1; + /** Try-finally context: local index for pending return value. */ + tryFinallyPendingValueLocal: i32 = -1; + /** Try-finally context: label to branch to for finally dispatch. */ + tryFinallyDispatchLabel: string | null = null; + /** Try-finally context: return type for the pending value. */ + tryFinallyReturnType: Type | null = null; /** Tests if this is an inline flow. */ get isInline(): bool { return this.inlineFunction != null; } + /** Tests if this flow or any parent is in a try-finally context. */ + get isInTryFinally(): bool { + return this.tryFinallyPendingActionLocal >= 0; + } + + /** Gets the try-finally context from this flow or a parent flow. */ + getTryFinallyContext(): Flow | null { + let flow: Flow | null = this; + while (flow) { + if (flow.tryFinallyPendingActionLocal >= 0) return flow; + flow = flow.parent; + } + return null; + } + /** Gets the source function being compiled. Differs from target when inlining. */ get sourceFunction(): Function { // Obtaining the source function is useful when resolving elements relative diff --git a/tests/compiler/exceptions.debug.wat b/tests/compiler/exceptions.debug.wat new file mode 100644 index 0000000000..83b23045a8 --- /dev/null +++ b/tests/compiler/exceptions.debug.wat @@ -0,0 +1,6097 @@ +(module + (type $0 (func (param i32) (result i32))) + (type $1 (func (param i32 i32))) + (type $2 (func (result i32))) + (type $3 (func (param i32))) + (type $4 (func (param i32 i32) (result i32))) + (type $5 (func)) + (type $6 (func (param i32 i32 i32))) + (type $7 (func (param i32 i32 i32) (result i32))) + (type $8 (func (param i32 i32 i32 i32))) + (type $9 (func (param i32 i32 i64) (result i32))) + (type $10 (func (param i32 i32 i32 i32 i32) (result i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Stub i32 (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Minimal i32 (i32.const 1)) + (global $~lib/shared/runtime/Runtime.Incremental i32 (i32.const 2)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) + (global $~lib/native/ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $exceptions/finallyRan (mut i32) (i32.const 0)) + (global $exceptions/returnInCatchFinallyRan (mut i32) (i32.const 0)) + (global $exceptions/tryCatchFinallyRan (mut i32) (i32.const 0)) + (global $exceptions/tryCatchFinallyResult (mut i32) (i32.const 0)) + (global $exceptions/finallyWithExceptionRan (mut i32) (i32.const 0)) + (global $exceptions/finallyNormalRan (mut i32) (i32.const 0)) + (global $exceptions/Resource.instances (mut i32) (i32.const 0)) + (global $exceptions/Resource.disposed (mut i32) (i32.const 0)) + (global $exceptions/calc (mut i32) (i32.const 0)) + (global $exceptions/outer (mut i32) (i32.const 0)) + (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) + (global $exceptions/rethrowFinallyRan (mut i32) (i32.const 0)) + (global $exceptions/sm (mut i32) (i32.const 0)) + (global $exceptions/deepNestingOrder (mut i32) (i32.const 416)) + (global $exceptions/counter (mut i32) (i32.const 0)) + (global $exceptions/multiReturnFinallyCount (mut i32) (i32.const 0)) + (global $exceptions/finallyReturnSuppressedExceptionRan (mut i32) (i32.const 0)) + (global $~lib/rt/__rtti_base i32 (i32.const 1840)) + (global $~lib/memory/__data_end i32 (i32.const 1900)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34668)) + (global $~lib/memory/__heap_base i32 (i32.const 34668)) + (memory $0 1) + (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data $1 (i32.const 80) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $2 (i32.const 108) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $3 (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $4 (i32.const 204) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data $5 (i32.const 272) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $6 (i32.const 300) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $7 (i32.const 364) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00E\00r\00r\00o\00r\00\00\00") + (data $8 (i32.const 396) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $9 (i32.const 428) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00o\00o\00p\00s\00\00\00\00\00") + (data $10 (i32.const 460) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00e\00x\00c\00e\00p\00t\00i\00o\00n\00s\00.\00t\00s\00\00\00") + (data $11 (i32.const 508) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00m\00s\00g\00\00\00\00\00\00\00") + (data $12 (i32.const 540) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00i\00n\00n\00e\00r\00\00\00") + (data $13 (i32.const 572) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00o\00u\00t\00e\00r\00\00\00") + (data $14 (i32.const 604) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\n\00\00\00e\00r\00r\00o\00r\00\00\00") + (data $15 (i32.const 636) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00w\00i\00l\00l\00 \00p\00r\00o\00p\00a\00g\00a\00t\00e\00") + (data $16 (i32.const 684) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\00c\00u\00s\00t\00o\00m\00") + (data $17 (i32.const 716) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00w\00o\00r\00k\00 \00f\00a\00i\00l\00e\00d\00\00\00\00\00\00\00") + (data $18 (i32.const 764) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00d\00i\00v\00i\00s\00i\00o\00n\00 \00b\00y\00 \00z\00e\00r\00o\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $19 (i32.const 828) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00i\00n\00n\00e\00r\00 \00e\00r\00r\00o\00r\00\00\00\00\00\00\00") + (data $20 (i32.const 876) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00w\00r\00a\00p\00p\00e\00d\00 \00e\00r\00r\00o\00r\00\00\00") + (data $21 (i32.const 924) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00R\00a\00n\00g\00e\00E\00r\00r\00o\00r\00\00\00\00\00\00\00\00\00") + (data $22 (i32.const 972) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h\00") + (data $23 (i32.const 1020) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\18\00\00\00s\00u\00m\00 \00e\00x\00c\00e\00e\00d\00e\00d\00\00\00\00\00") + (data $24 (i32.const 1068) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\00o\00r\00i\00g\00i\00n\00a\00l\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $25 (i32.const 1116) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00r\00e\00t\00h\00r\00o\00w\00n\00:\00 \00\00\00\00\00\00\00\00\00") + (data $26 (i32.const 1164) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00s\00t\00a\00t\00e\00\00\00") + (data $27 (i32.const 1212) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00t\001\00,\00\00\00\00\00\00\00") + (data $28 (i32.const 1244) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00t\002\00,\00\00\00\00\00\00\00") + (data $29 (i32.const 1276) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00t\003\00,\00\00\00\00\00\00\00") + (data $30 (i32.const 1308) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00d\00e\00e\00p\00\00\00\00\00") + (data $31 (i32.const 1340) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00c\003\00,\00\00\00\00\00\00\00") + (data $32 (i32.const 1372) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0e\00\00\00r\00e\00t\00h\00r\00o\00w\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $33 (i32.const 1420) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00f\003\00,\00\00\00\00\00\00\00") + (data $34 (i32.const 1452) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00c\002\00,\00\00\00\00\00\00\00") + (data $35 (i32.const 1484) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00f\002\00,\00\00\00\00\00\00\00") + (data $36 (i32.const 1516) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00c\001\00,\00\00\00\00\00\00\00") + (data $37 (i32.const 1548) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00f\001\00,\00\00\00\00\00\00\00") + (data $38 (i32.const 1580) "L\00\00\00\00\00\00\00\00\00\00\00\02\00\00\000\00\00\00t\001\00,\00t\002\00,\00t\003\00,\00c\003\00,\00f\003\00,\00c\002\00,\00f\002\00,\00f\001\00,\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $39 (i32.const 1660) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\16\00\00\00m\00a\00x\00 \00r\00e\00a\00c\00h\00e\00d\00\00\00\00\00\00\00") + (data $40 (i32.const 1708) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00z\00e\00r\00o\00\00\00\00\00") + (data $41 (i32.const 1740) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\08\00\00\00t\00e\00s\00t\00\00\00\00\00") + (data $42 (i32.const 1772) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00s\00h\00o\00u\00l\00d\00 \00b\00e\00 \00s\00u\00p\00p\00r\00e\00s\00s\00e\00d\00\00\00\00\00") + (data $43 (i32.const 1840) "\0e\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00\02\t\00\00\00\00\00\00 \00\00\00 \00\00\00") + (table $0 1 1 funcref) + (elem $0 (i32.const 1)) + (tag $error (type $3) (param i32)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/Object#set:nextWithColor (param $this i32) (param $nextWithColor i32) + local.get $this + local.get $nextWithColor + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#set:prev (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store offset=8 + ) + (func $~lib/rt/itcms/initLazy (param $space i32) (result i32) + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:prev + local.get $space + return + ) + (func $~lib/rt/itcms/Object#get:nextWithColor (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/rt/itcms/Object#get:next (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + return + ) + (func $~lib/rt/itcms/Object#get:color (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + return + ) + (func $~lib/rt/itcms/visitRoots (param $cookie i32) + (local $pn i32) + (local $iter i32) + local.get $cookie + call $~lib/rt/__visit_globals + global.get $~lib/rt/itcms/pinSpace + local.set $pn + local.get $pn + call $~lib/rt/itcms/Object#get:next + local.set $iter + loop $while-continue|0 + local.get $iter + local.get $pn + i32.ne + if + i32.const 1 + drop + local.get $iter + call $~lib/rt/itcms/Object#get:color + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $iter + i32.const 20 + i32.add + local.get $cookie + call $~lib/rt/__visit_members + local.get $iter + call $~lib/rt/itcms/Object#get:next + local.set $iter + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#set:color (param $this i32) (param $color i32) + local.get $this + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $color + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#get:prev (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/rt/itcms/Object#set:next (param $this i32) (param $obj i32) + local.get $this + local.get $obj + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#unlink (param $this i32) + (local $next i32) + (local $prev i32) + local.get $this + call $~lib/rt/itcms/Object#get:next + local.set $next + local.get $next + i32.const 0 + i32.eq + if + i32.const 1 + drop + local.get $this + call $~lib/rt/itcms/Object#get:prev + i32.const 0 + i32.eq + if (result i32) + local.get $this + global.get $~lib/memory/__heap_base + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + return + end + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.set $prev + i32.const 1 + drop + local.get $prev + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $next + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $next + call $~lib/rt/itcms/Object#set:next + ) + (func $~lib/rt/itcms/Object#get:rtId (param $this i32) (result i32) + local.get $this + i32.load offset=12 + ) + (func $~lib/shared/typeinfo/Typeinfo#get:flags (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/__typeinfo (param $id i32) (result i32) + (local $ptr i32) + global.get $~lib/rt/__rtti_base + local.set $ptr + local.get $id + local.get $ptr + i32.load + i32.gt_u + if + i32.const 0 + i32.const 224 + call $~lib/error/Error#constructor + throw $error + end + local.get $ptr + i32.const 4 + i32.add + local.get $id + i32.const 4 + i32.mul + i32.add + call $~lib/shared/typeinfo/Typeinfo#get:flags + return + ) + (func $~lib/rt/itcms/Object#get:isPointerfree (param $this i32) (result i32) + (local $rtId i32) + local.get $this + call $~lib/rt/itcms/Object#get:rtId + local.set $rtId + local.get $rtId + i32.const 2 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $rtId + call $~lib/rt/__typeinfo + i32.const 32 + i32.and + i32.const 0 + i32.ne + end + return + ) + (func $~lib/rt/itcms/Object#linkTo (param $this i32) (param $list i32) (param $withColor i32) + (local $prev i32) + local.get $list + call $~lib/rt/itcms/Object#get:prev + local.set $prev + local.get $this + local.get $list + local.get $withColor + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $this + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $this + call $~lib/rt/itcms/Object#set:next + local.get $list + local.get $this + call $~lib/rt/itcms/Object#set:prev + ) + (func $~lib/rt/itcms/Object#makeGray (param $this i32) + (local $1 i32) + local.get $this + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.tee $1 + i32.eqz + if (result i32) + i32.const 0 + i32.const 128 + i32.const 148 + i32.const 30 + call $~lib/builtins/abort + unreachable + else + local.get $1 + end + global.set $~lib/rt/itcms/iter + end + local.get $this + call $~lib/rt/itcms/Object#unlink + local.get $this + global.get $~lib/rt/itcms/toSpace + local.get $this + call $~lib/rt/itcms/Object#get:isPointerfree + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (func $~lib/rt/itcms/__visit (param $ptr i32) (param $cookie i32) + (local $obj i32) + local.get $ptr + i32.eqz + if + return + end + local.get $ptr + i32.const 20 + i32.sub + local.set $obj + i32.const 0 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $obj + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/itcms/visitStack (param $cookie i32) + (local $ptr i32) + global.get $~lib/memory/__stack_pointer + local.set $ptr + loop $while-continue|0 + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $ptr + i32.load + local.get $cookie + call $~lib/rt/itcms/__visit + local.get $ptr + i32.const 4 + i32.add + local.set $ptr + br $while-continue|0 + end + end + ) + (func $~lib/rt/common/BLOCK#get:mmInfo (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/itcms/Object#get:size (param $this i32) (result i32) + i32.const 4 + local.get $this + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + return + ) + (func $~lib/rt/tlsf/Root#set:flMap (param $this i32) (param $flMap i32) + local.get $this + local.get $flMap + i32.store + ) + (func $~lib/rt/common/BLOCK#set:mmInfo (param $this i32) (param $mmInfo i32) + local.get $this + local.get $mmInfo + i32.store + ) + (func $~lib/rt/tlsf/Block#set:prev (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store offset=4 + ) + (func $~lib/rt/tlsf/Block#set:next (param $this i32) (param $next i32) + local.get $this + local.get $next + i32.store offset=8 + ) + (func $~lib/rt/tlsf/Block#get:prev (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/rt/tlsf/Block#get:next (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/rt/tlsf/Root#get:flMap (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/tlsf/removeBlock (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $6 i32) + (local $7 i32) + (local $boundedSize i32) + (local $prev i32) + (local $next i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $root|14 i32) + (local $fl|15 i32) + (local $sl|16 i32) + (local $head i32) + (local $root|18 i32) + (local $fl|19 i32) + (local $slMap i32) + (local $root|21 i32) + (local $fl|22 i32) + (local $slMap|23 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $6 + i32.const 1073741820 + local.tee $7 + local.get $6 + local.get $7 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/tlsf/Block#get:prev + local.set $prev + local.get $block + call $~lib/rt/tlsf/Block#get:next + local.set $next + local.get $prev + if + local.get $prev + local.get $next + call $~lib/rt/tlsf/Block#set:next + end + local.get $next + if + local.get $next + local.get $prev + call $~lib/rt/tlsf/Block#set:prev + end + local.get $block + block $~lib/rt/tlsf/GETHEAD|inlined.0 (result i32) + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.0 + end + i32.eq + if + local.get $root + local.set $root|14 + local.get $fl + local.set $fl|15 + local.get $sl + local.set $sl|16 + local.get $next + local.set $head + local.get $root|14 + local.get $fl|15 + i32.const 4 + i32.shl + local.get $sl|16 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store offset=96 + local.get $next + i32.eqz + if + block $~lib/rt/tlsf/GETSL|inlined.0 (result i32) + local.get $root + local.set $root|18 + local.get $fl + local.set $fl|19 + local.get $root|18 + local.get $fl|19 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.0 + end + local.set $slMap + local.get $root + local.set $root|21 + local.get $fl + local.set $fl|22 + local.get $slMap + i32.const 1 + local.get $sl + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $slMap + local.set $slMap|23 + local.get $root|21 + local.get $fl|22 + i32.const 2 + i32.shl + i32.add + local.get $slMap|23 + i32.store offset=4 + local.get $slMap + i32.eqz + if + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.const -1 + i32.xor + i32.and + call $~lib/rt/tlsf/Root#set:flMap + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $block|3 i32) + (local $right i32) + (local $rightInfo i32) + (local $block|6 i32) + (local $block|7 i32) + (local $left i32) + (local $leftInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $13 i32) + (local $14 i32) + (local $boundedSize i32) + (local $root|16 i32) + (local $fl|17 i32) + (local $sl|18 i32) + (local $head i32) + (local $root|20 i32) + (local $fl|21 i32) + (local $sl|22 i32) + (local $head|23 i32) + (local $root|24 i32) + (local $fl|25 i32) + (local $root|26 i32) + (local $fl|27 i32) + (local $slMap i32) + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETRIGHT|inlined.0 (result i32) + local.get $block + local.set $block|3 + local.get $block|3 + i32.const 4 + i32.add + local.get $block|3 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.0 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + local.get $rightInfo + i32.const 1 + i32.and + if + local.get $root + local.get $right + call $~lib/rt/tlsf/removeBlock + local.get $block + local.get $blockInfo + i32.const 4 + i32.add + local.get $rightInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.1 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.1 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + end + local.get $blockInfo + i32.const 2 + i32.and + if + block $~lib/rt/tlsf/GETFREELEFT|inlined.0 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.sub + i32.load + br $~lib/rt/tlsf/GETFREELEFT|inlined.0 + end + local.set $left + local.get $left + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $leftInfo + i32.const 1 + drop + local.get $leftInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $left + call $~lib/rt/tlsf/removeBlock + local.get $left + local.set $block + local.get $block + local.get $leftInfo + i32.const 4 + i32.add + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + end + local.get $right + local.get $rightInfo + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + drop + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.get $right + i32.eq + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $right + i32.const 4 + i32.sub + local.get $block + i32.store + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $13 + i32.const 1073741820 + local.tee $14 + local.get $13 + local.get $14 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.1 (result i32) + local.get $root + local.set $root|16 + local.get $fl + local.set $fl|17 + local.get $sl + local.set $sl|18 + local.get $root|16 + local.get $fl|17 + i32.const 4 + i32.shl + local.get $sl|18 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.1 + end + local.set $head + local.get $block + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $block + local.get $head + call $~lib/rt/tlsf/Block#set:next + local.get $head + if + local.get $head + local.get $block + call $~lib/rt/tlsf/Block#set:prev + end + local.get $root + local.set $root|20 + local.get $fl + local.set $fl|21 + local.get $sl + local.set $sl|22 + local.get $block + local.set $head|23 + local.get $root|20 + local.get $fl|21 + i32.const 4 + i32.shl + local.get $sl|22 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head|23 + i32.store offset=96 + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.or + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|26 + local.get $fl + local.set $fl|27 + block $~lib/rt/tlsf/GETSL|inlined.1 (result i32) + local.get $root + local.set $root|24 + local.get $fl + local.set $fl|25 + local.get $root|24 + local.get $fl|25 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.1 + end + i32.const 1 + local.get $sl + i32.shl + i32.or + local.set $slMap + local.get $root|26 + local.get $fl|27 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $root i32) (param $start i32) (param $endU64 i64) (result i32) + (local $end i32) + (local $root|4 i32) + (local $tail i32) + (local $tailInfo i32) + (local $size i32) + (local $leftSize i32) + (local $left i32) + (local $root|10 i32) + (local $tail|11 i32) + local.get $endU64 + i32.wrap_i64 + local.set $end + i32.const 1 + drop + local.get $start + i64.extend_i32_u + local.get $endU64 + i64.le_u + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 382 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + local.set $start + local.get $end + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $end + block $~lib/rt/tlsf/GETTAIL|inlined.0 (result i32) + local.get $root + local.set $root|4 + local.get $root|4 + i32.load offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.0 + end + local.set $tail + i32.const 0 + local.set $tailInfo + local.get $tail + if + i32.const 1 + drop + local.get $start + local.get $tail + i32.const 4 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 389 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 16 + i32.sub + local.get $tail + i32.eq + if + local.get $start + i32.const 16 + i32.sub + local.set $start + local.get $tail + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $tailInfo + else + end + else + i32.const 1 + drop + local.get $start + local.get $root + i32.const 1572 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 402 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $end + local.get $start + i32.sub + local.set $size + local.get $size + i32.const 4 + i32.const 12 + i32.add + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + return + end + local.get $size + i32.const 2 + i32.const 4 + i32.mul + i32.sub + local.set $leftSize + local.get $start + local.set $left + local.get $left + local.get $leftSize + i32.const 1 + i32.or + local.get $tailInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:next + local.get $start + i32.const 4 + i32.add + local.get $leftSize + i32.add + local.set $tail + local.get $tail + i32.const 0 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.set $root|10 + local.get $tail + local.set $tail|11 + local.get $root|10 + local.get $tail|11 + i32.store offset=1568 + local.get $root + local.get $left + call $~lib/rt/tlsf/insertBlock + i32.const 1 + return + ) + (func $~lib/rt/tlsf/initialize + (local $rootOffset i32) + (local $pagesBefore i32) + (local $pagesNeeded i32) + (local $root i32) + (local $root|4 i32) + (local $tail i32) + (local $fl i32) + (local $root|7 i32) + (local $fl|8 i32) + (local $slMap i32) + (local $sl i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $head i32) + (local $memStart i32) + i32.const 0 + drop + global.get $~lib/memory/__heap_base + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $rootOffset + memory.size + local.set $pagesBefore + local.get $rootOffset + i32.const 1572 + i32.add + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesNeeded + local.get $pagesBefore + i32.gt_s + if (result i32) + local.get $pagesNeeded + local.get $pagesBefore + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + local.get $rootOffset + local.set $root + local.get $root + i32.const 0 + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|4 + i32.const 0 + local.set $tail + local.get $root|4 + local.get $tail + i32.store offset=1568 + i32.const 0 + local.set $fl + loop $for-loop|0 + local.get $fl + i32.const 23 + i32.lt_u + if + local.get $root + local.set $root|7 + local.get $fl + local.set $fl|8 + i32.const 0 + local.set $slMap + local.get $root|7 + local.get $fl|8 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store offset=4 + i32.const 0 + local.set $sl + loop $for-loop|1 + local.get $sl + i32.const 16 + i32.lt_u + if + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + i32.const 0 + local.set $head + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store offset=96 + local.get $sl + i32.const 1 + i32.add + local.set $sl + br $for-loop|1 + end + end + local.get $fl + i32.const 1 + i32.add + local.set $fl + br $for-loop|0 + end + end + local.get $rootOffset + i32.const 1572 + i32.add + local.set $memStart + i32.const 0 + drop + local.get $root + local.get $memStart + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + drop + local.get $root + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/tlsf/checkUsedBlock (param $ptr i32) (result i32) + (local $block i32) + local.get $ptr + i32.const 4 + i32.sub + local.set $block + local.get $ptr + i32.const 0 + i32.ne + if (result i32) + local.get $ptr + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + if (result i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 562 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $block + return + ) + (func $~lib/rt/tlsf/freeBlock (param $root i32) (param $block i32) + i32.const 0 + drop + local.get $block + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $block + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/__free (param $ptr i32) + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + return + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $ptr + call $~lib/rt/tlsf/checkUsedBlock + call $~lib/rt/tlsf/freeBlock + ) + (func $~lib/rt/itcms/free (param $obj i32) + local.get $obj + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:prev + else + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.sub + global.set $~lib/rt/itcms/total + i32.const 0 + drop + local.get $obj + i32.const 4 + i32.add + call $~lib/rt/tlsf/__free + end + ) + (func $~lib/rt/itcms/step (result i32) + (local $obj i32) + (local $1 i32) + (local $black i32) + (local $from i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + local.set $1 + local.get $1 + i32.const 0 + i32.eq + br_if $case0|0 + local.get $1 + i32.const 1 + i32.eq + br_if $case1|0 + local.get $1 + i32.const 2 + i32.eq + br_if $case2|0 + br $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $black + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|1 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + global.set $~lib/rt/itcms/iter + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.eq + if + i32.const 0 + call $~lib/rt/itcms/visitStack + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|2 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $from + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $from + global.set $~lib/rt/itcms/toSpace + local.get $black + global.set $~lib/rt/itcms/white + local.get $from + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/iter + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 1 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $obj + call $~lib/rt/itcms/free + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:nextWithColor + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:prev + i32.const 0 + global.set $~lib/rt/itcms/state + br $break|0 + end + i32.const 0 + return + ) + (func $~lib/rt/itcms/interrupt + (local $budget i32) + i32.const 0 + drop + i32.const 0 + drop + i32.const 1024 + i32.const 200 + i32.mul + i32.const 100 + i32.div_u + local.set $budget + loop $do-loop|0 + local.get $budget + call $~lib/rt/itcms/step + i32.sub + local.set $budget + global.get $~lib/rt/itcms/state + i32.const 0 + i32.eq + if + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i32.const 200 + i64.extend_i32_u + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + return + end + local.get $budget + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i32.const 1024 + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.mul + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + ) + (func $~lib/rt/tlsf/computeSize (param $size i32) (result i32) + local.get $size + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + end + return + ) + (func $~lib/rt/tlsf/prepareSize (param $size i32) (result i32) + local.get $size + i32.const 1073741820 + i32.gt_u + if + i32.const 0 + i32.const 32 + call $~lib/error/Error#constructor + throw $error + end + local.get $size + call $~lib/rt/tlsf/computeSize + return + ) + (func $~lib/rt/tlsf/roundSize (param $size i32) (result i32) + local.get $size + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $size + i32.const 1 + i32.const 27 + local.get $size + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $size + end + return + ) + (func $~lib/rt/tlsf/searchBlock (param $root i32) (param $size i32) (result i32) + (local $fl i32) + (local $sl i32) + (local $requestSize i32) + (local $root|5 i32) + (local $fl|6 i32) + (local $slMap i32) + (local $head i32) + (local $flMap i32) + (local $root|10 i32) + (local $fl|11 i32) + (local $root|12 i32) + (local $fl|13 i32) + (local $sl|14 i32) + (local $root|15 i32) + (local $fl|16 i32) + (local $sl|17 i32) + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + call $~lib/rt/tlsf/roundSize + local.set $requestSize + i32.const 4 + i32.const 8 + i32.mul + i32.const 1 + i32.sub + local.get $requestSize + i32.clz + i32.sub + local.set $fl + local.get $requestSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETSL|inlined.2 (result i32) + local.get $root + local.set $root|5 + local.get $fl + local.set $fl|6 + local.get $root|5 + local.get $fl|6 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.2 + end + i32.const 0 + i32.const -1 + i32.xor + local.get $sl + i32.shl + i32.and + local.set $slMap + i32.const 0 + local.set $head + local.get $slMap + i32.eqz + if + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 0 + i32.const -1 + i32.xor + local.get $fl + i32.const 1 + i32.add + i32.shl + i32.and + local.set $flMap + local.get $flMap + i32.eqz + if + i32.const 0 + local.set $head + else + local.get $flMap + i32.ctz + local.set $fl + block $~lib/rt/tlsf/GETSL|inlined.3 (result i32) + local.get $root + local.set $root|10 + local.get $fl + local.set $fl|11 + local.get $root|10 + local.get $fl|11 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.3 + end + local.set $slMap + i32.const 1 + drop + local.get $slMap + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.2 (result i32) + local.get $root + local.set $root|12 + local.get $fl + local.set $fl|13 + local.get $slMap + i32.ctz + local.set $sl|14 + local.get $root|12 + local.get $fl|13 + i32.const 4 + i32.shl + local.get $sl|14 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.2 + end + local.set $head + end + else + block $~lib/rt/tlsf/GETHEAD|inlined.3 (result i32) + local.get $root + local.set $root|15 + local.get $fl + local.set $fl|16 + local.get $slMap + i32.ctz + local.set $sl|17 + local.get $root|15 + local.get $fl|16 + i32.const 4 + i32.shl + local.get $sl|17 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.3 + end + local.set $head + end + local.get $head + return + ) + (func $~lib/rt/tlsf/growMemory (param $root i32) (param $size i32) + (local $pagesBefore i32) + (local $root|3 i32) + (local $pagesNeeded i32) + (local $5 i32) + (local $6 i32) + (local $pagesWanted i32) + (local $pagesAfter i32) + i32.const 0 + drop + local.get $size + i32.const 256 + i32.ge_u + if + local.get $size + call $~lib/rt/tlsf/roundSize + local.set $size + end + memory.size + local.set $pagesBefore + local.get $size + i32.const 4 + local.get $pagesBefore + i32.const 16 + i32.shl + i32.const 4 + i32.sub + block $~lib/rt/tlsf/GETTAIL|inlined.1 (result i32) + local.get $root + local.set $root|3 + local.get $root|3 + i32.load offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.1 + end + i32.ne + i32.shl + i32.add + local.set $size + local.get $size + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesBefore + local.tee $5 + local.get $pagesNeeded + local.tee $6 + local.get $5 + local.get $6 + i32.gt_s + select + local.set $pagesWanted + local.get $pagesWanted + memory.grow + i32.const 0 + i32.lt_s + if + local.get $pagesNeeded + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + memory.size + local.set $pagesAfter + local.get $root + local.get $pagesBefore + i32.const 16 + i32.shl + local.get $pagesAfter + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + drop + ) + (func $~lib/rt/tlsf/prepareBlock (param $root i32) (param $block i32) (param $size i32) + (local $blockInfo i32) + (local $remaining i32) + (local $spare i32) + (local $block|6 i32) + (local $block|7 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $size + i32.sub + local.set $remaining + local.get $remaining + i32.const 4 + i32.const 12 + i32.add + i32.ge_u + if + local.get $block + local.get $size + local.get $blockInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.set $spare + local.get $spare + local.get $remaining + i32.const 4 + i32.sub + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $spare + call $~lib/rt/tlsf/insertBlock + else + local.get $block + local.get $blockInfo + i32.const 1 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.3 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.add + local.get $block|7 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.3 + end + block $~lib/rt/tlsf/GETRIGHT|inlined.2 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.2 + end + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 2 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + end + ) + (func $~lib/rt/tlsf/allocateBlock (param $root i32) (param $size i32) (result i32) + (local $payloadSize i32) + (local $block i32) + local.get $size + call $~lib/rt/tlsf/prepareSize + local.set $payloadSize + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + local.get $block + i32.eqz + if + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/growMemory + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 499 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + i32.const 1 + drop + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $payloadSize + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 320 + i32.const 501 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $block + call $~lib/rt/tlsf/removeBlock + local.get $root + local.get $block + local.get $payloadSize + call $~lib/rt/tlsf/prepareBlock + i32.const 0 + drop + local.get $block + return + ) + (func $~lib/rt/tlsf/__alloc (param $size i32) (result i32) + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $size + call $~lib/rt/tlsf/allocateBlock + i32.const 4 + i32.add + return + ) + (func $~lib/rt/itcms/Object#set:rtId (param $this i32) (param $rtId i32) + local.get $this + local.get $rtId + i32.store offset=12 + ) + (func $~lib/rt/itcms/Object#set:rtSize (param $this i32) (param $rtSize i32) + local.get $this + local.get $rtSize + i32.store offset=16 + ) + (func $~lib/rt/itcms/__new (param $size i32) (param $id i32) (result i32) + (local $obj i32) + (local $ptr i32) + local.get $size + i32.const 1073741804 + i32.ge_u + if + i32.const 0 + i32.const 32 + call $~lib/error/Error#constructor + throw $error + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + call $~lib/rt/itcms/interrupt + end + i32.const 16 + local.get $size + i32.add + call $~lib/rt/tlsf/__alloc + i32.const 4 + i32.sub + local.set $obj + local.get $obj + local.get $id + call $~lib/rt/itcms/Object#set:rtId + local.get $obj + local.get $size + call $~lib/rt/itcms/Object#set:rtSize + local.get $obj + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.add + global.set $~lib/rt/itcms/total + local.get $obj + i32.const 20 + i32.add + local.set $ptr + local.get $ptr + i32.const 0 + local.get $size + memory.fill + local.get $ptr + return + ) + (func $~lib/rt/itcms/__link (param $parentPtr i32) (param $childPtr i32) (param $expectMultiple i32) + (local $child i32) + (local $parent i32) + (local $parentColor i32) + local.get $childPtr + i32.eqz + if + return + end + i32.const 1 + drop + local.get $parentPtr + i32.eqz + if + i32.const 0 + i32.const 128 + i32.const 295 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $childPtr + i32.const 20 + i32.sub + local.set $child + local.get $child + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $parentPtr + i32.const 20 + i32.sub + local.set $parent + local.get $parent + call $~lib/rt/itcms/Object#get:color + local.set $parentColor + local.get $parentColor + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $expectMultiple + if + local.get $parent + call $~lib/rt/itcms/Object#makeGray + else + local.get $child + call $~lib/rt/itcms/Object#makeGray + end + else + local.get $parentColor + i32.const 3 + i32.eq + if (result i32) + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + else + i32.const 0 + end + if + local.get $child + call $~lib/rt/itcms/Object#makeGray + end + end + end + ) + (func $~lib/error/Error#set:message (param $this i32) (param $message i32) + local.get $this + local.get $message + i32.store offset=8 + local.get $this + local.get $message + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/error/Error#set:name (param $this i32) (param $name i32) + local.get $this + local.get $name + i32.store + local.get $this + local.get $name + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/error/Error#set:stack (param $this i32) (param $stack i32) + local.get $this + local.get $stack + i32.store offset=4 + local.get $this + local.get $stack + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $exceptions/testTryCatch (result i32) + (local $e i32) + try $try|0 + i32.const 0 + i32.const 448 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e + i32.const 1 + return + end + unreachable + ) + (func $~lib/error/Error#get:message (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) + local.get $this + i32.load offset=16 + ) + (func $~lib/string/String#get:length (param $this i32) (result i32) + local.get $this + i32.const 20 + i32.sub + call $~lib/rt/common/OBJECT#get:rtSize + i32.const 1 + i32.shr_u + return + ) + (func $~lib/util/string/compareImpl (param $str1 i32) (param $index1 i32) (param $str2 i32) (param $index2 i32) (param $len i32) (result i32) + (local $ptr1 i32) + (local $ptr2 i32) + (local $7 i32) + (local $a i32) + (local $b i32) + local.get $str1 + local.get $index1 + i32.const 1 + i32.shl + i32.add + local.set $ptr1 + local.get $str2 + local.get $index2 + i32.const 1 + i32.shl + i32.add + local.set $ptr2 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $len + i32.const 4 + i32.ge_u + if (result i32) + local.get $ptr1 + i32.const 7 + i32.and + local.get $ptr2 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-loop|0 + local.get $ptr1 + i64.load + local.get $ptr2 + i64.load + i64.ne + if + br $do-break|0 + end + local.get $ptr1 + i32.const 8 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 8 + i32.add + local.set $ptr2 + local.get $len + i32.const 4 + i32.sub + local.set $len + local.get $len + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + loop $while-continue|1 + local.get $len + local.tee $7 + i32.const 1 + i32.sub + local.set $len + local.get $7 + if + local.get $ptr1 + i32.load16_u + local.set $a + local.get $ptr2 + i32.load16_u + local.set $b + local.get $a + local.get $b + i32.ne + if + local.get $a + local.get $b + i32.sub + return + end + local.get $ptr1 + i32.const 2 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 2 + i32.add + local.set $ptr2 + br $while-continue|1 + end + end + i32.const 0 + return + ) + (func $exceptions/testNoThrow (result i32) + (local $e i32) + try $try|0 + i32.const 1 + return + catch $error + + local.set $e + i32.const 2 + return + end + unreachable + ) + (func $exceptions/testFinally + (local $0 i32) + try $try_finally|0 + catch_all + i32.const 1 + global.set $exceptions/finallyRan + rethrow $try_finally|0 + end + i32.const 1 + global.set $exceptions/finallyRan + local.get $0 + i32.const 1 + i32.eq + if + return + end + ) + (func $exceptions/testNested (result i32) + (local $e i32) + (local $e|1 i32) + try $try|0 + try $try|1 + i32.const 0 + i32.const 560 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e + i32.const 0 + i32.const 592 + call $~lib/error/Error#constructor + throw $error + end + unreachable + catch $error + + local.set $e|1 + i32.const 42 + return + end + unreachable + ) + (func $exceptions/testReturnInCatchFinally (result i32) + (local $e i32) + (local $1 i32) + (local $2 i32) + (local $e|3 i32) + block $finally_dispatch|0 + try $try_finally|0 + try $try|1 + i32.const 0 + i32.const 624 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e|3 + i32.const 10 + local.set $2 + i32.const 1 + local.set $1 + br $finally_dispatch|0 + end + unreachable + catch_all + i32.const 1 + global.set $exceptions/returnInCatchFinallyRan + rethrow $try_finally|0 + end + unreachable + end + i32.const 1 + global.set $exceptions/returnInCatchFinallyRan + local.get $1 + i32.const 1 + i32.eq + if + local.get $2 + return + end + unreachable + ) + (func $exceptions/testTryCatchFinally + (local $e i32) + (local $1 i32) + (local $e|2 i32) + try $try_finally|0 + try $try|1 + i32.const 0 + i32.const 624 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e|2 + i32.const 10 + global.set $exceptions/tryCatchFinallyResult + end + catch_all + i32.const 1 + global.set $exceptions/tryCatchFinallyRan + rethrow $try_finally|0 + end + i32.const 1 + global.set $exceptions/tryCatchFinallyRan + local.get $1 + i32.const 1 + i32.eq + if + return + end + ) + (func $exceptions/innerThrow + (local $0 i32) + try $try_finally|0 + i32.const 0 + i32.const 656 + call $~lib/error/Error#constructor + throw $error + catch_all + i32.const 1 + global.set $exceptions/finallyWithExceptionRan + rethrow $try_finally|0 + end + unreachable + ) + (func $exceptions/testFinallyWithException (result i32) + (local $e i32) + try $try|0 + call $exceptions/innerThrow + catch $error + + local.set $e + global.get $exceptions/finallyWithExceptionRan + if (result i32) + i32.const 1 + else + i32.const 0 + end + return + end + i32.const 0 + return + ) + (func $exceptions/testFinallyNormalCompletion (result i32) + (local $0 i32) + (local $1 i32) + try $try_finally|0 + catch_all + i32.const 1 + global.set $exceptions/finallyNormalRan + rethrow $try_finally|0 + end + i32.const 1 + global.set $exceptions/finallyNormalRan + local.get $0 + i32.const 1 + i32.eq + if + local.get $1 + return + end + global.get $exceptions/finallyNormalRan + if (result i32) + i32.const 1 + else + i32.const 0 + end + return + ) + (func $exceptions/CustomError#set:code (param $this i32) (param $code i32) + local.get $this + local.get $code + i32.store offset=12 + ) + (func $exceptions/testCustomError (result i32) + (local $e i32) + try $try|0 + i32.const 0 + i32.const 704 + i32.const 42 + call $exceptions/CustomError#constructor + throw $error + catch $error + + local.set $e + i32.const 1 + return + end + unreachable + ) + (func $exceptions/Resource#set:id (param $this i32) (param $id i32) + local.get $this + local.get $id + i32.store + ) + (func $exceptions/Resource#doWork (param $this i32) + ) + (func $exceptions/Resource#dispose (param $this i32) + global.get $exceptions/Resource.disposed + i32.const 1 + i32.add + global.set $exceptions/Resource.disposed + ) + (func $exceptions/Resource#doWorkThatThrows (param $this i32) + i32.const 0 + i32.const 736 + call $~lib/error/Error#constructor + throw $error + ) + (func $exceptions/Calculator#set:value (param $this i32) (param $value i32) + local.get $this + local.get $value + i32.store + ) + (func $exceptions/Calculator#get:value (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $exceptions/Outer#set:inner (param $this i32) (param $inner i32) + local.get $this + local.get $inner + i32.store + local.get $this + local.get $inner + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $exceptions/Outer#get:inner (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $exceptions/Inner#riskyOperation (param $this i32) (result i32) + (local $e i32) + try $try|0 + i32.const 0 + i32.const 848 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e + i32.const 0 + i32.const 896 + call $~lib/error/Error#constructor + throw $error + end + unreachable + ) + (func $~lib/array/Array#set:buffer (param $this i32) (param $buffer i32) + local.get $this + local.get $buffer + i32.store + local.get $this + local.get $buffer + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $~lib/array/Array#set:dataStart (param $this i32) (param $dataStart i32) + local.get $this + local.get $dataStart + i32.store offset=4 + ) + (func $~lib/array/Array#set:byteLength (param $this i32) (param $byteLength i32) + local.get $this + local.get $byteLength + i32.store offset=8 + ) + (func $~lib/array/Array#set:length_ (param $this i32) (param $length_ i32) + local.get $this + local.get $length_ + i32.store offset=12 + ) + (func $~lib/array/Array#get:length_ (param $this i32) (result i32) + local.get $this + i32.load offset=12 + ) + (func $~lib/arraybuffer/ArrayBufferView#get:byteLength (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/arraybuffer/ArrayBufferView#get:buffer (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/itcms/Object#get:rtSize (param $this i32) (result i32) + local.get $this + i32.load offset=16 + ) + (func $~lib/rt/itcms/__renew (param $oldPtr i32) (param $size i32) (result i32) + (local $oldObj i32) + (local $newPtr i32) + (local $4 i32) + (local $5 i32) + local.get $oldPtr + i32.const 20 + i32.sub + local.set $oldObj + local.get $size + local.get $oldObj + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $oldObj + local.get $size + call $~lib/rt/itcms/Object#set:rtSize + local.get $oldPtr + return + end + local.get $size + local.get $oldObj + call $~lib/rt/itcms/Object#get:rtId + call $~lib/rt/itcms/__new + local.set $newPtr + local.get $newPtr + local.get $oldPtr + local.get $size + local.tee $4 + local.get $oldObj + call $~lib/rt/itcms/Object#get:rtSize + local.tee $5 + local.get $4 + local.get $5 + i32.lt_u + select + memory.copy + local.get $newPtr + return + ) + (func $~lib/array/Array#get:dataStart (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $exceptions/testRethrowWithFinally (result i32) + (local $e i32) + i32.const 0 + global.set $exceptions/rethrowFinallyRan + try $try|0 + call $exceptions/innerRethrow + catch $error + + local.set $e + global.get $exceptions/rethrowFinallyRan + if (result i32) + i32.const 1 + else + i32.const 0 + end + return + end + i32.const 0 + return + ) + (func $exceptions/StateMachine#set:state (param $this i32) (param $state i32) + local.get $this + local.get $state + i32.store + ) + (func $exceptions/StateMachine#set:errorState (param $this i32) (param $errorState i32) + local.get $this + local.get $errorState + i32.store8 offset=4 + ) + (func $exceptions/StateMachine#get:state (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $exceptions/StateMachine#get:errorState (param $this i32) (result i32) + local.get $this + i32.load8_u offset=4 + ) + (func $exceptions/Counter#set:count (param $this i32) (param $count i32) + local.get $this + local.get $count + i32.store + ) + (func $exceptions/Counter#get:count (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $exceptions/testReturnFromTry (result i32) + (local $e i32) + (local $1 i32) + (local $2 i32) + (local $e|3 i32) + block $finally_dispatch|0 + try $try_finally|0 + try $try|1 + i32.const 42 + local.set $2 + i32.const 1 + local.set $1 + br $finally_dispatch|0 + catch $error + + local.set $e|3 + i32.const -1 + local.set $2 + i32.const 1 + local.set $1 + br $finally_dispatch|0 + end + unreachable + catch_all + rethrow $try_finally|0 + end + unreachable + end + local.get $1 + i32.const 1 + i32.eq + if + local.get $2 + return + end + unreachable + ) + (func $exceptions/testMultipleReturnsWithFinally (param $x i32) (result i32) + (local $e i32) + (local $2 i32) + (local $3 i32) + (local $e|4 i32) + block $finally_dispatch|0 + try $try_finally|0 + try $try|1 + local.get $x + i32.const 0 + i32.lt_s + if + i32.const -1 + local.set $3 + i32.const 1 + local.set $2 + br $finally_dispatch|0 + end + local.get $x + i32.const 0 + i32.eq + if + i32.const 0 + i32.const 1728 + call $~lib/error/Error#constructor + throw $error + end + local.get $x + i32.const 100 + i32.gt_s + if + i32.const 100 + local.set $3 + i32.const 1 + local.set $2 + br $finally_dispatch|0 + end + local.get $x + local.set $3 + i32.const 1 + local.set $2 + br $finally_dispatch|0 + catch $error + + local.set $e|4 + i32.const 0 + local.set $3 + i32.const 1 + local.set $2 + br $finally_dispatch|0 + end + unreachable + catch_all + global.get $exceptions/multiReturnFinallyCount + i32.const 1 + i32.add + global.set $exceptions/multiReturnFinallyCount + rethrow $try_finally|0 + end + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 1 + i32.add + global.set $exceptions/multiReturnFinallyCount + local.get $2 + i32.const 1 + i32.eq + if + local.get $3 + return + end + unreachable + ) + (func $exceptions/testReturnInFinally (result i32) + (local $0 i32) + (local $1 i32) + block $finally_dispatch|0 + try $try_finally|0 + i32.const 1 + local.set $1 + i32.const 1 + local.set $0 + br $finally_dispatch|0 + catch_all + i32.const 2 + return + end + unreachable + end + i32.const 2 + return + ) + (func $exceptions/testReturnInFinallyOverridesCatch (result i32) + (local $e i32) + (local $1 i32) + (local $2 i32) + (local $e|3 i32) + block $finally_dispatch|0 + try $try_finally|0 + try $try|1 + i32.const 0 + i32.const 1760 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e|3 + i32.const 1 + local.set $2 + i32.const 1 + local.set $1 + br $finally_dispatch|0 + end + unreachable + catch_all + i32.const 2 + return + end + unreachable + end + i32.const 2 + return + ) + (func $exceptions/testReturnInFinallySuppressesException (result i32) + (local $0 i32) + (local $1 i32) + try $try_finally|0 + i32.const 0 + i32.const 1792 + call $~lib/error/Error#constructor + throw $error + catch_all + i32.const 1 + global.set $exceptions/finallyReturnSuppressedExceptionRan + i32.const 42 + return + end + unreachable + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + global.get $exceptions/calc + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/outer + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/sm + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/deepNestingOrder + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/counter + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end + i32.const 224 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 992 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 32 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load + local.get $1 + call $~lib/rt/itcms/__visit + ) + (func $~lib/object/Object~visit (param $0 i32) (param $1 i32) + ) + (func $~lib/error/Error~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load + local.get $1 + call $~lib/rt/itcms/__visit + local.get $0 + i32.load offset=4 + local.get $1 + call $~lib/rt/itcms/__visit + local.get $0 + i32.load offset=8 + local.get $1 + call $~lib/rt/itcms/__visit + ) + (func $exceptions/CustomError~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/error/Error~visit + ) + (func $exceptions/Outer~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + i32.load + local.get $1 + call $~lib/rt/itcms/__visit + ) + (func $~lib/array/Array#get:buffer (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/array/Array~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/object/Object~visit + local.get $0 + local.get $1 + call $~lib/array/Array#__visit + ) + (func $~lib/error/RangeError~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/error/Error~visit + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + block $exceptions/Counter + block $exceptions/StateMachine + block $~lib/error/RangeError + block $~lib/array/Array + block $exceptions/Inner + block $exceptions/Outer + block $exceptions/Calculator + block $exceptions/Resource + block $exceptions/CustomError + block $~lib/error/Error + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $~lib/error/Error $exceptions/CustomError $exceptions/Resource $exceptions/Calculator $exceptions/Outer $exceptions/Inner $~lib/array/Array $~lib/error/RangeError $exceptions/StateMachine $exceptions/Counter $invalid + end + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + local.get $0 + local.get $1 + call $~lib/error/Error~visit + return + end + local.get $0 + local.get $1 + call $exceptions/CustomError~visit + return + end + return + end + return + end + local.get $0 + local.get $1 + call $exceptions/Outer~visit + return + end + return + end + local.get $0 + local.get $1 + call $~lib/array/Array~visit + return + end + local.get $0 + local.get $1 + call $~lib/error/RangeError~visit + return + end + return + end + return + end + unreachable + ) + (func $~start + call $start:exceptions + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 34688 + i32.const 34736 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $~lib/error/Error#constructor (param $this i32) (param $message i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + local.get $message + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + call $~lib/error/Error#set:message + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 384 + call $~lib/error/Error#set:name + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 416 + call $~lib/error/Error#set:stack + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $exceptions/testCatchVar (result i32) + (local $e i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + try $try|0 + i32.const 0 + i32.const 528 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e + local.get $e + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + call $~lib/error/Error#get:message + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + return + end + unreachable + ) + (func $~lib/string/String.__eq (param $left i32) (param $right i32) (result i32) + (local $leftLength i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $left + local.get $right + i32.eq + if + i32.const 1 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $right + i32.const 0 + i32.eq + end + if + i32.const 0 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/string/String#get:length + local.set $leftLength + local.get $leftLength + local.get $right + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + i32.const 0 + local.get $right + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + i32.const 0 + local.get $leftLength + call $~lib/util/string/compareImpl + i32.eqz + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + ) + (func $exceptions/CustomError#constructor (param $this i32) (param $message i32) (param $code i32) (result i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + local.get $code + call $exceptions/CustomError#set:code + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + local.get $message + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 + call $~lib/error/Error#constructor + local.tee $this + i32.store + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + ) + (func $exceptions/Resource#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 6 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 0 + call $exceptions/Resource#set:id + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + global.get $exceptions/Resource.instances + i32.const 1 + i32.add + global.set $exceptions/Resource.instances + global.get $exceptions/Resource.instances + call $exceptions/Resource#set:id + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $exceptions/testResourceCleanup (result i32) + (local $r i32) + (local $result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + call $exceptions/Resource#constructor + local.tee $r + i32.store + i32.const 0 + local.set $result + try $try_finally|0 + local.get $r + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $exceptions/Resource#doWork + i32.const 1 + local.set $result + catch_all + local.get $r + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $exceptions/Resource#dispose + rethrow $try_finally|0 + end + local.get $r + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $exceptions/Resource#dispose + local.get $2 + i32.const 1 + i32.eq + if + local.get $3 + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + end + local.get $result + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + ) + (func $exceptions/testResourceCleanupWithException (result i32) + (local $r i32) + (local $1 i32) + (local $2 i32) + (local $e i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + i32.const 0 + global.set $exceptions/Resource.disposed + global.get $~lib/memory/__stack_pointer + i32.const 0 + call $exceptions/Resource#constructor + local.tee $r + i32.store + try $try|0 + try $try_finally|1 + local.get $r + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $exceptions/Resource#doWorkThatThrows + catch_all + local.get $r + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $exceptions/Resource#dispose + rethrow $try_finally|1 + end + local.get $r + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $exceptions/Resource#dispose + local.get $1 + i32.const 1 + i32.eq + if + local.get $2 + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + end + catch $error + + local.set $e + global.get $exceptions/Resource.disposed + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + end + i32.const 0 + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + ) + (func $exceptions/Calculator#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 7 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/object/Object#constructor + local.tee $this + i32.store + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 0 + call $exceptions/Calculator#set:value + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $exceptions/Calculator#divide (param $this i32) (param $a i32) (param $b i32) (result i32) + (local $e i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + try $try|0 + local.get $b + i32.const 0 + i32.eq + if + i32.const 0 + i32.const 784 + call $~lib/error/Error#constructor + throw $error + end + local.get $a + local.get $b + i32.div_s + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + catch $error + + local.set $e + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + i32.const -1 + call $exceptions/Calculator#set:value + i32.const 0 + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + end + unreachable + ) + (func $exceptions/Calculator#safeDivide (param $this i32) (param $a i32) (param $b i32) (result i32) + (local $e i32) + (local $4 i32) + (local $5 i32) + (local $e|6 i32) + (local $7 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + block $finally_dispatch|0 + try $try_finally|0 + try $try|1 + local.get $b + i32.const 0 + i32.eq + if + i32.const 0 + i32.const 784 + call $~lib/error/Error#constructor + throw $error + end + local.get $this + local.set $7 + global.get $~lib/memory/__stack_pointer + local.get $7 + i32.store + local.get $7 + local.get $a + local.get $b + i32.div_s + call $exceptions/Calculator#set:value + local.get $this + local.set $7 + global.get $~lib/memory/__stack_pointer + local.get $7 + i32.store + local.get $7 + call $exceptions/Calculator#get:value + local.set $5 + i32.const 1 + local.set $4 + br $finally_dispatch|0 + catch $error + + local.set $e|6 + i32.const -1 + local.set $5 + i32.const 1 + local.set $4 + br $finally_dispatch|0 + end + unreachable + catch_all + rethrow $try_finally|0 + end + unreachable + end + local.get $4 + i32.const 1 + i32.eq + if + local.get $5 + local.set $7 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $7 + return + end + unreachable + ) + (func $exceptions/Inner#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 9 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/object/Object#constructor + local.tee $this + i32.store + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $exceptions/Outer#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 8 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 0 + call $exceptions/Outer#set:inner + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 0 + call $exceptions/Inner#constructor + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=8 + local.get $1 + call $exceptions/Outer#set:inner + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $exceptions/Outer#process (param $this i32) (result i32) + (local $e i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + try $try|0 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $exceptions/Outer#get:inner + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $exceptions/Inner#riskyOperation + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + catch $error + + local.set $e + i32.const -1 + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + end + unreachable + ) + (func $~lib/error/RangeError#constructor (param $this i32) (param $message i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.const 11 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + local.get $message + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + local.get $2 + call $~lib/error/Error#constructor + local.tee $this + i32.store + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.const 944 + call $~lib/error/Error#set:name + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $~lib/array/Array#constructor (param $this i32) (param $length i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $bufferSize i32) + (local $buffer i32) + (local $6 i32) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.const 10 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + i32.const 0 + call $~lib/array/Array#set:buffer + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + i32.const 0 + call $~lib/array/Array#set:dataStart + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + i32.const 0 + call $~lib/array/Array#set:byteLength + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + i32.const 0 + call $~lib/array/Array#set:length_ + local.get $length + i32.const 1073741820 + i32.const 2 + i32.shr_u + i32.gt_u + if + i32.const 0 + i32.const 992 + call $~lib/error/RangeError#constructor + throw $error + end + local.get $length + local.tee $2 + i32.const 8 + local.tee $3 + local.get $2 + local.get $3 + i32.gt_u + select + i32.const 2 + i32.shl + local.set $bufferSize + global.get $~lib/memory/__stack_pointer + local.get $bufferSize + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $buffer + i32.store offset=8 + i32.const 2 + global.get $~lib/shared/runtime/Runtime.Incremental + i32.ne + drop + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + local.get $buffer + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=12 + local.get $6 + call $~lib/array/Array#set:buffer + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + local.get $buffer + call $~lib/array/Array#set:dataStart + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + local.get $bufferSize + call $~lib/array/Array#set:byteLength + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + local.get $6 + local.get $length + call $~lib/array/Array#set:length_ + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + ) + (func $~lib/array/ensureCapacity (param $array i32) (param $newSize i32) (param $alignLog2 i32) (param $canGrow i32) + (local $oldCapacity i32) + (local $oldData i32) + (local $6 i32) + (local $7 i32) + (local $newCapacity i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $newData i32) + (local $14 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $array + local.set $14 + global.get $~lib/memory/__stack_pointer + local.get $14 + i32.store + local.get $14 + call $~lib/arraybuffer/ArrayBufferView#get:byteLength + local.set $oldCapacity + local.get $newSize + local.get $oldCapacity + local.get $alignLog2 + i32.shr_u + i32.gt_u + if + local.get $newSize + i32.const 1073741820 + local.get $alignLog2 + i32.shr_u + i32.gt_u + if + i32.const 0 + i32.const 992 + call $~lib/error/RangeError#constructor + throw $error + end + local.get $array + local.set $14 + global.get $~lib/memory/__stack_pointer + local.get $14 + i32.store + local.get $14 + call $~lib/arraybuffer/ArrayBufferView#get:buffer + local.set $oldData + local.get $newSize + local.tee $6 + i32.const 8 + local.tee $7 + local.get $6 + local.get $7 + i32.gt_u + select + local.get $alignLog2 + i32.shl + local.set $newCapacity + local.get $canGrow + if + local.get $oldCapacity + i32.const 1 + i32.shl + local.tee $9 + i32.const 1073741820 + local.tee $10 + local.get $9 + local.get $10 + i32.lt_u + select + local.tee $11 + local.get $newCapacity + local.tee $12 + local.get $11 + local.get $12 + i32.gt_u + select + local.set $newCapacity + end + local.get $oldData + local.get $newCapacity + call $~lib/rt/itcms/__renew + local.set $newData + i32.const 2 + global.get $~lib/shared/runtime/Runtime.Incremental + i32.ne + drop + local.get $newData + local.get $oldData + i32.ne + if + local.get $array + local.get $newData + i32.store + local.get $array + local.get $newData + i32.store offset=4 + local.get $array + local.get $newData + i32.const 0 + call $~lib/rt/itcms/__link + end + local.get $array + local.get $newCapacity + i32.store offset=8 + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/array/Array#__set (param $this i32) (param $index i32) (param $value i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $index + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/array/Array#get:length_ + i32.ge_u + if + local.get $index + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 224 + call $~lib/error/RangeError#constructor + throw $error + end + local.get $this + local.get $index + i32.const 1 + i32.add + i32.const 2 + i32.const 1 + call $~lib/array/ensureCapacity + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + local.get $index + i32.const 1 + i32.add + call $~lib/array/Array#set:length_ + end + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/array/Array#get:dataStart + local.get $index + i32.const 2 + i32.shl + i32.add + local.get $value + i32.store + i32.const 0 + drop + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/array/Array#get:length (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + call $~lib/array/Array#get:length_ + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + return + ) + (func $~lib/array/Array#__get (param $this i32) (param $index i32) (result i32) + (local $value i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $index + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/array/Array#get:length_ + i32.ge_u + if + i32.const 0 + i32.const 224 + call $~lib/error/RangeError#constructor + throw $error + end + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/array/Array#get:dataStart + local.get $index + i32.const 2 + i32.shl + i32.add + i32.load + local.set $value + i32.const 0 + drop + local.get $value + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + ) + (func $exceptions/testArrayWithExceptions (result i32) + (local $arr i32) + (local $sum i32) + (local $i i32) + (local $e i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 3 + call $~lib/array/Array#constructor + local.tee $arr + i32.store + local.get $arr + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + i32.const 0 + i32.const 1 + call $~lib/array/Array#__set + local.get $arr + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + i32.const 1 + i32.const 2 + call $~lib/array/Array#__set + local.get $arr + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + i32.const 2 + i32.const 3 + call $~lib/array/Array#__set + i32.const 0 + local.set $sum + try $try|0 + i32.const 0 + local.set $i + loop $for-loop|1 + local.get $i + local.get $arr + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + call $~lib/array/Array#get:length + i32.lt_s + if + local.get $sum + local.get $arr + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + local.get $i + call $~lib/array/Array#__get + i32.add + local.set $sum + local.get $sum + i32.const 5 + i32.gt_s + if + i32.const 0 + i32.const 1040 + call $~lib/error/Error#constructor + throw $error + end + local.get $i + i32.const 1 + i32.add + local.set $i + br $for-loop|1 + end + end + catch $error + + local.set $e + local.get $sum + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + end + i32.const 0 + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + ) + (func $~lib/string/String#concat (param $this i32) (param $other i32) (result i32) + (local $thisSize i32) + (local $otherSize i32) + (local $outSize i32) + (local $out i32) + (local $6 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store + local.get $6 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + local.set $thisSize + local.get $other + local.set $6 + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store + local.get $6 + call $~lib/string/String#get:length + i32.const 1 + i32.shl + local.set $otherSize + local.get $thisSize + local.get $otherSize + i32.add + local.set $outSize + local.get $outSize + i32.const 0 + i32.eq + if + i32.const 416 + local.set $6 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + return + end + global.get $~lib/memory/__stack_pointer + local.get $outSize + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $out + i32.store offset=4 + local.get $out + local.get $this + local.get $thisSize + memory.copy + local.get $out + local.get $thisSize + i32.add + local.get $other + local.get $otherSize + memory.copy + local.get $out + local.set $6 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + return + ) + (func $~lib/string/String.__concat (param $left i32) (param $right i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $left + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + local.get $right + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $~lib/string/String#concat + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + ) + (func $exceptions/innerRethrow + (local $e i32) + (local $1 i32) + (local $e|2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + try $try_finally|0 + try $try|1 + i32.const 0 + i32.const 1088 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e|2 + i32.const 0 + global.set $exceptions/rethrowFinallyRan + i32.const 0 + i32.const 1136 + local.get $e|2 + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 + call $~lib/error/Error#get:message + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + call $~lib/string/String.__concat + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/error/Error#constructor + throw $error + end + unreachable + catch_all + i32.const 1 + global.set $exceptions/rethrowFinallyRan + rethrow $try_finally|0 + end + unreachable + ) + (func $exceptions/StateMachine#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 5 + i32.const 12 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/object/Object#constructor + local.tee $this + i32.store + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 0 + call $exceptions/StateMachine#set:state + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 0 + call $exceptions/StateMachine#set:errorState + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $exceptions/StateMachine#transition (param $this i32) (param $newState i32) + (local $e i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + try $try|0 + local.get $newState + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 1184 + call $~lib/error/Error#constructor + throw $error + end + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + local.get $newState + call $exceptions/StateMachine#set:state + catch $error + + local.set $e + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + i32.const 1 + call $exceptions/StateMachine#set:errorState + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + i32.const -1 + call $exceptions/StateMachine#set:state + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $exceptions/StateMachine#reset (param $this i32) + (local $1 i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + try $try_finally|0 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 0 + call $exceptions/StateMachine#set:state + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + i32.const 0 + call $exceptions/StateMachine#set:errorState + catch_all + rethrow $try_finally|0 + end + local.get $1 + i32.const 1 + i32.eq + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $exceptions/testDeepNesting (result i32) + (local $e i32) + (local $1 i32) + (local $2 i32) + (local $e|3 i32) + (local $e|4 i32) + (local $5 i32) + (local $6 i32) + (local $e|7 i32) + (local $8 i32) + (local $9 i32) + (local $e|10 i32) + (local $e|11 i32) + (local $e|12 i32) + (local $13 i32) + (local $14 i32) + (local $e|15 i32) + (local $16 i32) + (local $17 i32) + (local $e|18 i32) + (local $e|19 i32) + (local $20 i32) + (local $21 i32) + (local $e|22 i32) + (local $23 i32) + (local $24 i32) + (local $e|25 i32) + (local $e|26 i32) + (local $e|27 i32) + (local $28 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 416 + global.set $exceptions/deepNestingOrder + try $try_finally|0 + try $try|7 + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1232 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + try $try_finally|8 + try $try|11 + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1264 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + try $try_finally|12 + try $try|13 + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1296 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + i32.const 0 + i32.const 1328 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $e|25 + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1360 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + i32.const 0 + i32.const 1392 + call $~lib/error/Error#constructor + throw $error + end + unreachable + catch_all + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1440 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + rethrow $try_finally|12 + end + unreachable + catch $error + + local.set $e|26 + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1472 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + end + catch_all + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1504 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + rethrow $try_finally|8 + end + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1504 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + local.get $20 + i32.const 1 + i32.eq + if + local.get $21 + local.set $28 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $28 + return + end + catch $error + + local.set $e|27 + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1536 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + end + catch_all + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1568 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + rethrow $try_finally|0 + end + global.get $exceptions/deepNestingOrder + local.set $28 + global.get $~lib/memory/__stack_pointer + local.get $28 + i32.store + local.get $28 + i32.const 1568 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + local.get $13 + i32.const 1 + i32.eq + if + local.get $14 + local.set $28 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $28 + return + end + i32.const 1 + local.set $28 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $28 + return + ) + (func $exceptions/Counter#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 13 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/object/Object#constructor + local.tee $this + i32.store + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 0 + call $exceptions/Counter#set:count + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $exceptions/Counter#increment (param $this i32) (result i32) + (local $e i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + try $try|0 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + call $exceptions/Counter#get:count + i32.const 1 + i32.add + call $exceptions/Counter#set:count + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $exceptions/Counter#get:count + i32.const 3 + i32.gt_s + if + i32.const 0 + i32.const 1680 + call $~lib/error/Error#constructor + throw $error + end + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $exceptions/Counter#get:count + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + catch $error + + local.set $e + i32.const -1 + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + end + unreachable + ) + (func $start:exceptions + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 80 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 176 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 272 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + call $exceptions/testTryCatch + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 15 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testCatchVar + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 528 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 26 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testNoThrow + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 36 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testFinally + global.get $exceptions/finallyRan + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 48 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testNested + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 63 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testReturnInCatchFinally + i32.const 10 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 76 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/returnInCatchFinallyRan + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 77 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testTryCatchFinally + global.get $exceptions/tryCatchFinallyResult + i32.const 10 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 92 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/tryCatchFinallyRan + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 93 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testFinallyWithException + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 112 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testFinallyNormalCompletion + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 124 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testCustomError + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 147 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testResourceCleanup + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 185 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/Resource.disposed + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 186 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testResourceCleanupWithException + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 203 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $exceptions/Calculator#constructor + global.set $exceptions/calc + global.get $exceptions/calc + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 10 + i32.const 2 + call $exceptions/Calculator#divide + i32.const 5 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 237 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/calc + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 10 + i32.const 0 + call $exceptions/Calculator#divide + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 238 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/calc + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/Calculator#get:value + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 239 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/calc + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 0 + call $exceptions/Calculator#set:value + global.get $exceptions/calc + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 20 + i32.const 4 + call $exceptions/Calculator#safeDivide + i32.const 5 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 242 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/calc + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 20 + i32.const 0 + call $exceptions/Calculator#safeDivide + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 243 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $exceptions/Outer#constructor + global.set $exceptions/outer + global.get $exceptions/outer + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/Outer#process + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 274 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testArrayWithExceptions + i32.const 6 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 296 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testRethrowWithFinally + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 321 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $exceptions/StateMachine#constructor + global.set $exceptions/sm + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1 + call $exceptions/StateMachine#transition + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/StateMachine#get:state + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 352 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/StateMachine#get:errorState + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 353 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const -5 + call $exceptions/StateMachine#transition + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/StateMachine#get:state + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 356 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/StateMachine#get:errorState + i32.const 0 + i32.ne + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 357 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/StateMachine#reset + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/StateMachine#get:state + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 360 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/sm + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/StateMachine#get:errorState + i32.const 0 + i32.ne + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 361 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testDeepNesting + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 393 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/deepNestingOrder + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1600 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 394 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $exceptions/Counter#constructor + global.set $exceptions/counter + global.get $exceptions/counter + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 414 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/counter + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 415 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/counter + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 416 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/counter + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 417 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testReturnFromTry + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 429 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + global.set $exceptions/multiReturnFinallyCount + i32.const -5 + call $exceptions/testMultipleReturnsWithFinally + i32.const -1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 453 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 454 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $exceptions/testMultipleReturnsWithFinally + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 456 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 457 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 50 + call $exceptions/testMultipleReturnsWithFinally + i32.const 50 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 459 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 460 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 200 + call $exceptions/testMultipleReturnsWithFinally + i32.const 100 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 462 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 4 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 463 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testReturnInFinally + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 473 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testReturnInFinallyOverridesCatch + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 485 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $exceptions/testReturnInFinallySuppressesException + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 497 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/finallyReturnSuppressedExceptionRan + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 480 + i32.const 498 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/array/Array#__visit (param $this i32) (param $cookie i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 0 + drop + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/array/Array#get:buffer + local.get $cookie + call $~lib/rt/itcms/__visit + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/object/Object#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) +) diff --git a/tests/compiler/exceptions.json b/tests/compiler/exceptions.json new file mode 100644 index 0000000000..bf3583d70c --- /dev/null +++ b/tests/compiler/exceptions.json @@ -0,0 +1,3 @@ +{ + "features": ["exception-handling"] +} diff --git a/tests/compiler/exceptions.release.wat b/tests/compiler/exceptions.release.wat new file mode 100644 index 0000000000..a01f0e9ecb --- /dev/null +++ b/tests/compiler/exceptions.release.wat @@ -0,0 +1,4387 @@ +(module + (type $0 (func (param i32 i32) (result i32))) + (type $1 (func (param i32))) + (type $2 (func)) + (type $3 (func (param i32 i32))) + (type $4 (func (param i32) (result i32))) + (type $5 (func (result i32))) + (type $6 (func (param i32 i32 i32 i32))) + (type $7 (func (param i32 i32 i64))) + (type $8 (func (param i32 i32 i32))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $exceptions/tryCatchFinallyRan (mut i32) (i32.const 0)) + (global $exceptions/tryCatchFinallyResult (mut i32) (i32.const 0)) + (global $exceptions/finallyWithExceptionRan (mut i32) (i32.const 0)) + (global $exceptions/Resource.instances (mut i32) (i32.const 0)) + (global $exceptions/Resource.disposed (mut i32) (i32.const 0)) + (global $exceptions/calc (mut i32) (i32.const 0)) + (global $exceptions/outer (mut i32) (i32.const 0)) + (global $exceptions/rethrowFinallyRan (mut i32) (i32.const 0)) + (global $exceptions/sm (mut i32) (i32.const 0)) + (global $exceptions/deepNestingOrder (mut i32) (i32.const 1440)) + (global $exceptions/counter (mut i32) (i32.const 0)) + (global $exceptions/multiReturnFinallyCount (mut i32) (i32.const 0)) + (global $exceptions/finallyReturnSuppressedExceptionRan (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 35692)) + (memory $0 1) + (data $0 (i32.const 1036) "<") + (data $0.1 (i32.const 1048) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data $2 (i32.const 1132) "<") + (data $2.1 (i32.const 1144) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data $4 (i32.const 1228) "<") + (data $4.1 (i32.const 1240) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data $6 (i32.const 1324) "<") + (data $6.1 (i32.const 1336) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data $7 (i32.const 1388) "\1c") + (data $7.1 (i32.const 1400) "\02\00\00\00\n\00\00\00E\00r\00r\00o\00r") + (data $8 (i32.const 1420) "\1c") + (data $8.1 (i32.const 1432) "\02") + (data $9 (i32.const 1452) "\1c") + (data $9.1 (i32.const 1464) "\02\00\00\00\08\00\00\00o\00o\00p\00s") + (data $10 (i32.const 1484) ",") + (data $10.1 (i32.const 1496) "\02\00\00\00\1a\00\00\00e\00x\00c\00e\00p\00t\00i\00o\00n\00s\00.\00t\00s") + (data $11 (i32.const 1532) "\1c") + (data $11.1 (i32.const 1544) "\02\00\00\00\06\00\00\00m\00s\00g") + (data $12 (i32.const 1564) "\1c") + (data $12.1 (i32.const 1576) "\02\00\00\00\n\00\00\00i\00n\00n\00e\00r") + (data $13 (i32.const 1596) "\1c") + (data $13.1 (i32.const 1608) "\02\00\00\00\n\00\00\00o\00u\00t\00e\00r") + (data $14 (i32.const 1628) "\1c") + (data $14.1 (i32.const 1640) "\02\00\00\00\n\00\00\00e\00r\00r\00o\00r") + (data $15 (i32.const 1660) ",") + (data $15.1 (i32.const 1672) "\02\00\00\00\1c\00\00\00w\00i\00l\00l\00 \00p\00r\00o\00p\00a\00g\00a\00t\00e") + (data $16 (i32.const 1708) "\1c") + (data $16.1 (i32.const 1720) "\02\00\00\00\0c\00\00\00c\00u\00s\00t\00o\00m") + (data $17 (i32.const 1740) ",") + (data $17.1 (i32.const 1752) "\02\00\00\00\16\00\00\00w\00o\00r\00k\00 \00f\00a\00i\00l\00e\00d") + (data $18 (i32.const 1788) "<") + (data $18.1 (i32.const 1800) "\02\00\00\00 \00\00\00d\00i\00v\00i\00s\00i\00o\00n\00 \00b\00y\00 \00z\00e\00r\00o") + (data $19 (i32.const 1852) ",") + (data $19.1 (i32.const 1864) "\02\00\00\00\16\00\00\00i\00n\00n\00e\00r\00 \00e\00r\00r\00o\00r") + (data $20 (i32.const 1900) ",") + (data $20.1 (i32.const 1912) "\02\00\00\00\1a\00\00\00w\00r\00a\00p\00p\00e\00d\00 \00e\00r\00r\00o\00r") + (data $21 (i32.const 1948) ",") + (data $21.1 (i32.const 1960) "\02\00\00\00\14\00\00\00R\00a\00n\00g\00e\00E\00r\00r\00o\00r") + (data $22 (i32.const 1996) ",") + (data $22.1 (i32.const 2008) "\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h") + (data $23 (i32.const 2044) ",") + (data $23.1 (i32.const 2056) "\02\00\00\00\18\00\00\00s\00u\00m\00 \00e\00x\00c\00e\00e\00d\00e\00d") + (data $24 (i32.const 2092) ",") + (data $24.1 (i32.const 2104) "\02\00\00\00\10\00\00\00o\00r\00i\00g\00i\00n\00a\00l") + (data $25 (i32.const 2140) ",") + (data $25.1 (i32.const 2152) "\02\00\00\00\14\00\00\00r\00e\00t\00h\00r\00o\00w\00n\00:\00 ") + (data $26 (i32.const 2188) ",") + (data $26.1 (i32.const 2200) "\02\00\00\00\1a\00\00\00i\00n\00v\00a\00l\00i\00d\00 \00s\00t\00a\00t\00e") + (data $27 (i32.const 2236) "\1c") + (data $27.1 (i32.const 2248) "\02\00\00\00\06\00\00\00t\001\00,") + (data $28 (i32.const 2268) "\1c") + (data $28.1 (i32.const 2280) "\02\00\00\00\06\00\00\00t\002\00,") + (data $29 (i32.const 2300) "\1c") + (data $29.1 (i32.const 2312) "\02\00\00\00\06\00\00\00t\003\00,") + (data $30 (i32.const 2332) "\1c") + (data $30.1 (i32.const 2344) "\02\00\00\00\08\00\00\00d\00e\00e\00p") + (data $31 (i32.const 2364) "\1c") + (data $31.1 (i32.const 2376) "\02\00\00\00\06\00\00\00c\003\00,") + (data $32 (i32.const 2396) ",") + (data $32.1 (i32.const 2408) "\02\00\00\00\0e\00\00\00r\00e\00t\00h\00r\00o\00w") + (data $33 (i32.const 2444) "\1c") + (data $33.1 (i32.const 2456) "\02\00\00\00\06\00\00\00f\003\00,") + (data $34 (i32.const 2476) "\1c") + (data $34.1 (i32.const 2488) "\02\00\00\00\06\00\00\00c\002\00,") + (data $35 (i32.const 2508) "\1c") + (data $35.1 (i32.const 2520) "\02\00\00\00\06\00\00\00f\002\00,") + (data $36 (i32.const 2540) "\1c") + (data $36.1 (i32.const 2552) "\02\00\00\00\06\00\00\00c\001\00,") + (data $37 (i32.const 2572) "\1c") + (data $37.1 (i32.const 2584) "\02\00\00\00\06\00\00\00f\001\00,") + (data $38 (i32.const 2604) "L") + (data $38.1 (i32.const 2616) "\02\00\00\000\00\00\00t\001\00,\00t\002\00,\00t\003\00,\00c\003\00,\00f\003\00,\00c\002\00,\00f\002\00,\00f\001\00,") + (data $39 (i32.const 2684) ",") + (data $39.1 (i32.const 2696) "\02\00\00\00\16\00\00\00m\00a\00x\00 \00r\00e\00a\00c\00h\00e\00d") + (data $40 (i32.const 2732) "\1c") + (data $40.1 (i32.const 2744) "\02\00\00\00\08\00\00\00z\00e\00r\00o") + (data $41 (i32.const 2764) "\1c") + (data $41.1 (i32.const 2776) "\02\00\00\00\08\00\00\00t\00e\00s\00t") + (data $42 (i32.const 2796) "<") + (data $42.1 (i32.const 2808) "\02\00\00\00(\00\00\00s\00h\00o\00u\00l\00d\00 \00b\00e\00 \00s\00u\00p\00p\00r\00e\00s\00s\00e\00d") + (data $43 (i32.const 2864) "\0e\00\00\00 \00\00\00 \00\00\00 ") + (data $43.1 (i32.const 2892) " \00\00\00 \00\00\00\00\00\00\00 \00\00\00\02\t\00\00\00\00\00\00 \00\00\00 ") + (tag $error (type $1) (param i32)) + (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/visitRoots + (local $0 i32) + (local $1 i32) + global.get $exceptions/calc + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/outer + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/sm + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/deepNestingOrder + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + global.get $exceptions/counter + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + i32.const 1248 + call $~lib/rt/itcms/__visit + i32.const 2016 + call $~lib/rt/itcms/__visit + i32.const 1056 + call $~lib/rt/itcms/__visit + global.get $~lib/rt/itcms/pinSpace + local.tee $1 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|0 + local.get $0 + local.get $1 + i32.ne + if + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1152 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#makeGray (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + local.get $0 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $0 + i32.load offset=8 + local.tee $1 + i32.eqz + if + i32.const 0 + i32.const 1152 + i32.const 148 + i32.const 30 + call $~lib/builtins/abort + unreachable + end + local.get $1 + global.set $~lib/rt/itcms/iter + end + block $__inlined_func$~lib/rt/itcms/Object#unlink$242 + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.tee $1 + i32.eqz + if + local.get $0 + i32.load offset=8 + i32.eqz + local.get $0 + i32.const 35692 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1152 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + br $__inlined_func$~lib/rt/itcms/Object#unlink$242 + end + local.get $0 + i32.load offset=8 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1152 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $1 + local.get $2 + i32.store offset=8 + local.get $2 + local.get $1 + local.get $2 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + end + global.get $~lib/rt/itcms/toSpace + local.set $2 + local.get $0 + i32.load offset=12 + local.tee $1 + i32.const 2 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 2864 + i32.load + i32.gt_u + if + i32.const 0 + i32.const 1248 + call $~lib/error/Error#constructor + throw $error + end + local.get $1 + i32.const 2 + i32.shl + i32.const 2868 + i32.add + i32.load + i32.const 32 + i32.and + end + local.set $3 + local.get $2 + i32.load offset=8 + local.set $1 + local.get $0 + global.get $~lib/rt/itcms/white + i32.eqz + i32.const 2 + local.get $3 + select + local.get $2 + i32.or + i32.store offset=4 + local.get $0 + local.get $1 + i32.store offset=8 + local.get $1 + local.get $0 + local.get $1 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + local.get $2 + local.get $0 + i32.store offset=8 + ) + (func $~lib/rt/itcms/__visit (param $0 i32) + local.get $0 + i32.eqz + if + return + end + global.get $~lib/rt/itcms/white + local.get $0 + i32.const 20 + i32.sub + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const -4 + i32.and + local.tee $3 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 1344 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 256 + i32.lt_u + if (result i32) + local.get $3 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $3 + local.get $3 + i32.const 1073741820 + i32.ge_u + select + local.tee $3 + i32.clz + i32.sub + local.tee $4 + i32.const 7 + i32.sub + local.set $2 + local.get $3 + local.get $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $3 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=8 + local.set $5 + local.get $1 + i32.load offset=4 + local.tee $4 + if + local.get $4 + local.get $5 + i32.store offset=8 + end + local.get $5 + if + local.get $5 + local.get $4 + i32.store offset=4 + end + local.get $1 + local.get $0 + local.get $2 + i32.const 4 + i32.shl + local.get $3 + i32.add + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load offset=96 + i32.eq + if + local.get $1 + local.get $5 + i32.store offset=96 + local.get $5 + i32.eqz + if + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load offset=4 + i32.const -2 + local.get $3 + i32.rotl + i32.and + local.set $3 + local.get $1 + local.get $3 + i32.store offset=4 + local.get $3 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const -2 + local.get $2 + i32.rotl + i32.and + i32.store + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.tee $2 + i32.const 1 + i32.and + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $3 + i32.const 4 + i32.add + local.get $2 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.set $2 + end + local.get $3 + i32.const 2 + i32.and + if + local.get $1 + i32.const 4 + i32.sub + i32.load + local.tee $1 + i32.load + local.tee $6 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $6 + i32.const 4 + i32.add + local.get $3 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store + end + local.get $4 + local.get $2 + i32.const 2 + i32.or + i32.store + local.get $3 + i32.const -4 + i32.and + local.tee $2 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 1344 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $1 + i32.const 4 + i32.add + local.get $2 + i32.add + i32.ne + if + i32.const 0 + i32.const 1344 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $2 + i32.const 256 + i32.lt_u + if (result i32) + local.get $2 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $2 + local.get $2 + i32.const 1073741820 + i32.ge_u + select + local.tee $2 + i32.clz + i32.sub + local.tee $3 + i32.const 7 + i32.sub + local.set $5 + local.get $2 + local.get $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $2 + i32.const 16 + i32.lt_u + local.get $5 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $3 + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + local.get $3 + i32.store offset=8 + local.get $3 + if + local.get $3 + local.get $1 + i32.store offset=4 + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $5 + i32.shl + i32.or + i32.store + local.get $0 + local.get $5 + i32.const 2 + i32.shl + i32.add + local.tee $0 + local.get $0 + i32.load offset=4 + i32.const 1 + local.get $2 + i32.shl + i32.or + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i64) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $2 + local.get $1 + i64.extend_i32_u + i64.lt_u + if + i32.const 0 + i32.const 1344 + i32.const 382 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $0 + i32.load offset=1568 + local.tee $3 + if + local.get $3 + i32.const 4 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 1344 + i32.const 389 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $3 + local.get $1 + i32.const 16 + i32.sub + local.tee $5 + i32.eq + if + local.get $3 + i32.load + local.set $4 + local.get $5 + local.set $1 + end + else + local.get $0 + i32.const 1572 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 1344 + i32.const 402 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + i32.wrap_i64 + i32.const -16 + i32.and + local.get $1 + i32.sub + local.tee $3 + i32.const 20 + i32.lt_u + if + return + end + local.get $1 + local.get $4 + i32.const 2 + i32.and + local.get $3 + i32.const 8 + i32.sub + local.tee $3 + i32.const 1 + i32.or + i32.or + i32.store + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 0 + i32.store offset=8 + local.get $1 + i32.const 4 + i32.add + local.get $3 + i32.add + local.tee $3 + i32.const 2 + i32.store + local.get $0 + local.get $3 + i32.store offset=1568 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/initialize + (local $0 i32) + (local $1 i32) + memory.size + local.tee $1 + i32.const 0 + i32.le_s + if (result i32) + i32.const 1 + local.get $1 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + i32.const 35696 + i32.const 0 + i32.store + i32.const 37264 + i32.const 0 + i32.store + loop $for-loop|0 + local.get $0 + i32.const 23 + i32.lt_u + if + local.get $0 + i32.const 2 + i32.shl + i32.const 35696 + i32.add + i32.const 0 + i32.store offset=4 + i32.const 0 + local.set $1 + loop $for-loop|1 + local.get $1 + i32.const 16 + i32.lt_u + if + local.get $0 + i32.const 4 + i32.shl + local.get $1 + i32.add + i32.const 2 + i32.shl + i32.const 35696 + i32.add + i32.const 0 + i32.store offset=96 + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|1 + end + end + local.get $0 + i32.const 1 + i32.add + local.set $0 + br $for-loop|0 + end + end + i32.const 35696 + i32.const 37268 + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + i32.const 35696 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/itcms/step (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + br_table $case0|0 $case1|0 $case2|0 $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $1 + local.get $0 + i32.load offset=4 + local.tee $2 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $2 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store offset=4 + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + return + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + i32.eq + if + global.get $~lib/memory/__stack_pointer + local.set $0 + loop $while-continue|0 + local.get $0 + i32.const 35692 + i32.lt_u + if + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end + end + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $1 + local.get $0 + i32.load offset=4 + local.tee $2 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $2 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store offset=4 + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $0 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $0 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/iter + local.tee $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + i32.load offset=4 + local.tee $1 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/white + i32.eqz + local.get $1 + i32.const 3 + i32.and + i32.ne + if + i32.const 0 + i32.const 1152 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 35692 + i32.lt_u + if + local.get $0 + i32.const 0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + else + global.get $~lib/rt/itcms/total + local.get $0 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.sub + global.set $~lib/rt/itcms/total + local.get $0 + i32.const 4 + i32.add + local.tee $0 + i32.const 35692 + i32.ge_u + if + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $0 + i32.const 4 + i32.sub + local.set $2 + local.get $0 + i32.const 15 + i32.and + i32.const 1 + local.get $0 + select + if (result i32) + i32.const 1 + else + local.get $2 + i32.load + i32.const 1 + i32.and + end + if + i32.const 0 + i32.const 1344 + i32.const 562 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $2 + i32.load + i32.const 1 + i32.or + i32.store + local.get $2 + call $~lib/rt/tlsf/insertBlock + end + end + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=4 + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=8 + i32.const 0 + global.set $~lib/rt/itcms/state + end + i32.const 0 + ) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + local.get $1 + i32.const 4 + i32.shr_u + local.set $1 + else + local.get $1 + i32.const 536870910 + i32.lt_u + if + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + local.set $1 + end + local.get $1 + i32.const 31 + local.get $1 + i32.clz + i32.sub + local.tee $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $1 + local.get $2 + i32.const 7 + i32.sub + local.set $2 + end + local.get $1 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const -1 + local.get $1 + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.get $2 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + local.get $0 + i32.load + i32.const -1 + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.tee $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.ctz + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + i32.const 0 + end + end + ) + (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 0 + i32.const 1056 + call $~lib/error/Error#constructor + throw $error + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.ge_u + if + block $__inlined_func$~lib/rt/itcms/interrupt$69 + i32.const 2048 + local.set $2 + loop $do-loop|0 + local.get $2 + call $~lib/rt/itcms/step + i32.sub + local.set $2 + global.get $~lib/rt/itcms/state + i32.eqz + if + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + br $__inlined_func$~lib/rt/itcms/interrupt$69 + end + local.get $2 + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.const 10 + i32.shl + i32.add + global.set $~lib/rt/itcms/threshold + end + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.set $4 + local.get $0 + i32.const 16 + i32.add + local.tee $2 + i32.const 1073741820 + i32.gt_u + if + i32.const 0 + i32.const 1056 + call $~lib/error/Error#constructor + throw $error + end + local.get $4 + local.get $2 + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $2 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + end + local.tee $5 + call $~lib/rt/tlsf/searchBlock + local.tee $2 + i32.eqz + if + memory.size + local.tee $2 + local.get $5 + i32.const 256 + i32.ge_u + if (result i32) + local.get $5 + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $5 + i32.const 1 + i32.const 27 + local.get $5 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $5 + end + else + local.get $5 + end + i32.const 4 + local.get $4 + i32.load offset=1568 + local.get $2 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + i32.ne + i32.shl + i32.add + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.tee $3 + local.get $2 + local.get $3 + i32.gt_s + select + memory.grow + i32.const 0 + i32.lt_s + if + local.get $3 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + local.get $4 + local.get $2 + i32.const 16 + i32.shl + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + local.get $4 + local.get $5 + call $~lib/rt/tlsf/searchBlock + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1344 + i32.const 499 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + local.get $5 + local.get $2 + i32.load + i32.const -4 + i32.and + i32.gt_u + if + i32.const 0 + i32.const 1344 + i32.const 501 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $2 + call $~lib/rt/tlsf/removeBlock + local.get $2 + i32.load + local.set $6 + local.get $5 + i32.const 4 + i32.add + i32.const 15 + i32.and + if + i32.const 0 + i32.const 1344 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $6 + i32.const -4 + i32.and + local.get $5 + i32.sub + local.tee $3 + i32.const 16 + i32.ge_u + if + local.get $2 + local.get $5 + local.get $6 + i32.const 2 + i32.and + i32.or + i32.store + local.get $2 + i32.const 4 + i32.add + local.get $5 + i32.add + local.tee $5 + local.get $3 + i32.const 4 + i32.sub + i32.const 1 + i32.or + i32.store + local.get $4 + local.get $5 + call $~lib/rt/tlsf/insertBlock + else + local.get $2 + local.get $6 + i32.const -2 + i32.and + i32.store + local.get $2 + i32.const 4 + i32.add + local.get $2 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $3 + local.get $3 + i32.load + i32.const -3 + i32.and + i32.store + end + local.get $2 + local.get $1 + i32.store offset=12 + local.get $2 + local.get $0 + i32.store offset=16 + global.get $~lib/rt/itcms/fromSpace + local.tee $1 + i32.load offset=8 + local.set $3 + local.get $2 + local.get $1 + global.get $~lib/rt/itcms/white + i32.or + i32.store offset=4 + local.get $2 + local.get $3 + i32.store offset=8 + local.get $3 + local.get $2 + local.get $3 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + local.get $1 + local.get $2 + i32.store offset=8 + global.get $~lib/rt/itcms/total + local.get $2 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.add + global.set $~lib/rt/itcms/total + local.get $2 + i32.const 20 + i32.add + local.tee $1 + i32.const 0 + local.get $0 + memory.fill + local.get $1 + ) + (func $~lib/rt/itcms/__link (param $0 i32) (param $1 i32) + local.get $1 + i32.eqz + if + return + end + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1152 + i32.const 295 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/white + local.get $1 + i32.const 20 + i32.sub + local.tee $1 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq + if + local.get $0 + i32.const 20 + i32.sub + i32.load offset=4 + i32.const 3 + i32.and + local.tee $0 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $1 + call $~lib/rt/itcms/Object#makeGray + else + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + local.get $0 + i32.const 3 + i32.eq + i32.and + if + local.get $1 + call $~lib/rt/itcms/Object#makeGray + end + end + end + ) + (func $exceptions/testMultipleReturnsWithFinally (param $0 i32) (result i32) + (local $1 i32) + block $finally_dispatch|0 + try $try_finally|0 + try + local.get $0 + i32.const 0 + i32.lt_s + if + i32.const -1 + local.set $1 + br $finally_dispatch|0 + end + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 2752 + call $~lib/error/Error#constructor + throw $error + end + local.get $0 + i32.const 100 + i32.gt_s + if + i32.const 100 + local.set $1 + br $finally_dispatch|0 + end + local.get $0 + local.set $1 + br $finally_dispatch|0 + catch $error + + drop + br $finally_dispatch|0 + end + unreachable + catch_all + global.get $exceptions/multiReturnFinallyCount + i32.const 1 + i32.add + global.set $exceptions/multiReturnFinallyCount + rethrow $try_finally|0 + end + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 1 + i32.add + global.set $exceptions/multiReturnFinallyCount + local.get $1 + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $folding-inner0 + block $invalid + block $exceptions/Counter + block $exceptions/StateMachine + block $~lib/array/Array + block $exceptions/Inner + block $exceptions/Outer + block $exceptions/Calculator + block $exceptions/Resource + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + block $~lib/object/Object + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $folding-inner0 $folding-inner0 $exceptions/Resource $exceptions/Calculator $exceptions/Outer $exceptions/Inner $~lib/array/Array $folding-inner0 $exceptions/StateMachine $exceptions/Counter $invalid + end + return + end + return + end + return + end + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + return + end + return + end + return + end + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + return + end + return + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + return + end + return + end + unreachable + end + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + local.get $0 + i32.load offset=4 + call $~lib/rt/itcms/__visit + local.get $0 + i32.load offset=8 + call $~lib/rt/itcms/__visit + ) + (func $~start + call $start:exceptions + ) + (func $~lib/error/Error#constructor (param $0 i32) (param $1 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=8 + local.get $0 + local.get $1 + i32.store offset=8 + local.get $0 + local.get $1 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 1408 + i32.store + local.get $0 + i32.const 1408 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 1440 + i32.store offset=4 + local.get $0 + i32.const 1440 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $0 + local.get $1 + i32.eq + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1 + return + end + block $folding-inner0 + local.get $1 + i32.eqz + local.get $0 + i32.eqz + i32.or + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $3 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $3 + local.tee $0 + i32.const 4 + i32.ge_u + if (result i32) + local.get $2 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + else + i32.const 1 + end + i32.eqz + if + loop $do-loop|0 + local.get $2 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + block $__inlined_func$~lib/util/string/compareImpl$94 + loop $while-continue|1 + local.get $0 + local.tee $3 + i32.const 1 + i32.sub + local.set $0 + local.get $3 + if + local.get $2 + i32.load16_u + local.tee $5 + local.get $1 + i32.load16_u + local.tee $4 + i32.sub + local.set $3 + local.get $4 + local.get $5 + i32.ne + br_if $__inlined_func$~lib/util/string/compareImpl$94 + local.get $2 + i32.const 2 + i32.add + local.set $2 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 + end + end + i32.const 0 + local.set $3 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + i32.eqz + return + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 0 + ) + (func $exceptions/Resource#constructor (result i32) + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 6 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $exceptions/Resource.instances + i32.const 1 + i32.add + global.set $exceptions/Resource.instances + local.get $0 + global.get $exceptions/Resource.instances + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $exceptions/Calculator#divide (param $0 i32) (param $1 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + try + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 1808 + call $~lib/error/Error#constructor + throw $error + end + i32.const 10 + local.get $1 + i32.div_s + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return + catch $error + + drop + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const -1 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 0 + return + end + unreachable + ) + (func $exceptions/Calculator#safeDivide (param $0 i32) (param $1 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + block $finally_dispatch|0 + try $try_finally|0 + try + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 1808 + call $~lib/error/Error#constructor + throw $error + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 20 + local.get $1 + i32.div_s + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + local.set $0 + br $finally_dispatch|0 + catch $error + + drop + i32.const -1 + local.set $0 + br $finally_dispatch|0 + end + unreachable + catch_all + rethrow $try_finally|0 + end + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/error/RangeError#constructor (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.const 11 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $1 + local.get $0 + call $~lib/error/Error#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 1968 + i32.store + local.get $0 + i32.const 1968 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $~lib/array/Array#__set (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $1 + local.get $0 + i32.load offset=12 + i32.ge_u + if + local.get $1 + i32.const 0 + i32.lt_s + if + i32.const 1248 + call $~lib/error/RangeError#constructor + throw $error + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $1 + i32.const 1 + i32.add + local.tee $5 + local.get $0 + i32.load offset=8 + local.tee $3 + i32.const 2 + i32.shr_u + i32.gt_u + if + local.get $5 + i32.const 268435455 + i32.gt_u + if + i32.const 2016 + call $~lib/error/RangeError#constructor + throw $error + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + block $__inlined_func$~lib/rt/itcms/__renew$225 + i32.const 1073741820 + local.get $3 + i32.const 1 + i32.shl + local.tee $3 + local.get $3 + i32.const 1073741820 + i32.ge_u + select + local.tee $4 + i32.const 8 + local.get $5 + local.get $5 + i32.const 8 + i32.le_u + select + i32.const 2 + i32.shl + local.tee $3 + local.get $3 + local.get $4 + i32.lt_u + select + local.tee $6 + local.get $0 + i32.load + local.tee $3 + i32.const 20 + i32.sub + local.tee $5 + i32.load + i32.const -4 + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $5 + local.get $6 + i32.store offset=16 + local.get $3 + local.set $4 + br $__inlined_func$~lib/rt/itcms/__renew$225 + end + local.get $6 + local.get $5 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.tee $4 + local.get $3 + local.get $6 + local.get $5 + i32.load offset=16 + local.tee $5 + local.get $5 + local.get $6 + i32.gt_u + select + memory.copy + end + local.get $3 + local.get $4 + i32.ne + if + local.get $0 + local.get $4 + i32.store + local.get $0 + local.get $4 + i32.store offset=4 + local.get $0 + local.get $4 + call $~lib/rt/itcms/__link + end + local.get $0 + local.get $6 + i32.store offset=8 + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + local.get $1 + i32.const 1 + i32.add + i32.store offset=12 + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load offset=4 + local.get $1 + i32.const 2 + i32.shl + i32.add + local.get $2 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $exceptions/testArrayWithExceptions (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.const 10 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store + local.get $0 + i32.const 0 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 32 + i32.const 1 + call $~lib/rt/itcms/__new + local.tee $3 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=12 + local.get $0 + local.get $3 + i32.store + local.get $0 + local.get $3 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + local.get $3 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 32 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 3 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.const 1 + call $~lib/array/Array#__set + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 1 + i32.const 2 + call $~lib/array/Array#__set + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 2 + i32.const 3 + call $~lib/array/Array#__set + try + loop $for-loop|1 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load offset=12 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + local.get $3 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $1 + local.get $0 + i32.load offset=12 + i32.ge_u + if + i32.const 1248 + call $~lib/error/RangeError#constructor + throw $error + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load offset=4 + local.get $1 + i32.const 2 + i32.shl + i32.add + i32.load + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + local.get $3 + i32.add + local.tee $2 + i32.const 5 + i32.gt_s + if + i32.const 0 + i32.const 2064 + call $~lib/error/Error#constructor + throw $error + end + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|1 + end + end + catch $error + + drop + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + return + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 0 + ) + (func $~lib/string/String.__concat (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + local.get $0 + local.tee $2 + i32.store + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const -2 + i32.and + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + block $__inlined_func$~lib/string/String#concat$249 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const -2 + i32.and + local.tee $4 + local.get $3 + i32.add + local.tee $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1440 + local.set $0 + br $__inlined_func$~lib/string/String#concat$249 + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 2 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store offset=4 + local.get $0 + local.get $2 + local.get $3 + memory.copy + local.get $0 + local.get $3 + i32.add + local.get $1 + local.get $4 + memory.copy + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + return + end + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $exceptions/StateMachine#transition (param $0 i32) (param $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + try + local.get $1 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 2208 + call $~lib/error/Error#constructor + throw $error + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + local.get $1 + i32.store + catch $error + + drop + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1 + i32.store8 offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const -1 + i32.store + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $exceptions/Counter#increment (param $0 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + try + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + local.get $0 + i32.load + i32.const 1 + i32.add + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + i32.const 3 + i32.gt_s + if + i32.const 0 + i32.const 2704 + call $~lib/error/Error#constructor + throw $error + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + return + catch $error + + drop + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const -1 + return + end + unreachable + ) + (func $start:exceptions + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + memory.size + i32.const 16 + i32.shl + i32.const 35692 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1108 + i32.const 1104 + i32.store + i32.const 1112 + i32.const 1104 + i32.store + i32.const 1104 + global.set $~lib/rt/itcms/pinSpace + i32.const 1204 + i32.const 1200 + i32.store + i32.const 1208 + i32.const 1200 + i32.store + i32.const 1200 + global.set $~lib/rt/itcms/toSpace + i32.const 1300 + i32.const 1296 + i32.store + i32.const 1304 + i32.const 1296 + i32.store + i32.const 1296 + global.set $~lib/rt/itcms/fromSpace + block $__inlined_func$exceptions/testTryCatch$165 + try + i32.const 0 + i32.const 1472 + call $~lib/error/Error#constructor + throw $error + catch $error + + drop + br $__inlined_func$exceptions/testTryCatch$165 + end + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + block $__inlined_func$exceptions/testCatchVar$233 + try + i32.const 0 + i32.const 1552 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load offset=8 + local.set $0 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$exceptions/testCatchVar$233 + end + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 1552 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1504 + i32.const 26 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + block $__inlined_func$exceptions/testNested$168 + try + try + i32.const 0 + i32.const 1584 + call $~lib/error/Error#constructor + throw $error + catch $error + + drop + i32.const 0 + i32.const 1616 + call $~lib/error/Error#constructor + throw $error + end + unreachable + catch $error + + drop + br $__inlined_func$exceptions/testNested$168 + end + unreachable + end + block $finally_dispatch|02 + try $try_finally|03 + try + i32.const 0 + i32.const 1648 + call $~lib/error/Error#constructor + throw $error + catch $error + + drop + br $finally_dispatch|02 + end + unreachable + catch_all + rethrow $try_finally|03 + end + unreachable + end + try $try_finally|06 + try + i32.const 0 + i32.const 1648 + call $~lib/error/Error#constructor + throw $error + catch $error + + drop + i32.const 10 + global.set $exceptions/tryCatchFinallyResult + end + catch_all + i32.const 1 + global.set $exceptions/tryCatchFinallyRan + rethrow $try_finally|06 + end + i32.const 1 + global.set $exceptions/tryCatchFinallyRan + global.get $exceptions/tryCatchFinallyResult + i32.const 10 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 92 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/tryCatchFinallyRan + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 93 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + block $__inlined_func$exceptions/testFinallyWithException$234 + try + try $try_finally|07 + i32.const 0 + i32.const 1680 + call $~lib/error/Error#constructor + throw $error + catch_all + i32.const 1 + global.set $exceptions/finallyWithExceptionRan + rethrow $try_finally|07 + end + unreachable + catch $error + + drop + global.get $exceptions/finallyWithExceptionRan + i32.const 0 + i32.ne + local.set $0 + br $__inlined_func$exceptions/testFinallyWithException$234 + end + unreachable + end + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1504 + i32.const 112 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + block $__inlined_func$exceptions/testCustomError$250 + try + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 42 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 1728 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.const 1728 + call $~lib/error/Error#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + throw $error + catch $error + + drop + br $__inlined_func$exceptions/testCustomError$250 + end + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + call $exceptions/Resource#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $exceptions/Resource.disposed + i32.const 1 + i32.add + global.set $exceptions/Resource.disposed + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $exceptions/Resource.disposed + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 186 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + i32.const 0 + global.set $exceptions/Resource.disposed + global.get $~lib/memory/__stack_pointer + call $exceptions/Resource#constructor + local.tee $0 + i32.store + block $__inlined_func$exceptions/testResourceCleanupWithException$236 + try + try $try_finally|1 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + i32.const 0 + i32.const 1760 + call $~lib/error/Error#constructor + throw $error + catch_all + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $exceptions/Resource.disposed + i32.const 1 + i32.add + global.set $exceptions/Resource.disposed + rethrow $try_finally|1 + end + unreachable + catch $error + + drop + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $exceptions/Resource.disposed + local.set $0 + br $__inlined_func$exceptions/testResourceCleanupWithException$236 + end + unreachable + end + local.get $0 + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 203 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 7 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + call $~lib/object/Object#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $exceptions/calc + global.get $~lib/memory/__stack_pointer + global.get $exceptions/calc + local.tee $0 + i32.store + local.get $0 + i32.const 2 + call $exceptions/Calculator#divide + i32.const 5 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 237 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/calc + local.tee $0 + i32.store + local.get $0 + i32.const 0 + call $exceptions/Calculator#divide + if + i32.const 0 + i32.const 1504 + i32.const 238 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/calc + local.tee $0 + i32.store + local.get $0 + i32.load + i32.const -1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 239 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/calc + local.tee $0 + i32.store + local.get $0 + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + global.get $exceptions/calc + local.tee $0 + i32.store + local.get $0 + i32.const 4 + call $exceptions/Calculator#safeDivide + i32.const 5 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 242 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/calc + local.tee $0 + i32.store + local.get $0 + i32.const 0 + call $exceptions/Calculator#safeDivide + i32.const -1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 243 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 8 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store + local.get $0 + i32.const 0 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 9 + call $~lib/rt/itcms/__new + local.tee $1 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $1 + call $~lib/object/Object#constructor + local.tee $1 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=8 + local.get $0 + local.get $1 + i32.store + local.get $0 + local.get $1 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $exceptions/outer + global.get $~lib/memory/__stack_pointer + global.get $exceptions/outer + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + block $__inlined_func$exceptions/Outer#process$238 + try + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load + i32.store + try + i32.const 0 + i32.const 1872 + call $~lib/error/Error#constructor + throw $error + catch $error + + drop + i32.const 0 + i32.const 1920 + call $~lib/error/Error#constructor + throw $error + end + unreachable + catch $error + + drop + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + br $__inlined_func$exceptions/Outer#process$238 + end + unreachable + end + call $exceptions/testArrayWithExceptions + i32.const 6 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 296 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + global.set $exceptions/rethrowFinallyRan + block $__inlined_func$exceptions/testRethrowWithFinally$252 + try + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + try $try_finally|05 + try + i32.const 0 + i32.const 2112 + call $~lib/error/Error#constructor + throw $error + catch $error + + local.set $0 + i32.const 0 + global.set $exceptions/rethrowFinallyRan + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load offset=8 + local.tee $0 + i32.store offset=4 + i32.const 2160 + local.get $0 + call $~lib/string/String.__concat + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + i32.const 0 + local.get $0 + call $~lib/error/Error#constructor + throw $error + end + unreachable + catch_all + i32.const 1 + global.set $exceptions/rethrowFinallyRan + rethrow $try_finally|05 + end + unreachable + catch $error + + drop + global.get $exceptions/rethrowFinallyRan + i32.const 0 + i32.ne + local.set $0 + br $__inlined_func$exceptions/testRethrowWithFinally$252 + end + unreachable + end + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1504 + i32.const 321 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 5 + i32.const 12 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + call $~lib/object/Object#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store8 offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $exceptions/sm + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.const 1 + call $exceptions/StateMachine#transition + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.load + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 352 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.load8_u offset=4 + if + i32.const 0 + i32.const 1504 + i32.const 353 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.const -5 + call $exceptions/StateMachine#transition + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.load + i32.const -1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 356 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.load8_u offset=4 + i32.eqz + if + i32.const 0 + i32.const 1504 + i32.const 357 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 0 + i32.store8 offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.load + if + i32.const 0 + i32.const 1504 + i32.const 360 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/sm + local.tee $0 + i32.store + local.get $0 + i32.load8_u offset=4 + if + i32.const 0 + i32.const 1504 + i32.const 361 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1440 + global.set $exceptions/deepNestingOrder + try $try_finally|0 + try + global.get $~lib/memory/__stack_pointer + i32.const 1440 + i32.store + i32.const 1440 + i32.const 2256 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + try $try_finally|8 + try + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2288 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + try $try_finally|12 + try + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2320 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + i32.const 0 + i32.const 2352 + call $~lib/error/Error#constructor + throw $error + catch $error + + drop + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2384 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + i32.const 0 + i32.const 2416 + call $~lib/error/Error#constructor + throw $error + end + unreachable + catch_all + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2464 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + rethrow $try_finally|12 + end + unreachable + catch $error + + drop + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2496 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + end + catch_all + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2528 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + rethrow $try_finally|8 + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2528 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + catch $error + + drop + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2560 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + end + catch_all + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2592 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + rethrow $try_finally|0 + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2592 + call $~lib/string/String.__concat + global.set $exceptions/deepNestingOrder + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + global.get $exceptions/deepNestingOrder + local.tee $0 + i32.store + local.get $0 + i32.const 2624 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1504 + i32.const 394 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 13 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + call $~lib/object/Object#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $exceptions/counter + global.get $~lib/memory/__stack_pointer + global.get $exceptions/counter + local.tee $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 414 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/counter + local.tee $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 415 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/counter + local.tee $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 416 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $exceptions/counter + local.tee $0 + i32.store + local.get $0 + call $exceptions/Counter#increment + i32.const -1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 417 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + global.set $exceptions/multiReturnFinallyCount + i32.const -5 + call $exceptions/testMultipleReturnsWithFinally + i32.const -1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 453 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 454 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $exceptions/testMultipleReturnsWithFinally + if + i32.const 0 + i32.const 1504 + i32.const 456 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 457 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 50 + call $exceptions/testMultipleReturnsWithFinally + i32.const 50 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 459 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 460 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 200 + call $exceptions/testMultipleReturnsWithFinally + i32.const 100 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 462 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $exceptions/multiReturnFinallyCount + i32.const 4 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 463 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + block $__inlined_func$exceptions/testReturnInFinallyOverridesCatch$182 + try + try + i32.const 0 + i32.const 2784 + call $~lib/error/Error#constructor + throw $error + catch $error + + drop + br $__inlined_func$exceptions/testReturnInFinallyOverridesCatch$182 + end + unreachable + catch_all + br $__inlined_func$exceptions/testReturnInFinallyOverridesCatch$182 + end + unreachable + end + block $__inlined_func$exceptions/testReturnInFinallySuppressesException$183 + try + i32.const 0 + i32.const 2816 + call $~lib/error/Error#constructor + throw $error + catch_all + i32.const 1 + global.set $exceptions/finallyReturnSuppressedExceptionRan + br $__inlined_func$exceptions/testReturnInFinallySuppressesException$183 + end + unreachable + end + global.get $exceptions/finallyReturnSuppressedExceptionRan + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1504 + i32.const 498 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/object/Object#constructor (param $0 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2924 + i32.lt_s + if + i32.const 35712 + i32.const 35760 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) +) diff --git a/tests/compiler/exceptions.ts b/tests/compiler/exceptions.ts new file mode 100644 index 0000000000..f0eb75a0da --- /dev/null +++ b/tests/compiler/exceptions.ts @@ -0,0 +1,498 @@ +// Basic throw +function testThrow(): void { + throw new Error("test"); +} + +// Try-catch basic +function testTryCatch(): i32 { + try { + throw new Error("oops"); + } catch (e) { + return 1; + } + return 0; +} +assert(testTryCatch() == 1); + +// Catch variable access +function testCatchVar(): string { + try { + throw new Error("msg"); + } catch (e) { + return e.message; + } + return ""; +} +assert(testCatchVar() == "msg"); + +// No exception thrown +function testNoThrow(): i32 { + try { + return 1; + } catch (e) { + return 2; + } +} +assert(testNoThrow() == 1); + +// Finally basic +let finallyRan = false; +function testFinally(): void { + try { + // normal completion + } finally { + finallyRan = true; + } +} +testFinally(); +assert(finallyRan == true); + +// Nested try-catch +function testNested(): i32 { + try { + try { + throw new Error("inner"); + } catch (e) { + throw new Error("outer"); + } + } catch (e) { + return 42; + } + return 0; +} +assert(testNested() == 42); + +// Try-catch-finally with return in catch - finally must run before return +let returnInCatchFinallyRan = false; +function testReturnInCatchFinally(): i32 { + try { + throw new Error("error"); + } catch (e) { + return 10; // Return in catch - finally must run first! + } finally { + returnInCatchFinallyRan = true; + } +} +assert(testReturnInCatchFinally() == 10); +assert(returnInCatchFinallyRan == true); + +// Try-catch-finally (without return in catch) +let tryCatchFinallyRan = false; +let tryCatchFinallyResult = 0; +function testTryCatchFinally(): void { + try { + throw new Error("error"); + } catch (e) { + tryCatchFinallyResult = 10; + } finally { + tryCatchFinallyRan = true; + } +} +testTryCatchFinally(); +assert(tryCatchFinallyResult == 10); +assert(tryCatchFinallyRan == true); + +// Finally with exception propagation +let finallyWithExceptionRan = false; +function innerThrow(): void { + try { + throw new Error("will propagate"); + } finally { + finallyWithExceptionRan = true; + } +} +function testFinallyWithException(): i32 { + try { + innerThrow(); + } catch (e) { + return finallyWithExceptionRan ? 1 : 0; + } + return 0; +} +assert(testFinallyWithException() == 1); + +// Try-finally with normal completion (no exception) +let finallyNormalRan = false; +function testFinallyNormalCompletion(): i32 { + try { + // no exception + } finally { + finallyNormalRan = true; + } + return finallyNormalRan ? 1 : 0; +} +assert(testFinallyNormalCompletion() == 1); + +// ============================================================================ +// Complex tests with classes +// ============================================================================ + +// Custom error class extending Error +class CustomError extends Error { + constructor(message: string, public code: i32) { + super(message); + } +} + +// Test throwing custom error +function testCustomError(): i32 { + try { + throw new CustomError("custom", 42); + } catch (e) { + // e is Error type, but carries CustomError data + return 1; + } + return 0; +} +assert(testCustomError() == 1); + +// Resource management class +class Resource { + static instances: i32 = 0; + static disposed: i32 = 0; + + id: i32; + + constructor() { + this.id = ++Resource.instances; + } + + dispose(): void { + Resource.disposed++; + } + + doWork(): void { + // Might throw + } + + doWorkThatThrows(): void { + throw new Error("work failed"); + } +} + +// Test resource cleanup in finally +function testResourceCleanup(): i32 { + let r = new Resource(); + let result: i32 = 0; + try { + r.doWork(); + result = 1; + } finally { + r.dispose(); + } + return result; +} +assert(testResourceCleanup() == 1); +assert(Resource.disposed == 1); + +// Test resource cleanup when exception thrown +function testResourceCleanupWithException(): i32 { + Resource.disposed = 0; // Reset + let r = new Resource(); + try { + try { + r.doWorkThatThrows(); + } finally { + r.dispose(); + } + } catch (e) { + return Resource.disposed; // Should be 1 - disposed even though exception + } + return 0; +} +assert(testResourceCleanupWithException() == 1); + +// Class with method that uses try-catch +class Calculator { + value: i32 = 0; + + divide(a: i32, b: i32): i32 { + try { + if (b == 0) { + throw new Error("division by zero"); + } + return a / b; + } catch (e) { + this.value = -1; // Mark error state + return 0; + } + } + + safeDivide(a: i32, b: i32): i32 { + try { + if (b == 0) { + throw new Error("division by zero"); + } + this.value = a / b; + return this.value; + } catch (e) { + return -1; + } finally { + // Always runs - could log or cleanup + } + } +} + +let calc = new Calculator(); +assert(calc.divide(10, 2) == 5); +assert(calc.divide(10, 0) == 0); +assert(calc.value == -1); + +calc.value = 0; +assert(calc.safeDivide(20, 4) == 5); +assert(calc.safeDivide(20, 0) == -1); + +// Nested class exception handling +class Outer { + inner: Inner; + + constructor() { + this.inner = new Inner(); + } + + process(): i32 { + try { + return this.inner.riskyOperation(); + } catch (e) { + return -1; + } + } +} + +class Inner { + riskyOperation(): i32 { + try { + throw new Error("inner error"); + } catch (e) { + throw new Error("wrapped error"); + } + return 0; + } +} + +let outer = new Outer(); +assert(outer.process() == -1); + +// Array operations with exceptions +function testArrayWithExceptions(): i32 { + let arr = new Array(3); + arr[0] = 1; + arr[1] = 2; + arr[2] = 3; + + let sum: i32 = 0; + try { + for (let i = 0; i < arr.length; i++) { + sum += arr[i]; + if (sum > 5) { + throw new Error("sum exceeded"); + } + } + } catch (e) { + return sum; // Should be 6 (1+2+3) + } + return 0; +} +assert(testArrayWithExceptions() == 6); + +// Multiple catch scenarios with rethrow +let rethrowFinallyRan = false; +function innerRethrow(): void { + try { + throw new Error("original"); + } catch (e) { + rethrowFinallyRan = false; + throw new Error("rethrown: " + e.message); + } finally { + rethrowFinallyRan = true; + } +} + +function testRethrowWithFinally(): i32 { + rethrowFinallyRan = false; + try { + innerRethrow(); + } catch (e) { + // Check that finally ran even during rethrow + return rethrowFinallyRan ? 1 : 0; + } + return 0; +} +assert(testRethrowWithFinally() == 1); + +// State machine with exceptions +class StateMachine { + state: i32 = 0; + errorState: bool = false; + + transition(newState: i32): void { + try { + if (newState < 0) { + throw new Error("invalid state"); + } + this.state = newState; + } catch (e) { + this.errorState = true; + this.state = -1; + } + } + + reset(): void { + try { + this.state = 0; + this.errorState = false; + } finally { + // Cleanup any resources + } + } +} + +let sm = new StateMachine(); +sm.transition(1); +assert(sm.state == 1); +assert(sm.errorState == false); + +sm.transition(-5); +assert(sm.state == -1); +assert(sm.errorState == true); + +sm.reset(); +assert(sm.state == 0); +assert(sm.errorState == false); + +// Deeply nested try-catch-finally +let deepNestingOrder: string = ""; + +function testDeepNesting(): i32 { + deepNestingOrder = ""; + try { + deepNestingOrder += "t1,"; + try { + deepNestingOrder += "t2,"; + try { + deepNestingOrder += "t3,"; + throw new Error("deep"); + } catch (e) { + deepNestingOrder += "c3,"; + throw new Error("rethrow"); + } finally { + deepNestingOrder += "f3,"; + } + } catch (e) { + deepNestingOrder += "c2,"; + } finally { + deepNestingOrder += "f2,"; + } + } catch (e) { + deepNestingOrder += "c1,"; + } finally { + deepNestingOrder += "f1,"; + } + return 1; +} +assert(testDeepNesting() == 1); +assert(deepNestingOrder == "t1,t2,t3,c3,f3,c2,f2,f1,"); + +// Counter class (alternative to closure) +class Counter { + count: i32 = 0; + + increment(): i32 { + try { + this.count++; + if (this.count > 3) { + throw new Error("max reached"); + } + return this.count; + } catch (e) { + return -1; + } + } +} + +let counter = new Counter(); +assert(counter.increment() == 1); +assert(counter.increment() == 2); +assert(counter.increment() == 3); +assert(counter.increment() == -1); // 4th call throws and catches + +// Return value from try block (not catch) +function testReturnFromTry(): i32 { + try { + return 42; + } catch (e) { + return -1; + } finally { + // This runs before the return from try + } +} +assert(testReturnFromTry() == 42); + +// Multiple returns with finally +let multiReturnFinallyCount = 0; +function testMultipleReturnsWithFinally(x: i32): i32 { + try { + if (x < 0) { + return -1; + } + if (x == 0) { + throw new Error("zero"); + } + if (x > 100) { + return 100; + } + return x; + } catch (e) { + return 0; + } finally { + multiReturnFinallyCount++; + } +} + +multiReturnFinallyCount = 0; +assert(testMultipleReturnsWithFinally(-5) == -1); +assert(multiReturnFinallyCount == 1); + +assert(testMultipleReturnsWithFinally(0) == 0); +assert(multiReturnFinallyCount == 2); + +assert(testMultipleReturnsWithFinally(50) == 50); +assert(multiReturnFinallyCount == 3); + +assert(testMultipleReturnsWithFinally(200) == 100); +assert(multiReturnFinallyCount == 4); + +// Return in finally overrides return in try +function testReturnInFinally(): i32 { + try { + return 1; // This return is overridden + } finally { + return 2; // This return wins + } +} +assert(testReturnInFinally() == 2); + +// Return in finally overrides return in catch +function testReturnInFinallyOverridesCatch(): i32 { + try { + throw new Error("test"); + } catch (e) { + return 1; // This return is overridden + } finally { + return 2; // This return wins + } +} +assert(testReturnInFinallyOverridesCatch() == 2); + +// Return in finally suppresses exception +let finallyReturnSuppressedExceptionRan = false; +function testReturnInFinallySuppressesException(): i32 { + try { + throw new Error("should be suppressed"); + } finally { + finallyReturnSuppressedExceptionRan = true; + return 42; // This suppresses the exception + } +} +assert(testReturnInFinallySuppressesException() == 42); +assert(finallyReturnSuppressedExceptionRan == true); From bafc198a1abe38e19f1a8bb7968df4f779018e44 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 21:32:18 -0500 Subject: [PATCH 2/5] Enable exception-handling feature in tests Added the 'enabled' flag for the exception-handling feature in features.json and updated the test logic in compiler.js to check this flag when determining missing features. --- tests/compiler.js | 4 ++-- tests/features.json | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/compiler.js b/tests/compiler.js index 0b6018fa80..d568fb22b8 100644 --- a/tests/compiler.js +++ b/tests/compiler.js @@ -254,10 +254,10 @@ async function runTest(basename) { if (config.features) { config.features.forEach(feature => { - if (!features.includes(feature) && !features.includes("*")) { + let featureConfig = featuresConfig[feature]; + if (!features.includes(feature) && !features.includes("*") && !featureConfig.enabled) { missing_features.push(feature); } - let featureConfig = featuresConfig[feature]; if (featureConfig.asc_flags) { featureConfig.asc_flags.forEach(flag => { Array.prototype.push.apply(asc_flags, flag.split(" ")); diff --git a/tests/features.json b/tests/features.json index 5c47772500..7f3a1ac2e6 100644 --- a/tests/features.json +++ b/tests/features.json @@ -27,7 +27,8 @@ "--enable exception-handling" ], "v8_flags": [ - ] + ], + "enabled": true }, "simd": { "asc_flags": [ From 8e1c660013a6b8a7733c9f26dffe7f02995da6b0 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 21:46:25 -0500 Subject: [PATCH 3/5] Refactor exception handling tests and assertions Simplified assertions in exception tests by removing redundant comparisons and using direct boolean checks. Updated type assertions in catch blocks for better type safety. Added eslint-disable comments for returns in finally blocks. Adjusted expected line numbers in .wat test outputs to match code changes. --- src/compiler.ts | 3 +-- tests/compiler/exceptions.debug.wat | 16 ++++------------ tests/compiler/exceptions.release.wat | 8 +++----- tests/compiler/exceptions.ts | 15 +++++++++------ 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 0cce599e01..8d83e441c1 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -3022,9 +3022,8 @@ export class Compiler extends DiagnosticEmitter { // If exception handling feature is enabled, use actual throw instruction if (this.options.hasFeature(Feature.ExceptionHandling)) { - let value = statement.value; // Compile the thrown value - should be Error or subclass - let valueExpr = this.compileExpression(value, Type.auto); + let valueExpr = this.compileExpression(statement.value, Type.auto); // Ensure exception tag exists let tagName = this.ensureExceptionTag(); diff --git a/tests/compiler/exceptions.debug.wat b/tests/compiler/exceptions.debug.wat index 83b23045a8..66036f4334 100644 --- a/tests/compiler/exceptions.debug.wat +++ b/tests/compiler/exceptions.debug.wat @@ -5331,8 +5331,6 @@ end call $exceptions/testFinally global.get $exceptions/finallyRan - i32.const 1 - i32.eq i32.eqz if i32.const 0 @@ -5367,8 +5365,6 @@ unreachable end global.get $exceptions/returnInCatchFinallyRan - i32.const 1 - i32.eq i32.eqz if i32.const 0 @@ -5392,8 +5388,6 @@ unreachable end global.get $exceptions/tryCatchFinallyRan - i32.const 1 - i32.eq i32.eqz if i32.const 0 @@ -5994,7 +5988,7 @@ if i32.const 0 i32.const 480 - i32.const 473 + i32.const 474 i32.const 1 call $~lib/builtins/abort unreachable @@ -6006,7 +6000,7 @@ if i32.const 0 i32.const 480 - i32.const 485 + i32.const 487 i32.const 1 call $~lib/builtins/abort unreachable @@ -6018,19 +6012,17 @@ if i32.const 0 i32.const 480 - i32.const 497 + i32.const 500 i32.const 1 call $~lib/builtins/abort unreachable end global.get $exceptions/finallyReturnSuppressedExceptionRan - i32.const 1 - i32.eq i32.eqz if i32.const 0 i32.const 480 - i32.const 498 + i32.const 501 i32.const 1 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/exceptions.release.wat b/tests/compiler/exceptions.release.wat index a01f0e9ecb..4cfbed7926 100644 --- a/tests/compiler/exceptions.release.wat +++ b/tests/compiler/exceptions.release.wat @@ -3153,8 +3153,7 @@ unreachable end global.get $exceptions/tryCatchFinallyRan - i32.const 1 - i32.ne + i32.eqz if i32.const 0 i32.const 1504 @@ -4334,12 +4333,11 @@ unreachable end global.get $exceptions/finallyReturnSuppressedExceptionRan - i32.const 1 - i32.ne + i32.eqz if i32.const 0 i32.const 1504 - i32.const 498 + i32.const 501 i32.const 1 call $~lib/builtins/abort unreachable diff --git a/tests/compiler/exceptions.ts b/tests/compiler/exceptions.ts index f0eb75a0da..f85af7e423 100644 --- a/tests/compiler/exceptions.ts +++ b/tests/compiler/exceptions.ts @@ -19,7 +19,7 @@ function testCatchVar(): string { try { throw new Error("msg"); } catch (e) { - return e.message; + return (e as Error).message; } return ""; } @@ -45,7 +45,7 @@ function testFinally(): void { } } testFinally(); -assert(finallyRan == true); +assert(finallyRan); // Nested try-catch function testNested(): i32 { @@ -74,7 +74,7 @@ function testReturnInCatchFinally(): i32 { } } assert(testReturnInCatchFinally() == 10); -assert(returnInCatchFinallyRan == true); +assert(returnInCatchFinallyRan); // Try-catch-finally (without return in catch) let tryCatchFinallyRan = false; @@ -90,7 +90,7 @@ function testTryCatchFinally(): void { } testTryCatchFinally(); assert(tryCatchFinallyResult == 10); -assert(tryCatchFinallyRan == true); +assert(tryCatchFinallyRan); // Finally with exception propagation let finallyWithExceptionRan = false; @@ -302,7 +302,7 @@ function innerRethrow(): void { throw new Error("original"); } catch (e) { rethrowFinallyRan = false; - throw new Error("rethrown: " + e.message); + throw new Error("rethrown: " + (e as Error).message); } finally { rethrowFinallyRan = true; } @@ -467,6 +467,7 @@ function testReturnInFinally(): i32 { try { return 1; // This return is overridden } finally { + // eslint-disable-next-line no-unsafe-finally return 2; // This return wins } } @@ -479,6 +480,7 @@ function testReturnInFinallyOverridesCatch(): i32 { } catch (e) { return 1; // This return is overridden } finally { + // eslint-disable-next-line no-unsafe-finally return 2; // This return wins } } @@ -491,8 +493,9 @@ function testReturnInFinallySuppressesException(): i32 { throw new Error("should be suppressed"); } finally { finallyReturnSuppressedExceptionRan = true; + // eslint-disable-next-line no-unsafe-finally return 42; // This suppresses the exception } } assert(testReturnInFinallySuppressesException() == 42); -assert(finallyReturnSuppressedExceptionRan == true); +assert(finallyReturnSuppressedExceptionRan); From 854c198035671d8848502971dc367c168e9828d5 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 22:38:30 -0500 Subject: [PATCH 4/5] Refactor block statement construction in compiler Replaces array spread with manual array construction for block statements, improving clarity and potentially performance when combining tryBlock and dispatchStmts. --- src/compiler.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 8d83e441c1..bd5a32a356 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -3297,10 +3297,12 @@ export class Compiler extends DiagnosticEmitter { dispatchStmts.push(module.unreachable()); } - let fullBlock = module.block(null, [ - tryBlock, - ...dispatchStmts - ]); + let fullBlockStmts = new Array(1 + dispatchStmts.length); + fullBlockStmts[0] = tryBlock; + for (let i = 0; i < dispatchStmts.length; i++) { + fullBlockStmts[1 + i] = dispatchStmts[i]; + } + let fullBlock = module.block(null, fullBlockStmts); // Merge flow states // If finally always terminates, the whole construct terminates From b42652bc70a4f4c2318eacf30c3e4ba804f7f9b3 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 22:39:39 -0500 Subject: [PATCH 5/5] Add Anakun to NOTICE contributors list Updated the NOTICE file to include Anakun as a contributor. --- NOTICE | 1 + 1 file changed, 1 insertion(+) diff --git a/NOTICE b/NOTICE index 14d821345c..f759c40617 100644 --- a/NOTICE +++ b/NOTICE @@ -62,6 +62,7 @@ under the licensing terms detailed in LICENSE: * Kam Chehresa * Mopsgamer <79159094+Mopsgamer@users.noreply.github.com> * EDM115 +* Anakun Portions of this software are derived from third-party works licensed under the following terms: