From 1b07be02c549410761cadea12776eab3e445947c Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:03:04 -0500 Subject: [PATCH 1/4] Add closure capture support for more statement types Extended closure variable capture logic in the compiler to handle while, do-while, for, for-of, switch, try/catch/finally, and various expression nodes. Updated test cases to cover closure captures in these new contexts, ensuring correct environment handling and variable scoping for closures in complex control flow and expression scenarios. Found unhandled case of closure with nested arrays. --- src/compiler.ts | 486 +++- tests/compiler/closure.debug.wat | 3295 ++++++++++++++++++++++++---- tests/compiler/closure.release.wat | 2569 +++++++++++++++++++--- tests/compiler/closure.ts | 163 ++ 4 files changed, 5791 insertions(+), 722 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index f339e83aa9..1c3edbbed1 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -174,7 +174,6 @@ import { UnaryPostfixExpression, UnaryPrefixExpression, CompiledExpression, - SwitchCase, TypeNode, NamedTypeNode, @@ -7974,6 +7973,7 @@ export class Compiler extends DiagnosticEmitter { /** Collects all variable declarations in a node (for prescan). */ private collectDeclaredVariables(node: Node, vars: Map): void { switch (node.kind) { + // Statements that contain other statements case NodeKind.Block: { let block = node; for (let i = 0, k = block.statements.length; i < k; i++) { @@ -7981,14 +7981,6 @@ export class Compiler extends DiagnosticEmitter { } break; } - case NodeKind.Variable: { - let varStmt = node; - for (let i = 0, k = varStmt.declarations.length; i < k; i++) { - let decl = varStmt.declarations[i]; - vars.set(decl.name.text, null); // null = type will be determined during compilation - } - break; - } case NodeKind.If: { let ifStmt = node; this.collectDeclaredVariables(ifStmt.ifTrue, vars); @@ -8013,10 +8005,138 @@ export class Compiler extends DiagnosticEmitter { this.collectDeclaredVariables(forStmt.body, vars); break; } + case NodeKind.ForOf: { + let forOfStmt = node; + if (forOfStmt.variable.kind == NodeKind.Variable) { + this.collectDeclaredVariables(forOfStmt.variable, vars); + } + this.collectDeclaredVariables(forOfStmt.body, vars); + break; + } + case NodeKind.Switch: { + let switchStmt = node; + let cases = switchStmt.cases; + for (let i = 0, k = cases.length; i < k; i++) { + let statements = cases[i].statements; + for (let j = 0, l = statements.length; j < l; j++) { + this.collectDeclaredVariables(statements[j], vars); + } + } + break; + } + case NodeKind.Try: { + let tryStmt = node; + let bodyStatements = tryStmt.bodyStatements; + for (let i = 0, k = bodyStatements.length; i < k; i++) { + this.collectDeclaredVariables(bodyStatements[i], vars); + } + let catchStatements = tryStmt.catchStatements; + if (catchStatements) { + let catchVariable = tryStmt.catchVariable; + if (catchVariable) { + vars.set(catchVariable.text, null); + } + for (let i = 0, k = catchStatements.length; i < k; i++) { + this.collectDeclaredVariables(catchStatements[i], vars); + } + } + let finallyStatements = tryStmt.finallyStatements; + if (finallyStatements) { + for (let i = 0, k = finallyStatements.length; i < k; i++) { + this.collectDeclaredVariables(finallyStatements[i], vars); + } + } + break; + } + + // Variable declarations + case NodeKind.Variable: { + let varStmt = node; + for (let i = 0, k = varStmt.declarations.length; i < k; i++) { + let decl = varStmt.declarations[i]; + vars.set(decl.name.text, null); + } + break; + } + + // Function scopes - don't leak variables case NodeKind.FunctionDeclaration: case NodeKind.Function: - // Function declarations and expressions don't add their variables to outer scope break; + + // Statements without variable declarations + case NodeKind.Expression: + case NodeKind.Return: + case NodeKind.Break: + case NodeKind.Continue: + case NodeKind.Throw: + case NodeKind.Empty: + case NodeKind.Void: + break; + + // Module-level declarations (shouldn't appear in function bodies normally) + case NodeKind.Export: + case NodeKind.ExportDefault: + case NodeKind.ExportImport: + case NodeKind.Import: + case NodeKind.Module: + case NodeKind.ClassDeclaration: + case NodeKind.EnumDeclaration: + case NodeKind.InterfaceDeclaration: + case NodeKind.NamespaceDeclaration: + case NodeKind.TypeDeclaration: + break; + + // Expression nodes (shouldn't be passed to this function normally) + case NodeKind.Identifier: + case NodeKind.Assertion: + case NodeKind.Binary: + case NodeKind.Call: + case NodeKind.Class: + case NodeKind.Comma: + case NodeKind.ElementAccess: + case NodeKind.False: + case NodeKind.InstanceOf: + case NodeKind.Literal: + case NodeKind.New: + case NodeKind.Null: + case NodeKind.Omitted: + case NodeKind.Parenthesized: + case NodeKind.PropertyAccess: + case NodeKind.Ternary: + case NodeKind.Super: + case NodeKind.This: + case NodeKind.True: + case NodeKind.Constructor: + case NodeKind.UnaryPostfix: + case NodeKind.UnaryPrefix: + case NodeKind.Compiled: + break; + + // Type nodes + case NodeKind.NamedType: + case NodeKind.FunctionType: + case NodeKind.TypeName: + case NodeKind.TypeParameter: + case NodeKind.Parameter: + break; + + // Special nodes + case NodeKind.Source: + case NodeKind.Decorator: + case NodeKind.ExportMember: + case NodeKind.SwitchCase: + case NodeKind.IndexSignature: + case NodeKind.Comment: + case NodeKind.EnumValueDeclaration: + case NodeKind.FieldDeclaration: + case NodeKind.ImportDeclaration: + case NodeKind.MethodDeclaration: + case NodeKind.VariableDeclaration: + break; + + default: + assert(false, "collectDeclaredVariables: unhandled node kind: " + (node.kind as i32).toString()); } } @@ -8175,7 +8295,169 @@ export class Compiler extends DiagnosticEmitter { } break; } - // Most other node kinds don't contain function expressions + case NodeKind.Literal: { + let literal = node; + if (literal.literalKind == LiteralKind.Array) { + let arrLiteral = literal; + let elements = arrLiteral.elementExpressions; + for (let i = 0, k = elements.length; i < k; i++) { + let elem = elements[i]; + if (elem) { + this.prescanNodeForFunctionExpressions(elem, instance, flow, declaredVars); + } + } + } else if (literal.literalKind == LiteralKind.Object) { + let objLiteral = literal; + let values = objLiteral.values; + for (let i = 0, k = values.length; i < k; i++) { + this.prescanNodeForFunctionExpressions(values[i], instance, flow, declaredVars); + } + } else if (literal.literalKind == LiteralKind.Template) { + let tmplLiteral = literal; + let expressions = tmplLiteral.expressions; + for (let i = 0, k = expressions.length; i < k; i++) { + this.prescanNodeForFunctionExpressions(expressions[i], instance, flow, declaredVars); + } + } + break; + } + case NodeKind.ElementAccess: { + let elemAccess = node; + this.prescanNodeForFunctionExpressions(elemAccess.expression, instance, flow, declaredVars); + this.prescanNodeForFunctionExpressions(elemAccess.elementExpression, instance, flow, declaredVars); + break; + } + case NodeKind.PropertyAccess: { + let propAccess = node; + this.prescanNodeForFunctionExpressions(propAccess.expression, instance, flow, declaredVars); + break; + } + case NodeKind.Assertion: { + let assertion = node; + this.prescanNodeForFunctionExpressions(assertion.expression, instance, flow, declaredVars); + break; + } + case NodeKind.InstanceOf: { + let instanceOf = node; + this.prescanNodeForFunctionExpressions(instanceOf.expression, instance, flow, declaredVars); + break; + } + case NodeKind.Switch: { + let switchStmt = node; + this.prescanNodeForFunctionExpressions(switchStmt.condition, instance, flow, declaredVars); + let cases = switchStmt.cases; + for (let i = 0, k = cases.length; i < k; i++) { + let switchCase = cases[i]; + if (switchCase.label) { + this.prescanNodeForFunctionExpressions(switchCase.label, instance, flow, declaredVars); + } + let statements = switchCase.statements; + for (let j = 0, l = statements.length; j < l; j++) { + this.prescanNodeForFunctionExpressions(statements[j], instance, flow, declaredVars); + } + } + break; + } + case NodeKind.ForOf: { + let forOfStmt = node; + this.prescanNodeForFunctionExpressions(forOfStmt.iterable, instance, flow, declaredVars); + if (forOfStmt.variable.kind == NodeKind.Variable) { + this.prescanNodeForFunctionExpressions(forOfStmt.variable, instance, flow, declaredVars); + } + this.prescanNodeForFunctionExpressions(forOfStmt.body, instance, flow, declaredVars); + break; + } + case NodeKind.Try: { + let tryStmt = node; + let bodyStatements = tryStmt.bodyStatements; + for (let i = 0, k = bodyStatements.length; i < k; i++) { + this.prescanNodeForFunctionExpressions(bodyStatements[i], instance, flow, declaredVars); + } + let catchStatements = tryStmt.catchStatements; + if (catchStatements) { + for (let i = 0, k = catchStatements.length; i < k; i++) { + this.prescanNodeForFunctionExpressions(catchStatements[i], instance, flow, declaredVars); + } + } + let finallyStatements = tryStmt.finallyStatements; + if (finallyStatements) { + for (let i = 0, k = finallyStatements.length; i < k; i++) { + this.prescanNodeForFunctionExpressions(finallyStatements[i], instance, flow, declaredVars); + } + } + break; + } + case NodeKind.Throw: { + let throwStmt = node; + this.prescanNodeForFunctionExpressions(throwStmt.value, instance, flow, declaredVars); + break; + } + case NodeKind.Void: { + let voidStmt = node; + this.prescanNodeForFunctionExpressions(voidStmt.expression, instance, flow, declaredVars); + break; + } + + // Leaf expressions - no children to scan + case NodeKind.Identifier: + case NodeKind.True: + case NodeKind.False: + case NodeKind.Null: + case NodeKind.Super: + case NodeKind.This: + case NodeKind.Omitted: + case NodeKind.Compiled: + break; + + // Statements without expressions + case NodeKind.Break: + case NodeKind.Continue: + case NodeKind.Empty: + break; + + // Class expression - scan members would be complex, but class expressions with closures are rare + case NodeKind.Class: + case NodeKind.Constructor: + break; + + // Module-level declarations (shouldn't appear in function bodies normally) + case NodeKind.Export: + case NodeKind.ExportDefault: + case NodeKind.ExportImport: + case NodeKind.Import: + case NodeKind.Module: + case NodeKind.ClassDeclaration: + case NodeKind.EnumDeclaration: + case NodeKind.InterfaceDeclaration: + case NodeKind.NamespaceDeclaration: + case NodeKind.TypeDeclaration: + case NodeKind.FunctionDeclaration: + break; + + // Type nodes - no runtime expressions + case NodeKind.NamedType: + case NodeKind.FunctionType: + case NodeKind.TypeName: + case NodeKind.TypeParameter: + case NodeKind.Parameter: + break; + + // Special nodes + case NodeKind.Source: + case NodeKind.Decorator: + case NodeKind.ExportMember: + case NodeKind.SwitchCase: + case NodeKind.IndexSignature: + case NodeKind.Comment: + case NodeKind.EnumValueDeclaration: + case NodeKind.FieldDeclaration: + case NodeKind.ImportDeclaration: + case NodeKind.MethodDeclaration: + case NodeKind.VariableDeclaration: + break; + + default: + assert(false, "prescanNodeForFunctionExpressions: unhandled node kind: " + (node.kind as i32).toString()); } } @@ -8370,11 +8652,185 @@ export class Compiler extends DiagnosticEmitter { } break; } - // Add more cases as needed for complete coverage - default: { - // For other nodes, recursively scan children - // This is a simplified version - a complete implementation would handle all node types + case NodeKind.While: { + let whileStmt = node; + this.collectCapturedNames(whileStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); + this.collectCapturedNames(whileStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); + break; + } + case NodeKind.Do: { + let doStmt = node; + this.collectCapturedNames(doStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); + this.collectCapturedNames(doStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); + break; + } + case NodeKind.For: { + let forStmt = node; + if (forStmt.initializer) { + this.collectCapturedNames(forStmt.initializer, innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + if (forStmt.condition) { + this.collectCapturedNames(forStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + if (forStmt.incrementor) { + this.collectCapturedNames(forStmt.incrementor, innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + this.collectCapturedNames(forStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); + break; + } + case NodeKind.ForOf: { + let forOfStmt = node; + this.collectCapturedNames(forOfStmt.iterable, innerFunctionNames, outerFlow, declaredVars, capturedNames); + // Add the loop variable to inner names + let varDecl = forOfStmt.variable; + if (varDecl.kind == NodeKind.Variable) { + let varStmt = varDecl; + for (let i = 0, k = varStmt.declarations.length; i < k; i++) { + innerFunctionNames.add(varStmt.declarations[i].name.text); + } + } + this.collectCapturedNames(forOfStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); + break; + } + case NodeKind.Switch: { + let switchStmt = node; + this.collectCapturedNames(switchStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); + let cases = switchStmt.cases; + for (let i = 0, k = cases.length; i < k; i++) { + let switchCase = cases[i]; + if (switchCase.label) { + this.collectCapturedNames(switchCase.label, innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + let statements = switchCase.statements; + for (let j = 0, l = statements.length; j < l; j++) { + this.collectCapturedNames(statements[j], innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } + break; + } + case NodeKind.Try: { + let tryStmt = node; + let bodyStatements = tryStmt.bodyStatements; + for (let i = 0, k = bodyStatements.length; i < k; i++) { + this.collectCapturedNames(bodyStatements[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + let catchVariable = tryStmt.catchVariable; + if (catchVariable) { + innerFunctionNames.add(catchVariable.text); + } + let catchStatements = tryStmt.catchStatements; + if (catchStatements) { + for (let i = 0, k = catchStatements.length; i < k; i++) { + this.collectCapturedNames(catchStatements[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } + let finallyStatements = tryStmt.finallyStatements; + if (finallyStatements) { + for (let i = 0, k = finallyStatements.length; i < k; i++) { + this.collectCapturedNames(finallyStatements[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } + if (catchVariable) { + innerFunctionNames.delete(catchVariable.text); + } + break; + } + case NodeKind.Throw: { + let throwStmt = node; + this.collectCapturedNames(throwStmt.value, innerFunctionNames, outerFlow, declaredVars, capturedNames); + break; + } + case NodeKind.Void: { + let voidStmt = node; + this.collectCapturedNames(voidStmt.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); + break; + } + case NodeKind.Literal: { + let literal = node; + if (literal.literalKind == LiteralKind.Array) { + let arrLiteral = literal; + let elements = arrLiteral.elementExpressions; + for (let i = 0, k = elements.length; i < k; i++) { + let elem = elements[i]; + if (elem) { + this.collectCapturedNames(elem, innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } + } else if (literal.literalKind == LiteralKind.Object) { + let objLiteral = literal; + let values = objLiteral.values; + for (let i = 0, k = values.length; i < k; i++) { + this.collectCapturedNames(values[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } else if (literal.literalKind == LiteralKind.Template) { + let tmplLiteral = literal; + let expressions = tmplLiteral.expressions; + for (let i = 0, k = expressions.length; i < k; i++) { + this.collectCapturedNames(expressions[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } + // Other literal kinds (Integer, Float, String, RegExp) have no variable refs + break; } + + // Leaf expressions - no variable references + case NodeKind.True: + case NodeKind.False: + case NodeKind.Null: + case NodeKind.Super: + case NodeKind.Omitted: + case NodeKind.Compiled: + break; + + // Statements without expressions + case NodeKind.Break: + case NodeKind.Continue: + case NodeKind.Empty: + break; + + // Class expression - would need to scan members, but rare in closure context + case NodeKind.Class: + case NodeKind.Constructor: + break; + + // Module-level declarations (shouldn't appear in closure bodies normally) + case NodeKind.Export: + case NodeKind.ExportDefault: + case NodeKind.ExportImport: + case NodeKind.Import: + case NodeKind.Module: + case NodeKind.ClassDeclaration: + case NodeKind.EnumDeclaration: + case NodeKind.InterfaceDeclaration: + case NodeKind.NamespaceDeclaration: + case NodeKind.TypeDeclaration: + case NodeKind.FunctionDeclaration: + break; + + // Type nodes - no runtime variable references + case NodeKind.NamedType: + case NodeKind.FunctionType: + case NodeKind.TypeName: + case NodeKind.TypeParameter: + case NodeKind.Parameter: + break; + + // Special nodes + case NodeKind.Source: + case NodeKind.Decorator: + case NodeKind.ExportMember: + case NodeKind.SwitchCase: + case NodeKind.IndexSignature: + case NodeKind.Comment: + case NodeKind.EnumValueDeclaration: + case NodeKind.FieldDeclaration: + case NodeKind.ImportDeclaration: + case NodeKind.MethodDeclaration: + case NodeKind.VariableDeclaration: + break; + + default: + assert(false, "collectCapturedNames: unhandled node kind: " + (node.kind as i32).toString()); } } diff --git a/tests/compiler/closure.debug.wat b/tests/compiler/closure.debug.wat index 2085063651..058e3f55f4 100644 --- a/tests/compiler/closure.debug.wat +++ b/tests/compiler/closure.debug.wat @@ -1,13 +1,15 @@ (module - (type $0 (func (param i32 i32))) + (type $0 (func (result i32))) (type $1 (func (param i32) (result i32))) - (type $2 (func (result i32))) - (type $3 (func (param i32))) - (type $4 (func)) + (type $2 (func (param i32 i32))) + (type $3 (func)) + (type $4 (func (param i32))) (type $5 (func (param i32 i32) (result i32))) (type $6 (func (param i32 i32 i32))) (type $7 (func (param i32 i32 i32 i32))) (type $8 (func (param i32 i32 i64) (result i32))) + (type $9 (func (param i32 i32 i32) (result i32))) + (type $10 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $$~lib/__closure_env (mut i32) (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -29,10 +31,13 @@ (global $closure/fn2 (mut i32) (i32.const 0)) (global $closure/fn3 (mut i32) (i32.const 0)) (global $closure/fn5 (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 720)) - (global $~lib/memory/__data_end i32 (i32.const 752)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33520)) - (global $~lib/memory/__heap_base i32 (i32.const 33520)) + (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) + (global $closure/counter1 (mut i32) (i32.const 0)) + (global $closure/counter2 (mut i32) (i32.const 0)) + (global $~lib/rt/__rtti_base i32 (i32.const 1488)) + (global $~lib/memory/__data_end i32 (i32.const 1544)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34312)) + (global $~lib/memory/__heap_base i32 (i32.const 34312)) (memory $0 1) (data $0 (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") (data $1 (i32.const 44) "<\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") @@ -51,9 +56,29 @@ (data $14 (i32.const 620) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\06\00\00\00\00\00\00\00\00\00\00\00") (data $15 (i32.const 652) "\1c\00\00\00\00\00\00\00\00\00\00\00\06\00\00\00\08\00\00\00\07\00\00\00\00\00\00\00\00\00\00\00") (data $16 (i32.const 684) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\08\00\00\00\00\00\00\00\00\00\00\00") - (data $17 (i32.const 720) "\07\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (table $0 9 9 funcref) - (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureVar~anonymous|0 $closure/testCaptureLet~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testClosureWrite~anonymous|1 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testSharedEnvironment~anonymous|1) + (data $17 (i32.const 716) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\t\00\00\00\00\00\00\00\00\00\00\00") + (data $18 (i32.const 748) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\n\00\00\00\00\00\00\00\00\00\00\00") + (data $19 (i32.const 780) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\0b\00\00\00\00\00\00\00\00\00\00\00") + (data $20 (i32.const 812) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\0c\00\00\00\00\00\00\00\00\00\00\00") + (data $21 (i32.const 844) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\r\00\00\00\00\00\00\00\00\00\00\00") + (data $22 (i32.const 876) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\0e\00\00\00\00\00\00\00\00\00\00\00") + (data $23 (i32.const 908) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\0f\00\00\00\00\00\00\00\00\00\00\00") + (data $24 (i32.const 940) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\10\00\00\00\00\00\00\00\00\00\00\00") + (data $25 (i32.const 972) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\11\00\00\00\00\00\00\00\00\00\00\00") + (data $26 (i32.const 1004) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") + (data $27 (i32.const 1052) ",\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 $28 (i32.const 1100) "|\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $29 (i32.const 1228) "\1c\00\00\00\00\00\00\00\00\00\00\00\t\00\00\00\08\00\00\00\12\00\00\00\00\00\00\00\00\00\00\00") + (data $30 (i32.const 1260) "\1c\00\00\00\00\00\00\00\00\00\00\00\n\00\00\00\08\00\00\00\13\00\00\00\00\00\00\00\00\00\00\00") + (data $31 (i32.const 1292) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $32 (i32.const 1324) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\14\00\00\00\00\00\00\00\00\00\00\00") + (data $33 (i32.const 1356) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\15\00\00\00\00\00\00\00\00\00\00\00") + (data $34 (i32.const 1388) "\1c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\08\00\00\00\16\00\00\00\00\00\00\00\00\00\00\00") + (data $35 (i32.const 1420) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\17\00\00\00\00\00\00\00\00\00\00\00") + (data $36 (i32.const 1452) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\18\00\00\00\00\00\00\00\00\00\00\00") + (data $37 (i32.const 1488) "\r\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02A\00\00\02\t\00\00\00\00\00\00\00\00\00\00\02A\00\00\00\00\00\00") + (table $0 25 25 funcref) + (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureVar~anonymous|0 $closure/testCaptureLet~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testClosureWrite~anonymous|1 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testSharedEnvironment~anonymous|1 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInDoWhile~anonymous|0 $closure/testCaptureInFor~anonymous|0 $closure/testCaptureInSwitch~anonymous|0 $closure/testCaptureInSwitch~anonymous|1 $closure/testCaptureInSwitch~anonymous|2 $closure/testCaptureInArrayLiteral~anonymous|0 $closure/testCaptureInArrayLiteral~anonymous|1 $closure/testCaptureInArrayLiteral~anonymous|2 $closure/testNestedClosureCapture~anonymous|0~anonymous|0 $closure/testNestedClosureCapture~anonymous|0 $closure/testMultipleClosuresInArray~anonymous|0 $closure/testCaptureInTernary~anonymous|0 $closure/testCaptureFromCondition~anonymous|0 $closure/testDeepLoopCapture~anonymous|0 $closure/makeCounter~anonymous|0) (export "memory" (memory $0)) (start $~start) (func $closure/testCaptureParam~anonymous|0 (result i32) @@ -2432,11 +2457,2177 @@ local.get $$closureEnv i32.load offset=4 ) + (func $closure/testCaptureInWhile~anonymous|0 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + local.get $$closureEnv + i32.load offset=4 + local.get $$closureEnv + i32.load offset=8 + i32.add + i32.store offset=4 + ) + (func $closure/testCaptureInDoWhile~anonymous|0 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + local.get $$closureEnv + i32.load offset=4 + local.get $$closureEnv + i32.load offset=8 + i32.mul + i32.store offset=4 + ) + (func $closure/testCaptureInFor~anonymous|0 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + local.get $$closureEnv + i32.load offset=4 + local.get $$closureEnv + i32.load offset=8 + i32.add + i32.store offset=4 + ) + (func $closure/testCaptureInSwitch~anonymous|0 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.const 10 + i32.store offset=4 + ) + (func $closure/testCaptureInSwitch~anonymous|1 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.const 20 + i32.store offset=4 + ) + (func $closure/testCaptureInSwitch~anonymous|2 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.const 99 + i32.store offset=4 + ) + (func $closure/testCaptureInArrayLiteral~anonymous|0 (result i32) + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.load offset=4 + ) + (func $closure/testCaptureInArrayLiteral~anonymous|1 (result i32) + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.load offset=8 + ) + (func $closure/testCaptureInArrayLiteral~anonymous|2 (result i32) + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.load offset=4 + local.get $$closureEnv + i32.load offset=8 + i32.add + ) + (func $~lib/rt/__newBuffer (param $size i32) (param $id i32) (param $data i32) (result i32) + (local $buffer i32) + local.get $size + local.get $id + call $~lib/rt/itcms/__new + local.set $buffer + local.get $data + if + local.get $buffer + local.get $data + local.get $size + memory.copy + end + local.get $buffer + 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/array/Array<%28%29=>i32>#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<%28%29=>i32>#set:length_ (param $this i32) (param $length_ i32) + local.get $this + local.get $length_ + i32.store offset=12 + ) + (func $~lib/array/Array<%28%29=>i32>#get:dataStart (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $closure/testNestedClosureCapture~anonymous|0~anonymous|0 (param $y i32) (result i32) + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.load + i32.load offset=4 + local.get $y + i32.add + ) + (func $closure/testNestedClosureCapture~anonymous|0 (result i32) + (local $$closureEnv i32) + (local $$env i32) + (local $2 i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + i32.const 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + local.get $$closureEnv + i32.store + i32.const 8 + i32.const 9 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + i32.const 18 + i32.store + local.get $2 + local.get $$env + i32.store offset=4 + local.get $2 + return + ) + (func $closure/testMultipleClosuresInArray~anonymous|0 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + local.get $$closureEnv + i32.load offset=4 + i32.const 1 + i32.add + i32.store offset=4 + ) + (func $~lib/array/Array<%28%29=>void>#get:length_ (param $this i32) (result i32) + local.get $this + i32.load offset=12 + ) + (func $~lib/array/Array<%28%29=>void>#get:dataStart (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/array/Array<%28%29=>void>#set:length_ (param $this i32) (param $length_ i32) + local.get $this + local.get $length_ + i32.store offset=12 + ) + (func $closure/testCaptureInTernary~anonymous|0 (result i32) + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.load8_u offset=4 + if (result i32) + local.get $$closureEnv + i32.load offset=8 + else + local.get $$closureEnv + i32.load offset=12 + end + ) + (func $closure/testCaptureFromCondition~anonymous|0 (result i32) + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + i32.load offset=8 + local.get $$closureEnv + i32.load offset=4 + i32.gt_s + ) + (func $closure/testDeepLoopCapture~anonymous|0 + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + local.get $$closureEnv + i32.load offset=4 + local.get $$closureEnv + i32.load offset=8 + i32.add + local.get $$closureEnv + i32.load offset=12 + i32.add + i32.store offset=4 + ) + (func $closure/makeCounter~anonymous|0 (result i32) + (local $$closureEnv i32) + global.get $$~lib/__closure_env + local.set $$closureEnv + local.get $$closureEnv + local.get $$closureEnv + i32.load offset=4 + i32.const 1 + i32.add + i32.store offset=4 + local.get $$closureEnv + i32.load offset=4 + return + ) + (func $closure/makeCounter (result i32) + (local $count i32) + (local $$env i32) + (local $2 i32) + i32.const 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 0 + i32.store offset=4 + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + i32.const 24 + i32.store + local.get $2 + local.get $$env + i32.store offset=4 + local.get $2 + return + ) (func $start:closure (local $0 i32) (local $1 i32) (local $2 i32) - (local $3 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + global.get $~lib/memory/__stack_pointer + i32.const 36 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 36 + memory.fill + memory.size + i32.const 16 + i32.shl + global.get $~lib/memory/__heap_base + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 176 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 208 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 352 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + i32.const 42 + call $closure/testCaptureParam + global.set $closure/fn1 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/fn1 + local.tee $0 + i32.store + local.get $0 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $0 + i32.load + call_indirect (type $0) + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureVar + global.set $closure/fn2 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/fn2 + local.tee $1 + i32.store offset=4 + local.get $1 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $1 + i32.load + call_indirect (type $0) + i32.const 100 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 14 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureLet + global.set $closure/fn3 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/fn3 + local.tee $2 + i32.store offset=8 + local.get $2 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $2 + i32.load + call_indirect (type $0) + i32.const 200 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testClosureWrite + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 34 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + i32.const 2 + call $closure/testMultipleCaptures + global.set $closure/fn5 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/fn5 + local.tee $3 + i32.store offset=12 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $0) + i32.const 13 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 42 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testSharedEnvironment + i32.const 50 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 53 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureInWhile + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 70 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureInDoWhile + i32.const 24 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 83 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureInFor + i32.const 15 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 94 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + call $closure/testCaptureInSwitch + i32.const 10 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 118 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + call $closure/testCaptureInSwitch + i32.const 20 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 119 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 3 + call $closure/testCaptureInSwitch + i32.const 99 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 120 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureInArrayLiteral + i32.const 30 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 133 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testNestedClosureCapture + i32.const 123 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 144 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testMultipleClosuresInArray + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 161 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureInTernary + i32.const 20 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 174 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testCaptureFromCondition + i32.const 0 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 186 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testDeepLoopCapture + i32.const 4 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 200 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/makeCounter + global.set $closure/counter1 + call $closure/makeCounter + global.set $closure/counter2 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/counter1 + local.tee $4 + i32.store offset=16 + local.get $4 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $4 + i32.load + call_indirect (type $0) + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 212 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/counter1 + local.tee $5 + i32.store offset=20 + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $0) + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 213 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/counter2 + local.tee $6 + i32.store offset=24 + local.get $6 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $6 + i32.load + call_indirect (type $0) + i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 214 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/counter1 + local.tee $7 + i32.store offset=28 + local.get $7 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $7 + i32.load + call_indirect (type $0) + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 215 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + global.get $closure/counter2 + local.tee $8 + i32.store offset=32 + local.get $8 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $8 + i32.load + call_indirect (type $0) + i32.const 2 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 216 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 36 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + i32.const 256 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 1072 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 1120 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 64 + local.get $0 + call $~lib/rt/itcms/__visit + ) + (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) + (local $2 i32) + local.get $0 + 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/function/Function<%28%29=>i32>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28%29=>i32>~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/function/Function<%28%29=>i32>#__visit + ) + (func $~lib/function/Function<%28%29=>void>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28%29=>void>~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/function/Function<%28%29=>void>#__visit + ) + (func $~lib/function/Function<%28i32%29=>void>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28i32%29=>void>~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/function/Function<%28i32%29=>void>#__visit + ) + (func $~lib/array/Array<%28%29=>i32>#get:buffer (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/array/Array<%28%29=>i32>~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<%28%29=>i32>#__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/function/Function<%28i32%29=>i32>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28i32%29=>i32>~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/function/Function<%28i32%29=>i32>#__visit + ) + (func $~lib/function/Function<%28%29=>%28i32%29=>i32>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28%29=>%28i32%29=>i32>~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/function/Function<%28%29=>%28i32%29=>i32>#__visit + ) + (func $~lib/array/Array<%28%29=>void>#get:buffer (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/array/Array<%28%29=>void>~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<%28%29=>void>#__visit + ) + (func $~lib/function/Function<%28%29=>bool>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28%29=>bool>~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/function/Function<%28%29=>bool>#__visit + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + block $~lib/function/Function<%28%29=>bool> + block $~lib/array/Array<%28%29=>void> + block $~lib/function/Function<%28%29=>%28i32%29=>i32> + block $~lib/function/Function<%28i32%29=>i32> + block $~lib/array/Array + block $~lib/array/Array<%28%29=>i32> + block $~lib/function/Function<%28i32%29=>void> + block $~lib/function/Function<%28%29=>void> + block $~lib/function/Function<%28%29=>i32> + 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/function/Function<%28%29=>i32> $~lib/function/Function<%28%29=>void> $~lib/function/Function<%28i32%29=>void> $~lib/array/Array<%28%29=>i32> $~lib/array/Array $~lib/function/Function<%28i32%29=>i32> $~lib/function/Function<%28%29=>%28i32%29=>i32> $~lib/array/Array<%28%29=>void> $~lib/function/Function<%28%29=>bool> $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/function/Function<%28%29=>i32>~visit + return + end + local.get $0 + local.get $1 + call $~lib/function/Function<%28%29=>void>~visit + return + end + local.get $0 + local.get $1 + call $~lib/function/Function<%28i32%29=>void>~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array<%28%29=>i32>~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array~visit + return + end + local.get $0 + local.get $1 + call $~lib/function/Function<%28i32%29=>i32>~visit + return + end + local.get $0 + local.get $1 + call $~lib/function/Function<%28%29=>%28i32%29=>i32>~visit + return + end + local.get $0 + local.get $1 + call $~lib/array/Array<%28%29=>void>~visit + return + end + local.get $0 + local.get $1 + call $~lib/function/Function<%28%29=>bool>~visit + return + end + unreachable + ) + (func $~start + call $start:closure + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 34336 + i32.const 34384 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (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 1072 + i32.const 1024 + i32.const 19 + i32.const 48 + call $~lib/builtins/abort + unreachable + 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<%28%29=>i32>#__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<%28%29=>i32>#get:length_ + i32.ge_u + if + local.get $index + i32.const 0 + i32.lt_s + if + i32.const 256 + i32.const 1024 + i32.const 130 + i32.const 22 + call $~lib/builtins/abort + unreachable + 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<%28%29=>i32>#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<%28%29=>i32>#get:dataStart + local.get $index + i32.const 2 + i32.shl + i32.add + local.get $value + i32.store + i32.const 1 + drop + local.get $this + local.get $value + i32.const 1 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/array/Array<%28%29=>i32>#__get (param $this i32) (param $index i32) (result i32) + (local $value 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 $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<%28%29=>i32>#get:length_ + i32.ge_u + if + i32.const 256 + i32.const 1024 + i32.const 114 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/array/Array<%28%29=>i32>#get:dataStart + local.get $index + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $value + i32.store offset=4 + i32.const 1 + drop + i32.const 0 + i32.eqz + drop + local.get $value + i32.eqz + if + i32.const 1120 + i32.const 1024 + i32.const 118 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + local.get $value + 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 $closure/testCaptureInArrayLiteral (result i32) + (local $x i32) + (local $$env i32) + (local $y i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $fns i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 24 + memory.fill + i32.const 12 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 5 + i32.store offset=4 + local.get $$env + i32.const 10 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3 + i32.const 2 + i32.const 7 + i32.const 0 + call $~lib/rt/__newArray + local.tee $3 + i32.store + local.get $3 + i32.const 0 + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.set $4 + local.get $4 + i32.const 15 + i32.store + local.get $4 + local.get $$env + i32.store offset=4 + local.get $4 + call $~lib/array/Array<%28%29=>i32>#__set + local.get $3 + i32.const 1 + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.set $5 + local.get $5 + i32.const 16 + i32.store + local.get $5 + local.get $$env + i32.store offset=4 + local.get $5 + call $~lib/array/Array<%28%29=>i32>#__set + local.get $3 + i32.const 2 + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.set $6 + local.get $6 + i32.const 17 + i32.store + local.get $6 + local.get $$env + i32.store offset=4 + local.get $6 + call $~lib/array/Array<%28%29=>i32>#__set + local.get $3 + local.tee $fns + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $fns + local.set $11 + global.get $~lib/memory/__stack_pointer + local.get $11 + i32.store offset=8 + local.get $11 + i32.const 0 + call $~lib/array/Array<%28%29=>i32>#__get + local.tee $8 + i32.store offset=12 + local.get $8 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $8 + i32.load + call_indirect (type $0) + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $fns + local.set $11 + global.get $~lib/memory/__stack_pointer + local.get $11 + i32.store offset=8 + local.get $11 + i32.const 1 + call $~lib/array/Array<%28%29=>i32>#__get + local.tee $9 + i32.store offset=16 + local.get $9 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $9 + i32.load + call_indirect (type $0) + i32.add + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $fns + local.set $11 + global.get $~lib/memory/__stack_pointer + local.get $11 + i32.store offset=8 + local.get $11 + i32.const 2 + call $~lib/array/Array<%28%29=>i32>#__get + local.tee $10 + i32.store offset=20 + local.get $10 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $10 + i32.load + call_indirect (type $0) + i32.add + local.set $11 + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $11 + return + ) + (func $~lib/array/Array<%28%29=>void>#push (param $this i32) (param $value i32) (result i32) + (local $oldLen i32) + (local $len 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 + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/array/Array<%28%29=>void>#get:length_ + local.set $oldLen + local.get $oldLen + i32.const 1 + i32.add + local.set $len + local.get $this + local.get $len + i32.const 2 + i32.const 1 + call $~lib/array/ensureCapacity + i32.const 1 + drop + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + call $~lib/array/Array<%28%29=>void>#get:dataStart + local.get $oldLen + i32.const 2 + i32.shl + i32.add + local.get $value + i32.store + local.get $this + local.get $value + i32.const 1 + call $~lib/rt/itcms/__link + local.get $this + local.set $4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store + local.get $4 + local.get $len + call $~lib/array/Array<%28%29=>void>#set:length_ + local.get $len + local.set $4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $4 + return + ) + (func $~lib/array/Array<%28%29=>void>#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<%28%29=>void>#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<%28%29=>void>#__get (param $this i32) (param $index i32) (result i32) + (local $value 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 $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<%28%29=>void>#get:length_ + i32.ge_u + if + i32.const 256 + i32.const 1024 + i32.const 114 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/array/Array<%28%29=>void>#get:dataStart + local.get $index + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $value + i32.store offset=4 + i32.const 1 + drop + i32.const 0 + i32.eqz + drop + local.get $value + i32.eqz + if + i32.const 1120 + i32.const 1024 + i32.const 118 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + local.get $value + 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 $closure/testMultipleClosuresInArray (result i32) + (local $shared i32) + (local $$env i32) + (local $2 i32) + (local $incrementers i32) + (local $i i32) + (local $5 i32) + (local $i|6 i32) + (local $7 i32) + (local $8 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 + i32.const 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 2 + i32.const 11 + i32.const 1312 + call $~lib/rt/__newArray + local.tee $incrementers + i32.store + i32.const 0 + local.set $i + loop $for-loop|0 + local.get $i + i32.const 3 + i32.lt_s + if + local.get $incrementers + local.set $8 + global.get $~lib/memory/__stack_pointer + local.get $8 + i32.store offset=4 + local.get $8 + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $5 + local.get $5 + i32.const 20 + i32.store + local.get $5 + local.get $$env + i32.store offset=4 + local.get $5 + local.set $8 + global.get $~lib/memory/__stack_pointer + local.get $8 + i32.store offset=8 + local.get $8 + call $~lib/array/Array<%28%29=>void>#push + drop + local.get $i + i32.const 1 + i32.add + local.set $i + br $for-loop|0 + end + end + i32.const 0 + local.set $i|6 + loop $for-loop|1 + local.get $i|6 + local.get $incrementers + local.set $8 + global.get $~lib/memory/__stack_pointer + local.get $8 + i32.store offset=4 + local.get $8 + call $~lib/array/Array<%28%29=>void>#get:length + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $incrementers + local.set $8 + global.get $~lib/memory/__stack_pointer + local.get $8 + i32.store offset=4 + local.get $8 + local.get $i|6 + call $~lib/array/Array<%28%29=>void>#__get + local.tee $7 + i32.store offset=12 + local.get $7 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $7 + i32.load + call_indirect (type $3) + local.get $i|6 + i32.const 1 + i32.add + local.set $i|6 + br $for-loop|1 + end + end + local.get $$env + i32.load offset=4 + local.set $8 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $8 + return + ) + (func $~lib/function/Function<%28%29=>i32>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28%29=>i32>#get:_env + 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/function/Function<%28%29=>void>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28%29=>void>#get:_env + 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/function/Function<%28i32%29=>void>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28i32%29=>void>#get:_env + 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/array/Array<%28%29=>i32>#__visit (param $this i32) (param $cookie i32) + (local $cur i32) + (local $end i32) + (local $val i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1 + drop + local.get $this + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + call $~lib/array/Array<%28%29=>i32>#get:dataStart + local.set $cur + local.get $cur + local.get $this + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + call $~lib/array/Array<%28%29=>i32>#get:length_ + i32.const 2 + i32.shl + i32.add + local.set $end + loop $while-continue|0 + local.get $cur + local.get $end + i32.lt_u + if + local.get $cur + i32.load + local.set $val + local.get $val + if + local.get $val + local.get $cookie + call $~lib/rt/itcms/__visit + end + local.get $cur + i32.const 4 + i32.add + local.set $cur + br $while-continue|0 + end + end + local.get $this + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + call $~lib/array/Array<%28%29=>i32>#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/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/function/Function<%28i32%29=>i32>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28i32%29=>i32>#get:_env + 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/function/Function<%28%29=>%28i32%29=>i32>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28%29=>%28i32%29=>i32>#get:_env + 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/array/Array<%28%29=>void>#__visit (param $this i32) (param $cookie i32) + (local $cur i32) + (local $end i32) + (local $val i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + i32.const 1 + drop + local.get $this + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + call $~lib/array/Array<%28%29=>void>#get:dataStart + local.set $cur + local.get $cur + local.get $this + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + call $~lib/array/Array<%28%29=>void>#get:length_ + i32.const 2 + i32.shl + i32.add + local.set $end + loop $while-continue|0 + local.get $cur + local.get $end + i32.lt_u + if + local.get $cur + i32.load + local.set $val + local.get $val + if + local.get $val + local.get $cookie + call $~lib/rt/itcms/__visit + end + local.get $cur + i32.const 4 + i32.add + local.set $cur + br $while-continue|0 + end + end + local.get $this + local.set $5 + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store + local.get $5 + call $~lib/array/Array<%28%29=>void>#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/function/Function<%28%29=>bool>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28%29=>bool>#get:_env + 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 $closure/testClosureWrite (result i32) + (local $counter i32) + (local $$env i32) + (local $2 i32) + (local $increment i32) + (local $4 i32) + (local $getCounter i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 24 + memory.fill + i32.const 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + i32.const 4 + i32.store + local.get $2 + local.get $$env + i32.store offset=4 + local.get $2 + local.tee $increment + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.set $4 + local.get $4 + i32.const 5 + i32.store + local.get $4 + local.get $$env + i32.store offset=4 + local.get $4 + local.tee $getCounter + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $increment + local.tee $6 + i32.store offset=8 + local.get $6 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $6 + i32.load + call_indirect (type $3) + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $increment + local.tee $7 + i32.store offset=12 + local.get $7 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $7 + i32.load + call_indirect (type $3) + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $increment + local.tee $8 + i32.store offset=16 + local.get $8 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $8 + i32.load + call_indirect (type $3) + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $getCounter + local.tee $9 + i32.store offset=20 + local.get $9 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $9 + i32.load + call_indirect (type $0) + local.set $10 + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $10 + return + ) + (func $closure/testSharedEnvironment (result i32) + (local $value i32) + (local $$env i32) + (local $2 i32) + (local $setter i32) + (local $4 i32) + (local $getter i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) global.get $~lib/memory/__stack_pointer i32.const 16 i32.sub @@ -2448,297 +4639,458 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store offset=8 - memory.size - i32.const 16 - i32.shl - global.get $~lib/memory/__heap_base - i32.sub - i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 176 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/pinSpace - i32.const 208 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/toSpace - i32.const 352 - call $~lib/rt/itcms/initLazy - global.set $~lib/rt/itcms/fromSpace - i32.const 42 - call $closure/testCaptureParam - global.set $closure/fn1 - global.get $~lib/memory/__stack_pointer + i32.const 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env i32.const 0 - global.set $~argumentsLength - global.get $closure/fn1 - local.tee $0 i32.store - local.get $0 - i32.load offset=4 - global.set $$~lib/__closure_env - local.get $0 - i32.load - call_indirect (type $2) - i32.const 42 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 464 - i32.const 6 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - call $closure/testCaptureVar - global.set $closure/fn2 - global.get $~lib/memory/__stack_pointer + local.get $$env i32.const 0 - global.set $~argumentsLength - global.get $closure/fn2 - local.tee $1 i32.store offset=4 - local.get $1 - i32.load offset=4 - global.set $$~lib/__closure_env - local.get $1 - i32.load - call_indirect (type $2) - i32.const 100 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 464 - i32.const 14 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - call $closure/testCaptureLet - global.set $closure/fn3 global.get $~lib/memory/__stack_pointer - i32.const 0 + i32.const 8 + i32.const 6 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + i32.const 7 + i32.store + local.get $2 + local.get $$env + i32.store offset=4 + local.get $2 + local.tee $setter + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.set $4 + local.get $4 + i32.const 8 + i32.store + local.get $4 + local.get $$env + i32.store offset=4 + local.get $4 + local.tee $getter + i32.store offset=4 + i32.const 50 + global.get $~lib/memory/__stack_pointer + i32.const 1 global.set $~argumentsLength - global.get $closure/fn3 - local.tee $2 + local.get $setter + local.tee $6 i32.store offset=8 - local.get $2 + local.get $6 i32.load offset=4 global.set $$~lib/__closure_env - local.get $2 + local.get $6 i32.load - call_indirect (type $2) - i32.const 200 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 464 - i32.const 22 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - call $closure/testClosureWrite - i32.const 3 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 464 - i32.const 34 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 1 - i32.const 2 - call $closure/testMultipleCaptures - global.set $closure/fn5 + call_indirect (type $4) global.get $~lib/memory/__stack_pointer i32.const 0 global.set $~argumentsLength - global.get $closure/fn5 - local.tee $3 + local.get $getter + local.tee $7 i32.store offset=12 - local.get $3 + local.get $7 i32.load offset=4 global.set $$~lib/__closure_env - local.get $3 + local.get $7 i32.load - call_indirect (type $2) - i32.const 13 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 464 - i32.const 42 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - call $closure/testSharedEnvironment - i32.const 50 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 464 - i32.const 53 - i32.const 1 - call $~lib/builtins/abort - unreachable - end + call_indirect (type $0) + local.set $8 global.get $~lib/memory/__stack_pointer i32.const 16 i32.add global.set $~lib/memory/__stack_pointer + local.get $8 + return ) - (func $~lib/rt/__visit_globals (param $0 i32) - (local $1 i32) - i32.const 256 - local.get $0 - call $~lib/rt/itcms/__visit - i32.const 64 - local.get $0 - call $~lib/rt/itcms/__visit - ) - (func $~lib/arraybuffer/ArrayBufferView~visit (param $0 i32) (param $1 i32) - (local $2 i32) - local.get $0 - 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/function/Function<%28%29=>i32>#get:_env (param $this i32) (result i32) - local.get $this - i32.load offset=4 - ) - (func $~lib/function/Function<%28%29=>i32>~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/function/Function<%28%29=>i32>#__visit - ) - (func $~lib/function/Function<%28%29=>void>#get:_env (param $this i32) (result i32) - local.get $this - i32.load offset=4 - ) - (func $~lib/function/Function<%28%29=>void>~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/function/Function<%28%29=>void>#__visit - ) - (func $~lib/function/Function<%28i32%29=>void>#get:_env (param $this i32) (result i32) - local.get $this - i32.load offset=4 - ) - (func $~lib/function/Function<%28i32%29=>void>~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/function/Function<%28i32%29=>void>#__visit - ) - (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) - block $invalid - block $~lib/function/Function<%28i32%29=>void> - block $~lib/function/Function<%28%29=>void> - block $~lib/function/Function<%28%29=>i32> - 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/function/Function<%28%29=>i32> $~lib/function/Function<%28%29=>void> $~lib/function/Function<%28i32%29=>void> $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/function/Function<%28%29=>i32>~visit - return - end - local.get $0 - local.get $1 - call $~lib/function/Function<%28%29=>void>~visit - return + (func $closure/testCaptureInWhile (result i32) + (local $sum i32) + (local $$env i32) + (local $i i32) + (local $3 i32) + (local $adder i32) + (local $5 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 + i32.const 12 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 0 + i32.store offset=4 + local.get $$env + i32.const 0 + i32.store offset=8 + loop $while-continue|0 + local.get $$env + i32.load offset=8 + i32.const 3 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $3 + local.get $3 + i32.const 9 + i32.store + local.get $3 + local.get $$env + i32.store offset=4 + local.get $3 + local.tee $adder + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $adder + local.tee $5 + i32.store offset=4 + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $3) + local.get $$env + local.get $$env + i32.load offset=8 + i32.const 1 + i32.add + i32.store offset=8 + br $while-continue|0 end - local.get $0 - local.get $1 - call $~lib/function/Function<%28i32%29=>void>~visit - return end - unreachable - ) - (func $~start - call $start:closure + local.get $$env + i32.load offset=4 + 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 $~stack_check + (func $closure/testCaptureInDoWhile (result i32) + (local $product i32) + (local $$env i32) + (local $i i32) + (local $3 i32) + (local $multiplier i32) + (local $5 i32) + (local $6 i32) global.get $~lib/memory/__stack_pointer - global.get $~lib/memory/__data_end - i32.lt_s - if - i32.const 33552 - i32.const 33600 - i32.const 1 + 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 12 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 1 + i32.store offset=4 + local.get $$env + i32.const 1 + i32.store offset=8 + loop $do-loop|0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $3 + local.get $3 + i32.const 10 + i32.store + local.get $3 + local.get $$env + i32.store offset=4 + local.get $3 + local.tee $multiplier + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $multiplier + local.tee $5 + i32.store offset=4 + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $3) + local.get $$env + local.get $$env + i32.load offset=8 i32.const 1 - call $~lib/builtins/abort - unreachable + i32.add + i32.store offset=8 + local.get $$env + i32.load offset=8 + i32.const 4 + i32.le_s + br_if $do-loop|0 end + local.get $$env + i32.load offset=4 + 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/function/Function<%28%29=>i32>#__visit (param $this i32) (param $cookie i32) - (local $2 i32) + (func $closure/testCaptureInFor (result i32) + (local $result i32) + (local $$env i32) + (local $i i32) + (local $3 i32) + (local $addI i32) + (local $5 i32) + (local $6 i32) global.get $~lib/memory/__stack_pointer - i32.const 4 + 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 12 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env i32.const 0 i32.store - local.get $this - local.set $2 + local.get $$env + i32.const 0 + i32.store offset=4 + local.get $$env + i32.const 1 + i32.store offset=8 + loop $for-loop|0 + local.get $$env + i32.load offset=8 + i32.const 5 + i32.le_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $3 + local.get $3 + i32.const 11 + i32.store + local.get $3 + local.get $$env + i32.store offset=4 + local.get $3 + local.tee $addI + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $addI + local.tee $5 + i32.store offset=4 + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $3) + local.get $$env + local.get $$env + i32.load offset=8 + i32.const 1 + i32.add + i32.store offset=8 + br $for-loop|0 + end + end + local.get $$env + i32.load offset=4 + local.set $6 global.get $~lib/memory/__stack_pointer - local.get $2 + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $6 + return + ) + (func $closure/testCaptureInSwitch (param $x i32) (result i32) + (local $captured i32) + (local $$env i32) + (local $3 i32) + (local $4 i32) + (local $setCaptured i32) + (local $6 i32) + (local $7 i32) + (local $setCaptured|8 i32) + (local $9 i32) + (local $10 i32) + (local $setCaptured|11 i32) + (local $12 i32) + (local $13 i32) + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 24 + memory.fill + i32.const 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 i32.store - local.get $2 - call $~lib/function/Function<%28%29=>i32>#get:_env - local.get $cookie - call $~lib/rt/itcms/__visit + local.get $$env + i32.const 0 + i32.store offset=4 + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + local.get $x + local.set $3 + local.get $3 + i32.const 1 + i32.eq + br_if $case0|0 + local.get $3 + i32.const 2 + i32.eq + br_if $case1|0 + br $case2|0 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $4 + local.get $4 + i32.const 12 + i32.store + local.get $4 + local.get $$env + i32.store offset=4 + local.get $4 + local.tee $setCaptured + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $setCaptured + local.tee $6 + i32.store offset=4 + local.get $6 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $6 + i32.load + call_indirect (type $3) + br $break|0 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $7 + local.get $7 + i32.const 13 + i32.store + local.get $7 + local.get $$env + i32.store offset=4 + local.get $7 + local.tee $setCaptured|8 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $setCaptured|8 + local.tee $9 + i32.store offset=12 + local.get $9 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $9 + i32.load + call_indirect (type $3) + br $break|0 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $10 + local.get $10 + i32.const 14 + i32.store + local.get $10 + local.get $$env + i32.store offset=4 + local.get $10 + local.tee $setCaptured|11 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $setCaptured|11 + local.tee $12 + i32.store offset=20 + local.get $12 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $12 + i32.load + call_indirect (type $3) + br $break|0 + end + local.get $$env + i32.load offset=4 + local.set $13 global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 24 i32.add global.set $~lib/memory/__stack_pointer + local.get $13 + return ) - (func $~lib/function/Function<%28%29=>void>#__visit (param $this i32) (param $cookie i32) - (local $2 i32) + (func $~lib/rt/__newArray (param $length i32) (param $alignLog2 i32) (param $id i32) (param $data i32) (result i32) + (local $bufferSize i32) + (local $buffer i32) + (local $array i32) + (local $7 i32) global.get $~lib/memory/__stack_pointer i32.const 4 i32.sub @@ -2747,170 +5099,232 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - local.get $this - local.set $2 + local.get $length + local.get $alignLog2 + i32.shl + local.set $bufferSize global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $bufferSize + i32.const 1 + local.get $data + call $~lib/rt/__newBuffer + local.tee $buffer i32.store - local.get $2 - call $~lib/function/Function<%28%29=>void>#get:_env - local.get $cookie - call $~lib/rt/itcms/__visit + i32.const 16 + local.get $id + call $~lib/rt/itcms/__new + local.set $array + local.get $array + local.get $buffer + i32.store + local.get $array + local.get $buffer + i32.const 0 + call $~lib/rt/itcms/__link + local.get $array + local.get $buffer + i32.store offset=4 + local.get $array + local.get $bufferSize + i32.store offset=8 + local.get $array + local.get $length + i32.store offset=12 + local.get $array + local.set $7 global.get $~lib/memory/__stack_pointer i32.const 4 i32.add global.set $~lib/memory/__stack_pointer + local.get $7 + return ) - (func $~lib/function/Function<%28i32%29=>void>#__visit (param $this i32) (param $cookie i32) + (func $closure/testNestedClosureCapture (result i32) + (local $outer i32) + (local $$env i32) (local $2 i32) + (local $makeAdder i32) + (local $4 i32) + (local $adder i32) + (local $6 i32) + (local $7 i32) global.get $~lib/memory/__stack_pointer - i32.const 4 + 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 + i32.const 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env i32.const 0 i32.store - local.get $this + local.get $$env + i32.const 100 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 10 + call $~lib/rt/itcms/__new local.set $2 + local.get $2 + i32.const 19 + i32.store + local.get $2 + local.get $$env + i32.store offset=4 + local.get $2 + local.tee $makeAdder + i32.store + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $makeAdder + local.tee $4 + i32.store offset=4 + local.get $4 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $4 + i32.load + call_indirect (type $0) + local.tee $adder + i32.store offset=8 + i32.const 23 global.get $~lib/memory/__stack_pointer - local.get $2 - i32.store - local.get $2 - call $~lib/function/Function<%28i32%29=>void>#get:_env - local.get $cookie - call $~lib/rt/itcms/__visit + i32.const 1 + global.set $~argumentsLength + local.get $adder + local.tee $6 + i32.store offset=12 + local.get $6 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $6 + i32.load + call_indirect (type $1) + local.set $7 global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 16 i32.add global.set $~lib/memory/__stack_pointer + local.get $7 + return ) - (func $closure/testClosureWrite (result i32) - (local $counter i32) + (func $closure/testCaptureInTernary (result i32) + (local $flag i32) (local $$env i32) - (local $2 i32) - (local $increment i32) + (local $a i32) + (local $b i32) (local $4 i32) - (local $getCounter i32) + (local $chooser i32) (local $6 i32) (local $7 i32) (local $8 i32) - (local $9 i32) - (local $10 i32) global.get $~lib/memory/__stack_pointer - i32.const 24 + 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.const 24 - memory.fill - i32.const 8 + i32.store offset=8 + i32.const 16 call $~lib/rt/tlsf/__alloc local.set $$env local.get $$env i32.const 0 i32.store local.get $$env - i32.const 0 - i32.store offset=4 - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.const 5 - call $~lib/rt/itcms/__new - local.set $2 - local.get $2 - i32.const 4 - i32.store - local.get $2 + i32.const 1 + i32.store8 offset=4 local.get $$env - i32.store offset=4 - local.get $2 - local.tee $increment - i32.store + i32.const 10 + i32.store offset=8 + local.get $$env + i32.const 20 + i32.store offset=12 global.get $~lib/memory/__stack_pointer i32.const 8 i32.const 4 call $~lib/rt/itcms/__new local.set $4 local.get $4 - i32.const 5 + i32.const 21 i32.store local.get $4 local.get $$env i32.store offset=4 local.get $4 - local.tee $getCounter - i32.store offset=4 + local.tee $chooser + i32.store global.get $~lib/memory/__stack_pointer i32.const 0 global.set $~argumentsLength - local.get $increment + local.get $chooser local.tee $6 - i32.store offset=8 + i32.store offset=4 local.get $6 i32.load offset=4 global.set $$~lib/__closure_env local.get $6 i32.load - call_indirect (type $4) + call_indirect (type $0) + i32.const 10 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 170 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $$env + i32.const 0 + i32.store8 offset=4 global.get $~lib/memory/__stack_pointer i32.const 0 global.set $~argumentsLength - local.get $increment + local.get $chooser local.tee $7 - i32.store offset=12 + i32.store offset=8 local.get $7 i32.load offset=4 global.set $$~lib/__closure_env local.get $7 i32.load - call_indirect (type $4) - global.get $~lib/memory/__stack_pointer - i32.const 0 - global.set $~argumentsLength - local.get $increment - local.tee $8 - i32.store offset=16 - local.get $8 - i32.load offset=4 - global.set $$~lib/__closure_env - local.get $8 - i32.load - call_indirect (type $4) - global.get $~lib/memory/__stack_pointer - i32.const 0 - global.set $~argumentsLength - local.get $getCounter - local.tee $9 - i32.store offset=20 - local.get $9 - i32.load offset=4 - global.set $$~lib/__closure_env - local.get $9 - i32.load - call_indirect (type $2) - local.set $10 + call_indirect (type $0) + local.set $8 global.get $~lib/memory/__stack_pointer - i32.const 24 + i32.const 12 i32.add global.set $~lib/memory/__stack_pointer - local.get $10 + local.get $8 return ) - (func $closure/testSharedEnvironment (result i32) - (local $value i32) + (func $closure/testCaptureFromCondition (result i32) + (local $threshold i32) (local $$env i32) - (local $2 i32) - (local $setter i32) - (local $4 i32) - (local $getter i32) + (local $value i32) + (local $3 i32) + (local $isAboveThreshold i32) + (local $5 i32) (local $6 i32) (local $7 i32) - (local $8 i32) global.get $~lib/memory/__stack_pointer - i32.const 16 + i32.const 12 i32.sub global.set $~lib/memory/__stack_pointer call $~stack_check @@ -2918,50 +5332,66 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=8 - i32.const 8 + i32.const 0 + i32.store offset=8 + i32.const 12 call $~lib/rt/tlsf/__alloc local.set $$env local.get $$env i32.const 0 i32.store local.get $$env - i32.const 0 + i32.const 50 i32.store offset=4 + local.get $$env + i32.const 75 + i32.store offset=8 global.get $~lib/memory/__stack_pointer i32.const 8 - i32.const 6 + i32.const 12 call $~lib/rt/itcms/__new - local.set $2 - local.get $2 - i32.const 7 + local.set $3 + local.get $3 + i32.const 22 i32.store - local.get $2 + local.get $3 local.get $$env i32.store offset=4 - local.get $2 - local.tee $setter + local.get $3 + local.tee $isAboveThreshold i32.store global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.const 4 - call $~lib/rt/itcms/__new - local.set $4 - local.get $4 - i32.const 8 - i32.store - local.get $4 - local.get $$env - i32.store offset=4 - local.get $4 - local.tee $getter + i32.const 0 + global.set $~argumentsLength + local.get $isAboveThreshold + local.tee $5 i32.store offset=4 - i32.const 50 - global.get $~lib/memory/__stack_pointer + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $0) + i32.const 0 + i32.ne i32.const 1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 182 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $$env + i32.const 25 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 global.set $~argumentsLength - local.get $setter + local.get $isAboveThreshold local.tee $6 i32.store offset=8 local.get $6 @@ -2969,25 +5399,116 @@ global.set $$~lib/__closure_env local.get $6 i32.load - call_indirect (type $3) + call_indirect (type $0) + if (result i32) + i32.const 1 + else + i32.const 0 + end + local.set $7 global.get $~lib/memory/__stack_pointer - i32.const 0 - global.set $~argumentsLength - local.get $getter - local.tee $7 - i32.store offset=12 - local.get $7 - i32.load offset=4 - global.set $$~lib/__closure_env + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer local.get $7 - i32.load - call_indirect (type $2) - local.set $8 + return + ) + (func $closure/testDeepLoopCapture (result i32) + (local $total i32) + (local $$env i32) + (local $i i32) + (local $j i32) + (local $4 i32) + (local $addBoth i32) + (local $6 i32) + (local $7 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 16 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 0 + i32.store offset=4 + local.get $$env + i32.const 0 + i32.store offset=8 + loop $for-loop|0 + local.get $$env + i32.load offset=8 + i32.const 2 + i32.lt_s + if + local.get $$env + i32.const 0 + i32.store offset=12 + loop $for-loop|1 + local.get $$env + i32.load offset=12 + i32.const 2 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.set $4 + local.get $4 + i32.const 23 + i32.store + local.get $4 + local.get $$env + i32.store offset=4 + local.get $4 + local.tee $addBoth + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $addBoth + local.tee $6 + i32.store offset=4 + local.get $6 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $6 + i32.load + call_indirect (type $3) + local.get $$env + local.get $$env + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + br $for-loop|1 + end + end + local.get $$env + local.get $$env + i32.load offset=8 + i32.const 1 + i32.add + i32.store offset=8 + br $for-loop|0 + end + end + local.get $$env + i32.load offset=4 + local.set $7 + global.get $~lib/memory/__stack_pointer + i32.const 8 i32.add global.set $~lib/memory/__stack_pointer - local.get $8 + local.get $7 return ) ) diff --git a/tests/compiler/closure.release.wat b/tests/compiler/closure.release.wat index 4eed63f75f..01dd39220d 100644 --- a/tests/compiler/closure.release.wat +++ b/tests/compiler/closure.release.wat @@ -2,11 +2,13 @@ (type $0 (func (result i32))) (type $1 (func)) (type $2 (func (param i32))) - (type $3 (func (param i32 i32))) - (type $4 (func (param i32 i32) (result i32))) - (type $5 (func (param i32 i32 i32 i32))) - (type $6 (func (param i32 i32 i64))) - (type $7 (func (param i32) (result i32))) + (type $3 (func (param i32 i32) (result i32))) + (type $4 (func (param i32 i32))) + (type $5 (func (param i32) (result i32))) + (type $6 (func (param i32 i32 i32))) + (type $7 (func (param i32 i32 i32 i32))) + (type $8 (func (param i32 i32 i64))) + (type $9 (func (param i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $$~lib/__closure_env (mut i32) (i32.const 0)) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) @@ -23,7 +25,9 @@ (global $closure/fn2 (mut i32) (i32.const 0)) (global $closure/fn3 (mut i32) (i32.const 0)) (global $closure/fn5 (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34544)) + (global $closure/counter1 (mut i32) (i32.const 0)) + (global $closure/counter2 (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 35336)) (memory $0 1) (data $0 (i32.const 1036) "\1c") (data $0.1 (i32.const 1048) "\04\00\00\00\08\00\00\00\01") @@ -53,9 +57,51 @@ (data $15.1 (i32.const 1688) "\06\00\00\00\08\00\00\00\07") (data $16 (i32.const 1708) "\1c") (data $16.1 (i32.const 1720) "\04\00\00\00\08\00\00\00\08") - (data $17 (i32.const 1744) "\07\00\00\00 \00\00\00 \00\00\00 ") - (table $0 9 9 funcref) - (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testCaptureParam~anonymous|0) + (data $17 (i32.const 1740) "\1c") + (data $17.1 (i32.const 1752) "\05\00\00\00\08\00\00\00\t") + (data $18 (i32.const 1772) "\1c") + (data $18.1 (i32.const 1784) "\05\00\00\00\08\00\00\00\n") + (data $19 (i32.const 1804) "\1c") + (data $19.1 (i32.const 1816) "\05\00\00\00\08\00\00\00\0b") + (data $20 (i32.const 1836) "\1c") + (data $20.1 (i32.const 1848) "\05\00\00\00\08\00\00\00\0c") + (data $21 (i32.const 1868) "\1c") + (data $21.1 (i32.const 1880) "\05\00\00\00\08\00\00\00\r") + (data $22 (i32.const 1900) "\1c") + (data $22.1 (i32.const 1912) "\05\00\00\00\08\00\00\00\0e") + (data $23 (i32.const 1932) "\1c") + (data $23.1 (i32.const 1944) "\04\00\00\00\08\00\00\00\0f") + (data $24 (i32.const 1964) "\1c") + (data $24.1 (i32.const 1976) "\04\00\00\00\08\00\00\00\10") + (data $25 (i32.const 1996) "\1c") + (data $25.1 (i32.const 2008) "\04\00\00\00\08\00\00\00\11") + (data $26 (i32.const 2028) ",") + (data $26.1 (i32.const 2040) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data $27 (i32.const 2076) ",") + (data $27.1 (i32.const 2088) "\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h") + (data $28 (i32.const 2124) "|") + (data $28.1 (i32.const 2136) "\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y") + (data $29 (i32.const 2252) "\1c") + (data $29.1 (i32.const 2264) "\t\00\00\00\08\00\00\00\12") + (data $30 (i32.const 2284) "\1c") + (data $30.1 (i32.const 2296) "\n\00\00\00\08\00\00\00\13") + (data $31 (i32.const 2316) "\1c") + (data $31.1 (i32.const 2328) "\01") + (data $32 (i32.const 2348) "\1c") + (data $32.1 (i32.const 2360) "\05\00\00\00\08\00\00\00\14") + (data $33 (i32.const 2380) "\1c") + (data $33.1 (i32.const 2392) "\04\00\00\00\08\00\00\00\15") + (data $34 (i32.const 2412) "\1c") + (data $34.1 (i32.const 2424) "\0c\00\00\00\08\00\00\00\16") + (data $35 (i32.const 2444) "\1c") + (data $35.1 (i32.const 2456) "\05\00\00\00\08\00\00\00\17") + (data $36 (i32.const 2476) "\1c") + (data $36.1 (i32.const 2488) "\04\00\00\00\08\00\00\00\18") + (data $37 (i32.const 2512) "\r\00\00\00 \00\00\00 \00\00\00 ") + (data $37.1 (i32.const 2544) "\02A\00\00\02\t") + (data $37.2 (i32.const 2560) "\02A") + (table $0 25 25 funcref) + (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInDoWhile~anonymous|0 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInSwitch~anonymous|0 $closure/testCaptureInSwitch~anonymous|1 $closure/testCaptureInSwitch~anonymous|2 $closure/testCaptureParam~anonymous|0 $closure/testCaptureInArrayLiteral~anonymous|1 $closure/testCaptureInArrayLiteral~anonymous|2 $closure/testNestedClosureCapture~anonymous|0~anonymous|0 $closure/testNestedClosureCapture~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testCaptureInTernary~anonymous|0 $closure/testCaptureFromCondition~anonymous|0 $closure/testDeepLoopCapture~anonymous|0 $closure/makeCounter~anonymous|0) (export "memory" (memory $0)) (start $~start) (func $closure/testCaptureParam~anonymous|0 (result i32) @@ -67,6 +113,10 @@ (local $1 i32) i32.const 1280 call $~lib/rt/itcms/__visit + i32.const 2096 + call $~lib/rt/itcms/__visit + i32.const 2144 + call $~lib/rt/itcms/__visit i32.const 1088 call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace @@ -107,152 +157,156 @@ end end ) - (func $~lib/rt/itcms/__visit (param $0 i32) + (func $~lib/rt/itcms/Object#makeGray (param $0 i32) (local $1 i32) (local $2 i32) (local $3 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 $1 - i32.load offset=4 - i32.const 3 - i32.and + 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.get $~lib/rt/itcms/iter - i32.eq + global.set $~lib/rt/itcms/iter + end + block $__inlined_func$~lib/rt/itcms/Object#unlink$192 + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.tee $1 + i32.eqz if - local.get $1 + local.get $0 i32.load offset=8 - local.tee $0 i32.eqz - if - i32.const 0 - i32.const 1152 - i32.const 148 - i32.const 30 - call $~lib/builtins/abort - unreachable - end local.get $0 - global.set $~lib/rt/itcms/iter - end - block $__inlined_func$~lib/rt/itcms/Object#unlink$125 - local.get $1 - i32.load offset=4 - i32.const -4 + i32.const 35336 + i32.lt_u i32.and - local.tee $0 - i32.eqz - if - local.get $1 - i32.load offset=8 - i32.eqz - local.get $1 - i32.const 34544 - 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$125 - end - local.get $1 - 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 $0 - local.get $2 - i32.store offset=8 - local.get $2 - local.get $0 - 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 $1 - i32.load offset=12 - local.tee $0 - i32.const 2 - i32.le_u - if (result i32) - i32.const 1 - else - local.get $0 - i32.const 1744 - i32.load - i32.gt_u - if - i32.const 1280 - i32.const 1344 - i32.const 21 - i32.const 28 + i32.const 128 + i32.const 18 call $~lib/builtins/abort unreachable end - local.get $0 - i32.const 2 - i32.shl - i32.const 1748 - i32.add - i32.load - i32.const 32 - i32.and + br $__inlined_func$~lib/rt/itcms/Object#unlink$192 end - local.set $3 - local.get $2 + local.get $0 i32.load offset=8 - local.set $0 - local.get $1 - global.get $~lib/rt/itcms/white + local.tee $2 i32.eqz - i32.const 2 - local.get $3 - select - local.get $2 - i32.or - i32.store offset=4 + if + i32.const 0 + i32.const 1152 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end local.get $1 - local.get $0 + local.get $2 i32.store offset=8 - local.get $0 + local.get $2 local.get $1 - local.get $0 + local.get $2 i32.load offset=4 i32.const 3 i32.and i32.or i32.store offset=4 - local.get $2 + 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.store offset=8 + i32.const 2512 + i32.load + i32.gt_u + if + i32.const 1280 + i32.const 1344 + i32.const 21 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 2 + i32.shl + i32.const 2516 + 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 @@ -785,10 +839,10 @@ if unreachable end - i32.const 34544 + i32.const 35344 i32.const 0 i32.store - i32.const 36112 + i32.const 36912 i32.const 0 i32.store loop $for-loop|0 @@ -799,7 +853,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 34544 + i32.const 35344 i32.add i32.const 0 i32.store offset=4 @@ -817,7 +871,7 @@ i32.add i32.const 2 i32.shl - i32.const 34544 + i32.const 35344 i32.add i32.const 0 i32.store offset=96 @@ -835,14 +889,14 @@ br $for-loop|0 end end - i32.const 34544 - i32.const 36116 + i32.const 35344 + i32.const 36916 memory.size i64.extend_i32_s i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - i32.const 34544 + i32.const 35344 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -927,7 +981,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 34544 + i32.const 35336 i32.lt_u if local.get $0 @@ -1023,7 +1077,7 @@ unreachable end local.get $0 - i32.const 34544 + i32.const 35336 i32.lt_u if local.get $0 @@ -1046,7 +1100,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 34544 + i32.const 35336 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1438,21 +1492,32 @@ end local.get $1 ) - (func $~lib/rt/itcms/__new (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) (local $2 i32) + (local $3 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 1088 + i32.const 1152 + i32.const 261 + i32.const 31 + call $~lib/builtins/abort + unreachable + end global.get $~lib/rt/itcms/total global.get $~lib/rt/itcms/threshold i32.ge_u if block $__inlined_func$~lib/rt/itcms/interrupt$69 i32.const 2048 - local.set $1 + local.set $2 loop $do-loop|0 - local.get $1 + local.get $2 call $~lib/rt/itcms/step i32.sub - local.set $1 + local.set $2 global.get $~lib/rt/itcms/state i32.eqz if @@ -1468,7 +1533,7 @@ global.set $~lib/rt/itcms/threshold br $__inlined_func$~lib/rt/itcms/interrupt$69 end - local.get $1 + local.get $2 i32.const 0 i32.gt_s br_if $do-loop|0 @@ -1491,39 +1556,41 @@ call $~lib/rt/tlsf/initialize end global.get $~lib/rt/tlsf/ROOT - i32.const 24 - call $~lib/rt/tlsf/allocateBlock - local.tee $1 local.get $0 - i32.store offset=12 + i32.const 16 + i32.add + call $~lib/rt/tlsf/allocateBlock + local.tee $2 local.get $1 - i32.const 8 + i32.store offset=12 + local.get $2 + local.get $0 i32.store offset=16 global.get $~lib/rt/itcms/fromSpace - local.tee $2 + local.tee $1 i32.load offset=8 - local.set $0 - local.get $1 + local.set $3 local.get $2 + local.get $1 global.get $~lib/rt/itcms/white i32.or i32.store offset=4 - local.get $1 - local.get $0 + local.get $2 + local.get $3 i32.store offset=8 - local.get $0 - local.get $1 - local.get $0 + 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 $2 local.get $1 + local.get $2 i32.store offset=8 global.get $~lib/rt/itcms/total - local.get $1 + local.get $2 i32.load i32.const -4 i32.and @@ -1531,13 +1598,14 @@ i32.add i32.add global.set $~lib/rt/itcms/total - local.get $1 + local.get $2 i32.const 20 i32.add - local.tee $0 - i64.const 0 - i64.store align=1 + local.tee $1 + i32.const 0 local.get $0 + memory.fill + local.get $1 ) (func $closure/testClosureWrite~anonymous|0 (local $0 i32) @@ -1566,30 +1634,256 @@ i32.const 50 i32.store offset=4 ) - (func $start:closure + (func $closure/testCaptureInWhile~anonymous|0 (local $0 i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - global.get $~lib/memory/__stack_pointer - i32.const 16 - i32.sub - global.set $~lib/memory/__stack_pointer - block $folding-inner0 - global.get $~lib/memory/__stack_pointer - i32.const 1776 - i32.lt_s - br_if $folding-inner0 + global.get $$~lib/__closure_env + local.tee $0 + local.get $0 + i32.load offset=4 + local.get $0 + i32.load offset=8 + i32.add + i32.store offset=4 + ) + (func $closure/testCaptureInDoWhile~anonymous|0 + (local $0 i32) + global.get $$~lib/__closure_env + local.tee $0 + local.get $0 + i32.load offset=4 + local.get $0 + i32.load offset=8 + i32.mul + i32.store offset=4 + ) + (func $closure/testCaptureInSwitch~anonymous|0 + global.get $$~lib/__closure_env + i32.const 10 + i32.store offset=4 + ) + (func $closure/testCaptureInSwitch~anonymous|1 + global.get $$~lib/__closure_env + i32.const 20 + i32.store offset=4 + ) + (func $closure/testCaptureInSwitch~anonymous|2 + global.get $$~lib/__closure_env + i32.const 99 + i32.store offset=4 + ) + (func $closure/testCaptureInArrayLiteral~anonymous|1 (result i32) + global.get $$~lib/__closure_env + i32.load offset=8 + ) + (func $closure/testCaptureInArrayLiteral~anonymous|2 (result i32) + (local $0 i32) + global.get $$~lib/__closure_env + local.tee $0 + i32.load offset=4 + local.get $0 + i32.load offset=8 + i32.add + ) + (func $~lib/rt/itcms/__link (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 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 + local.tee $0 + i32.load offset=4 + i32.const 3 + i32.and + local.tee $3 + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + if + local.get $0 + local.get $1 + local.get $2 + select + call $~lib/rt/itcms/Object#makeGray + else + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq + local.get $3 + i32.const 3 + i32.eq + i32.and + if + local.get $1 + call $~lib/rt/itcms/Object#makeGray + end + end + end + ) + (func $closure/testNestedClosureCapture~anonymous|0~anonymous|0 (param $0 i32) (result i32) + global.get $$~lib/__closure_env + i32.load + i32.load offset=4 + i32.const 23 + i32.add + ) + (func $closure/testNestedClosureCapture~anonymous|0 (result i32) + (local $0 i32) + (local $1 i32) + global.get $$~lib/__closure_env + local.set $1 + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 8 + call $~lib/rt/tlsf/allocateBlock + i32.const 4 + i32.add + local.tee $0 + local.get $1 + i32.store + i32.const 8 + i32.const 9 + call $~lib/rt/itcms/__new + local.tee $1 + i32.const 18 + i32.store + local.get $1 + local.get $0 + i32.store offset=4 + local.get $1 + ) + (func $closure/testCaptureInTernary~anonymous|0 (result i32) + (local $0 i32) + global.get $$~lib/__closure_env + local.tee $0 + i32.load8_u offset=4 + if (result i32) + local.get $0 + i32.load offset=8 + else + local.get $0 + i32.load offset=12 + end + ) + (func $closure/testCaptureFromCondition~anonymous|0 (result i32) + (local $0 i32) + global.get $$~lib/__closure_env + local.tee $0 + i32.load offset=8 + local.get $0 + i32.load offset=4 + i32.gt_s + ) + (func $closure/testDeepLoopCapture~anonymous|0 + (local $0 i32) + global.get $$~lib/__closure_env + local.tee $0 + local.get $0 + i32.load offset=12 + local.get $0 + i32.load offset=4 + local.get $0 + i32.load offset=8 + i32.add + i32.add + i32.store offset=4 + ) + (func $closure/makeCounter~anonymous|0 (result i32) + (local $0 i32) + global.get $$~lib/__closure_env + local.tee $0 + local.get $0 + i32.load offset=4 + i32.const 1 + i32.add + i32.store offset=4 + local.get $0 + i32.load offset=4 + ) + (func $closure/makeCounter (result i32) + (local $0 i32) + (local $1 i32) + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 8 + call $~lib/rt/tlsf/allocateBlock + local.tee $1 + i32.const 4 + i32.add + local.tee $0 + i32.const 0 + i32.store + local.get $1 + i32.const 0 + i32.store offset=8 + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $1 + i32.const 24 + i32.store + local.get $1 + local.get $0 + i32.store offset=4 + local.get $1 + ) + (func $start:closure + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + global.get $~lib/memory/__stack_pointer + i32.const 36 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store + i32.const 2568 + i32.lt_s + br_if $folding-inner0 global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store offset=8 + i32.const 0 + i32.const 36 + memory.fill memory.size i32.const 16 i32.shl - i32.const 34544 + i32.const 35336 i32.sub i32.const 1 i32.shr_u @@ -1626,33 +1920,34 @@ global.get $~lib/rt/tlsf/ROOT i32.const 8 call $~lib/rt/tlsf/allocateBlock - local.tee $0 + local.tee $2 i32.const 4 i32.add - local.tee $1 + local.tee $3 i32.const 0 i32.store - local.get $0 + local.get $2 i32.const 42 i32.store offset=8 + i32.const 8 i32.const 4 call $~lib/rt/itcms/__new - local.tee $0 + local.tee $2 i32.const 1 i32.store - local.get $0 - local.get $1 + local.get $2 + local.get $3 i32.store offset=4 - local.get $0 + local.get $2 global.set $closure/fn1 global.get $~lib/memory/__stack_pointer global.get $closure/fn1 - local.tee $0 + local.tee $2 i32.store - local.get $0 + local.get $2 i32.load offset=4 global.set $$~lib/__closure_env - local.get $0 + local.get $2 i32.load call_indirect (type $0) i32.const 42 @@ -1673,33 +1968,34 @@ global.get $~lib/rt/tlsf/ROOT i32.const 8 call $~lib/rt/tlsf/allocateBlock - local.tee $0 + local.tee $2 i32.const 4 i32.add - local.tee $1 + local.tee $3 i32.const 0 i32.store - local.get $0 + local.get $2 i32.const 100 i32.store offset=8 + i32.const 8 i32.const 4 call $~lib/rt/itcms/__new - local.tee $0 + local.tee $2 i32.const 2 i32.store - local.get $0 - local.get $1 + local.get $2 + local.get $3 i32.store offset=4 - local.get $0 + local.get $2 global.set $closure/fn2 global.get $~lib/memory/__stack_pointer global.get $closure/fn2 - local.tee $0 + local.tee $2 i32.store offset=4 - local.get $0 + local.get $2 i32.load offset=4 global.set $$~lib/__closure_env - local.get $0 + local.get $2 i32.load call_indirect (type $0) i32.const 100 @@ -1720,33 +2016,34 @@ global.get $~lib/rt/tlsf/ROOT i32.const 8 call $~lib/rt/tlsf/allocateBlock - local.tee $0 + local.tee $2 i32.const 4 i32.add - local.tee $1 + local.tee $3 i32.const 0 i32.store - local.get $0 + local.get $2 i32.const 200 i32.store offset=8 + i32.const 8 i32.const 4 call $~lib/rt/itcms/__new - local.tee $0 + local.tee $2 i32.const 3 i32.store - local.get $0 - local.get $1 + local.get $2 + local.get $3 i32.store offset=4 - local.get $0 + local.get $2 global.set $closure/fn3 global.get $~lib/memory/__stack_pointer global.get $closure/fn3 - local.tee $0 + local.tee $2 i32.store offset=8 - local.get $0 + local.get $2 i32.load offset=4 global.set $$~lib/__closure_env - local.get $0 + local.get $2 i32.load call_indirect (type $0) i32.const 200 @@ -1764,7 +2061,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1776 + i32.const 2568 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1779,71 +2076,73 @@ global.get $~lib/rt/tlsf/ROOT i32.const 8 call $~lib/rt/tlsf/allocateBlock - local.tee $0 + local.tee $2 i32.const 4 i32.add - local.tee $1 + local.tee $3 i32.const 0 i32.store - local.get $0 + local.get $2 i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer + i32.const 8 i32.const 5 call $~lib/rt/itcms/__new - local.tee $2 + local.tee $4 i32.const 4 i32.store - local.get $2 - local.get $1 + local.get $4 + local.get $3 i32.store offset=4 - local.get $2 + local.get $4 i32.store global.get $~lib/memory/__stack_pointer + i32.const 8 i32.const 4 call $~lib/rt/itcms/__new - local.tee $3 + local.tee $5 i32.const 5 i32.store + local.get $5 local.get $3 - local.get $1 i32.store offset=4 - local.get $3 + local.get $5 i32.store offset=4 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store offset=8 - local.get $2 + local.get $4 i32.load offset=4 global.set $$~lib/__closure_env - local.get $2 + local.get $4 i32.load call_indirect (type $1) global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store offset=12 - local.get $2 + local.get $4 i32.load offset=4 global.set $$~lib/__closure_env - local.get $2 + local.get $4 i32.load call_indirect (type $1) global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store offset=16 - local.get $2 + local.get $4 i32.load offset=4 global.set $$~lib/__closure_env - local.get $2 + local.get $4 i32.load call_indirect (type $1) global.get $~lib/memory/__stack_pointer - local.get $3 + local.get $5 i32.store offset=20 - local.get $3 + local.get $5 i32.load offset=4 global.set $$~lib/__closure_env - local.get $3 + local.get $5 i32.load call_indirect (type $0) global.get $~lib/memory/__stack_pointer @@ -1868,39 +2167,40 @@ global.get $~lib/rt/tlsf/ROOT i32.const 16 call $~lib/rt/tlsf/allocateBlock - local.tee $0 + local.tee $2 i32.const 4 i32.add - local.tee $1 + local.tee $3 i32.const 0 i32.store - local.get $0 + local.get $2 i32.const 1 i32.store offset=8 - local.get $0 + local.get $2 i32.const 2 i32.store offset=12 - local.get $0 + local.get $2 i32.const 10 i32.store offset=16 + i32.const 8 i32.const 4 call $~lib/rt/itcms/__new - local.tee $0 + local.tee $2 i32.const 6 i32.store - local.get $0 - local.get $1 + local.get $2 + local.get $3 i32.store offset=4 - local.get $0 + local.get $2 global.set $closure/fn5 global.get $~lib/memory/__stack_pointer global.get $closure/fn5 - local.tee $0 + local.tee $2 i32.store offset=12 - local.get $0 + local.get $2 i32.load offset=4 global.set $$~lib/__closure_env - local.get $0 + local.get $2 i32.load call_indirect (type $0) i32.const 13 @@ -1918,7 +2218,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1776 + i32.const 2568 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1935,54 +2235,56 @@ global.get $~lib/rt/tlsf/ROOT i32.const 8 call $~lib/rt/tlsf/allocateBlock - local.tee $0 + local.tee $2 i32.const 4 i32.add - local.tee $1 + local.tee $3 i32.const 0 i32.store - local.get $0 + local.get $2 i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer + i32.const 8 i32.const 6 call $~lib/rt/itcms/__new - local.tee $2 + local.tee $4 i32.const 7 i32.store - local.get $2 - local.get $1 + local.get $4 + local.get $3 i32.store offset=4 - local.get $2 + local.get $4 i32.store global.get $~lib/memory/__stack_pointer + i32.const 8 i32.const 4 call $~lib/rt/itcms/__new - local.tee $3 + local.tee $5 i32.const 8 i32.store + local.get $5 local.get $3 - local.get $1 i32.store offset=4 - local.get $3 + local.get $5 i32.store offset=4 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $4 i32.store offset=8 - local.get $2 + local.get $4 i32.load offset=4 global.set $$~lib/__closure_env i32.const 50 - local.get $2 + local.get $4 i32.load call_indirect (type $2) global.get $~lib/memory/__stack_pointer - local.get $3 + local.get $5 i32.store offset=12 - local.get $3 + local.get $5 i32.load offset=4 global.set $$~lib/__closure_env - local.get $3 + local.get $5 i32.load call_indirect (type $0) global.get $~lib/memory/__stack_pointer @@ -2000,74 +2302,1701 @@ unreachable end global.get $~lib/memory/__stack_pointer - i32.const 16 - i32.add + i32.const 8 + i32.sub global.set $~lib/memory/__stack_pointer - return - end - i32.const 34576 - i32.const 34624 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - ) - (func $~lib/rt/__visit_members (param $0 i32) - block $folding-inner0 - block $invalid - 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 $folding-inner0 $invalid - end - return - end - return - end - return + global.get $~lib/memory/__stack_pointer + i32.const 2568 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 12 + call $~lib/rt/tlsf/allocateBlock + local.tee $2 + i32.const 4 + i32.add + local.tee $3 + i32.const 0 + i32.store + local.get $2 + i32.const 0 + i32.store offset=8 + local.get $2 + i32.const 0 + i32.store offset=12 + loop $while-continue|0 + local.get $2 + i32.load offset=12 + i32.const 3 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $5 + i32.const 9 + i32.store + local.get $5 + local.get $3 + i32.store offset=4 + local.get $5 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store offset=4 + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $1) + local.get $2 + local.get $2 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + br $while-continue|0 end - local.get $0 - i32.load - call $~lib/rt/itcms/__visit - return 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 1776 - i32.lt_s - if - i32.const 34576 - i32.const 34624 + local.get $2 + i32.load offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 70 + 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 2568 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 12 + call $~lib/rt/tlsf/allocateBlock + local.tee $2 + i32.const 4 + i32.add + local.tee $3 + i32.const 0 + i32.store + local.get $2 i32.const 1 + i32.store offset=8 + local.get $2 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=4 - call $~lib/rt/itcms/__visit - global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.store offset=12 + loop $do-loop|0 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $5 + i32.const 10 + i32.store + local.get $5 + local.get $3 + i32.store offset=4 + local.get $5 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store offset=4 + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $1) + local.get $2 + local.get $2 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + local.get $2 + i32.load offset=12 + i32.const 4 + i32.le_s + br_if $do-loop|0 + end + local.get $2 + i32.load offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 24 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 83 + 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 2568 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 12 + call $~lib/rt/tlsf/allocateBlock + local.tee $2 + i32.const 4 + i32.add + local.tee $3 + i32.const 0 + i32.store + local.get $2 + i32.const 0 + i32.store offset=8 + local.get $2 + i32.const 1 + i32.store offset=12 + loop $for-loop|0 + local.get $2 + i32.load offset=12 + i32.const 5 + i32.le_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $5 + i32.const 11 + i32.store + local.get $5 + local.get $3 + i32.store offset=4 + local.get $5 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $5 + i32.store offset=4 + local.get $5 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $5 + i32.load + call_indirect (type $1) + local.get $2 + local.get $2 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + br $for-loop|0 + end + end + local.get $2 + i32.load offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 15 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 94 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + call $closure/testCaptureInSwitch + i32.const 10 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 118 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 2 + call $closure/testCaptureInSwitch + i32.const 20 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 119 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 3 + call $closure/testCaptureInSwitch + i32.const 99 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 120 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2568 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 24 + memory.fill + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 12 + call $~lib/rt/tlsf/allocateBlock + local.tee $2 + i32.const 4 + i32.add + local.tee $3 + i32.const 0 + i32.store + local.get $2 + i32.const 5 + i32.store offset=8 + local.get $2 + i32.const 10 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 3 + i32.const 7 + i32.const 0 + call $~lib/rt/__newArray + local.tee $4 + i32.store + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $5 + i32.const 15 + i32.store + local.get $5 + local.get $3 + i32.store offset=4 + local.get $4 + i32.const 0 + local.get $5 + call $~lib/array/Array<%28%29=>i32>#__set + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $5 + i32.const 16 + i32.store + local.get $5 + local.get $3 + i32.store offset=4 + local.get $4 + i32.const 1 + local.get $5 + call $~lib/array/Array<%28%29=>i32>#__set + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $5 + i32.const 17 + i32.store + local.get $5 + local.get $3 + i32.store offset=4 + local.get $4 + i32.const 2 + local.get $5 + call $~lib/array/Array<%28%29=>i32>#__set + local.get $4 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.const 0 + call $~lib/array/Array<%28%29=>i32>#__get + local.tee $2 + i32.store offset=12 + local.get $2 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $2 + i32.load + call_indirect (type $0) + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.const 1 + call $~lib/array/Array<%28%29=>i32>#__get + local.tee $3 + i32.store offset=16 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $0) + local.get $2 + i32.add + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.const 2 + call $~lib/array/Array<%28%29=>i32>#__get + local.tee $3 + i32.store offset=20 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $0) + local.get $2 + i32.add + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 30 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 133 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + 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 2568 + i32.lt_s + br_if $folding-inner0 + 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/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 8 + call $~lib/rt/tlsf/allocateBlock + local.tee $2 + i32.const 4 + i32.add + local.tee $3 + i32.const 0 + i32.store + local.get $2 + i32.const 100 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 10 + call $~lib/rt/itcms/__new + local.tee $4 + i32.const 19 + i32.store + local.get $4 + local.get $3 + i32.store offset=4 + local.get $4 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.store offset=4 + local.get $4 + i32.load offset=4 + global.set $$~lib/__closure_env + global.get $~lib/memory/__stack_pointer + local.get $4 + i32.load + call_indirect (type $0) + local.tee $2 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=12 + local.get $2 + i32.load offset=4 + global.set $$~lib/__closure_env + i32.const 23 + local.get $2 + i32.load + call_indirect (type $5) + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 123 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 144 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + 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 2568 + i32.lt_s + br_if $folding-inner0 + 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/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 8 + call $~lib/rt/tlsf/allocateBlock + local.tee $4 + i32.const 4 + i32.add + local.tee $5 + i32.const 0 + i32.store + local.get $4 + i32.const 0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 11 + i32.const 2336 + call $~lib/rt/__newArray + local.tee $6 + i32.store + loop $for-loop|00 + local.get $1 + i32.const 3 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $2 + i32.const 20 + i32.store + local.get $2 + local.get $5 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=8 + 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 2568 + 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 $6 + i32.store + local.get $6 + local.get $6 + i32.load offset=12 + local.tee $3 + i32.const 1 + i32.add + local.tee $7 + call $~lib/array/ensureCapacity + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store + local.get $6 + i32.load offset=4 + local.get $3 + i32.const 2 + i32.shl + i32.add + local.get $2 + i32.store + local.get $6 + local.get $2 + i32.const 1 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store + local.get $6 + local.get $7 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|00 + end + end + loop $for-loop|1 + global.get $~lib/memory/__stack_pointer + local.get $6 + 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 2568 + 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 $6 + i32.store + local.get $6 + i32.load offset=12 + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + local.get $1 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + local.get $6 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $6 + local.get $0 + call $~lib/array/Array<%28%29=>i32>#__get + local.tee $1 + i32.store offset=12 + local.get $1 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $1 + i32.load + call_indirect (type $1) + local.get $0 + i32.const 1 + i32.add + local.set $0 + br $for-loop|1 + end + end + local.get $4 + i32.load offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 16 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 161 + 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 2568 + i32.lt_s + br_if $folding-inner0 + 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/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 16 + call $~lib/rt/tlsf/allocateBlock + local.tee $0 + i32.const 4 + i32.add + local.tee $1 + i32.const 0 + i32.store + local.get $0 + i32.const 1 + i32.store8 offset=8 + local.get $0 + i32.const 10 + i32.store offset=12 + local.get $0 + i32.const 20 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $3 + i32.const 21 + i32.store + local.get $3 + local.get $1 + i32.store offset=4 + local.get $3 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $0) + i32.const 10 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 170 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 0 + i32.store8 offset=8 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $0) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 20 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 174 + 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 2568 + i32.lt_s + br_if $folding-inner0 + 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/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 12 + call $~lib/rt/tlsf/allocateBlock + local.tee $0 + i32.const 4 + i32.add + local.tee $1 + i32.const 0 + i32.store + local.get $0 + i32.const 50 + i32.store offset=8 + local.get $0 + i32.const 75 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 12 + call $~lib/rt/itcms/__new + local.tee $3 + i32.const 22 + i32.store + local.get $3 + local.get $1 + i32.store offset=4 + local.get $3 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $0) + i32.eqz + if + i32.const 0 + i32.const 1488 + i32.const 182 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 25 + i32.store offset=12 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=8 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $0) + i32.const 0 + i32.ne + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + if + i32.const 0 + i32.const 1488 + 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 2568 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 16 + call $~lib/rt/tlsf/allocateBlock + local.tee $0 + i32.const 4 + i32.add + local.tee $1 + i32.const 0 + i32.store + local.get $0 + i32.const 0 + i32.store offset=8 + local.get $0 + i32.const 0 + i32.store offset=12 + loop $for-loop|01 + local.get $0 + i32.load offset=12 + i32.const 2 + i32.lt_s + if + local.get $0 + i32.const 0 + i32.store offset=16 + loop $for-loop|12 + local.get $0 + i32.load offset=16 + i32.const 2 + i32.lt_s + if + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $3 + i32.const 23 + i32.store + local.get $3 + local.get $1 + i32.store offset=4 + local.get $3 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $3 + i32.load + call_indirect (type $1) + local.get $0 + local.get $0 + i32.load offset=16 + i32.const 1 + i32.add + i32.store offset=16 + br $for-loop|12 + end + end + local.get $0 + local.get $0 + i32.load offset=12 + i32.const 1 + i32.add + i32.store offset=12 + br $for-loop|01 + end + end + local.get $0 + i32.load offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 4 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 200 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/makeCounter + global.set $closure/counter1 + call $closure/makeCounter + global.set $closure/counter2 + global.get $~lib/memory/__stack_pointer + global.get $closure/counter1 + local.tee $0 + i32.store offset=16 + local.get $0 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $0 + i32.load + call_indirect (type $0) + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 212 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $closure/counter1 + local.tee $0 + i32.store offset=20 + local.get $0 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $0 + i32.load + call_indirect (type $0) + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 213 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $closure/counter2 + local.tee $0 + i32.store offset=24 + local.get $0 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $0 + i32.load + call_indirect (type $0) + i32.const 1 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 214 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $closure/counter1 + local.tee $0 + i32.store offset=28 + local.get $0 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $0 + i32.load + call_indirect (type $0) + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 215 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + global.get $closure/counter2 + local.tee $0 + i32.store offset=32 + local.get $0 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $0 + i32.load + call_indirect (type $0) + i32.const 2 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 216 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 36 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 35360 + i32.const 35408 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~lib/array/Array<%28%29=>i32>~visit (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 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 2568 + i32.lt_s + if + i32.const 35360 + i32.const 35408 + 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=4 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $1 + local.get $0 + i32.load offset=12 + i32.const 2 + i32.shl + i32.add + local.set $2 + loop $while-continue|0 + local.get $1 + local.get $2 + i32.lt_u + if + local.get $1 + i32.load + local.tee $3 + if + local.get $3 + call $~lib/rt/itcms/__visit + end + local.get $1 + i32.const 4 + i32.add + local.set $1 + br $while-continue|0 + end + end + 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 + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $folding-inner1 + block $folding-inner0 + block $invalid + block $~lib/array/Array<%28%29=>void> + block $~lib/array/Array + block $~lib/array/Array<%28%29=>i32> + 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 $folding-inner0 $~lib/array/Array<%28%29=>i32> $~lib/array/Array $folding-inner0 $folding-inner0 $~lib/array/Array<%28%29=>void> $folding-inner0 $invalid + end + return + end + return + end + return + end + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + return + end + local.get $0 + call $~lib/array/Array<%28%29=>i32>~visit + 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 2568 + i32.lt_s + br_if $folding-inner1 + 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 + local.get $0 + call $~lib/array/Array<%28%29=>i32>~visit + return + 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 2568 + i32.lt_s + br_if $folding-inner1 + 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=4 + call $~lib/rt/itcms/__visit + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 35360 + i32.const 35408 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~start + call $start:closure + ) + (func $~lib/array/ensureCapacity (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 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 2568 + i32.lt_s + if + i32.const 35360 + i32.const 35408 + 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=8 + local.tee $2 + i32.const 2 + i32.shr_u + i32.gt_u + if + local.get $1 + i32.const 268435455 + i32.gt_u + if + i32.const 2096 + i32.const 2048 + i32.const 19 + i32.const 48 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + block $__inlined_func$~lib/rt/itcms/__renew$191 + i32.const 1073741820 + local.get $2 + i32.const 1 + i32.shl + local.tee $2 + local.get $2 + i32.const 1073741820 + i32.ge_u + select + local.tee $2 + i32.const 8 + local.get $1 + local.get $1 + i32.const 8 + i32.le_u + select + i32.const 2 + i32.shl + local.tee $1 + local.get $1 + local.get $2 + i32.lt_u + select + local.tee $3 + local.get $0 + i32.load + local.tee $2 + i32.const 20 + i32.sub + local.tee $4 + i32.load + i32.const -4 + i32.and + i32.const 16 + i32.sub + i32.le_u + if + local.get $4 + local.get $3 + i32.store offset=16 + local.get $2 + local.set $1 + br $__inlined_func$~lib/rt/itcms/__renew$191 + end + local.get $3 + local.get $4 + i32.load offset=12 + call $~lib/rt/itcms/__new + local.tee $1 + local.get $2 + local.get $3 + local.get $4 + i32.load offset=16 + local.tee $4 + local.get $3 + local.get $4 + i32.lt_u + select + memory.copy + end + local.get $1 + local.get $2 + i32.ne + if + local.get $0 + local.get $1 + i32.store + local.get $0 + local.get $1 + i32.store offset=4 + local.get $0 + local.get $1 + i32.const 0 + call $~lib/rt/itcms/__link + end + local.get $0 + local.get $3 + 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<%28%29=>i32>#__set (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 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 2568 + i32.lt_s + if + i32.const 35360 + i32.const 35408 + 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 + local.get $1 + i32.const 0 + i32.lt_s + if + i32.const 1280 + i32.const 2048 + i32.const 130 + i32.const 22 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + i32.const 1 + i32.add + local.tee $3 + call $~lib/array/ensureCapacity + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + local.get $3 + 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 + local.get $0 + local.get $2 + i32.const 1 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + i32.const 4 i32.add global.set $~lib/memory/__stack_pointer ) - (func $~start - call $start:closure + (func $~lib/array/Array<%28%29=>i32>#__get (param $0 i32) (param $1 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 2568 + i32.lt_s + if + i32.const 35360 + i32.const 35408 + 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 + local.get $0 + i32.store + local.get $1 + local.get $0 + i32.load offset=12 + i32.ge_u + if + i32.const 1280 + i32.const 2048 + i32.const 114 + i32.const 42 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.load offset=4 + local.get $1 + i32.const 2 + i32.shl + i32.add + i32.load + local.tee $0 + i32.store offset=4 + local.get $0 + i32.eqz + if + i32.const 2144 + i32.const 2048 + i32.const 118 + i32.const 40 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) + (func $closure/testCaptureInSwitch (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2568 + i32.lt_s + if + i32.const 35360 + i32.const 35408 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 24 + memory.fill + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 8 + call $~lib/rt/tlsf/allocateBlock + local.tee $2 + i32.const 4 + i32.add + local.tee $1 + i32.const 0 + i32.store + local.get $2 + i32.const 0 + i32.store offset=8 + block $break|0 + block $case2|0 + block $case1|0 + local.get $0 + i32.const 1 + i32.ne + if + local.get $0 + i32.const 2 + i32.eq + br_if $case1|0 + br $case2|0 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $0 + i32.const 12 + i32.store + local.get $0 + local.get $1 + i32.store offset=4 + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + br $break|0 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $0 + i32.const 13 + i32.store + local.get $0 + local.get $1 + i32.store offset=4 + local.get $0 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=12 + br $break|0 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $0 + i32.const 14 + i32.store + local.get $0 + local.get $1 + i32.store offset=4 + local.get $0 + i32.store offset=16 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=20 + end + local.get $0 + i32.load offset=4 + global.set $$~lib/__closure_env + local.get $0 + i32.load + call_indirect (type $1) + local.get $2 + i32.load offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 24 + i32.add + global.set $~lib/memory/__stack_pointer + ) + (func $~lib/rt/__newArray (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 2568 + i32.lt_s + if + i32.const 35360 + i32.const 35408 + 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.const 2 + i32.shl + local.tee $4 + i32.const 1 + call $~lib/rt/itcms/__new + local.set $3 + local.get $2 + if + local.get $3 + local.get $2 + local.get $4 + memory.copy + end + local.get $3 + i32.store + i32.const 16 + local.get $1 + call $~lib/rt/itcms/__new + local.tee $1 + local.get $3 + i32.store + local.get $1 + local.get $3 + i32.const 0 + call $~lib/rt/itcms/__link + local.get $1 + local.get $3 + i32.store offset=4 + local.get $1 + local.get $4 + i32.store offset=8 + local.get $1 + local.get $0 + i32.store offset=12 + 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/closure.ts b/tests/compiler/closure.ts index 0446ab5aa1..4ca450e29a 100644 --- a/tests/compiler/closure.ts +++ b/tests/compiler/closure.ts @@ -51,3 +51,166 @@ function testSharedEnvironment(): i32 { return getter(); } assert(testSharedEnvironment() == 50); + +// ============================================================================ +// Tests for closure capture from various control flow constructs +// ============================================================================ + +// Test 7: Capture from while loop +function testCaptureInWhile(): i32 { + let sum = 0; + let i = 0; + while (i < 3) { + let adder = (): void => { sum = sum + i; }; + adder(); + i++; + } + return sum; // 0 + 1 + 2 = 3 +} +assert(testCaptureInWhile() == 3); + +// Test 8: Capture from do-while loop +function testCaptureInDoWhile(): i32 { + let product = 1; + let i = 1; + do { + let multiplier = (): void => { product = product * i; }; + multiplier(); + i++; + } while (i <= 4); + return product; // 1 * 1 * 2 * 3 * 4 = 24 +} +assert(testCaptureInDoWhile() == 24); + +// Test 9: Capture from for loop +function testCaptureInFor(): i32 { + let result = 0; + for (let i = 1; i <= 5; i++) { + let addI = (): void => { result = result + i; }; + addI(); + } + return result; // 1 + 2 + 3 + 4 + 5 = 15 +} +assert(testCaptureInFor() == 15); + +// Test 10: Capture from switch statement +function testCaptureInSwitch(x: i32): i32 { + let captured = 0; + switch (x) { + case 1: { + let setCaptured = (): void => { captured = 10; }; + setCaptured(); + break; + } + case 2: { + let setCaptured = (): void => { captured = 20; }; + setCaptured(); + break; + } + default: { + let setCaptured = (): void => { captured = 99; }; + setCaptured(); + break; + } + } + return captured; +} +assert(testCaptureInSwitch(1) == 10); +assert(testCaptureInSwitch(2) == 20); +assert(testCaptureInSwitch(3) == 99); + +// Test 11: Capture from array literal +function testCaptureInArrayLiteral(): i32 { + let x = 5; + let y = 10; + let fns = [ + (): i32 => x, + (): i32 => y, + (): i32 => x + y + ]; + return fns[0]() + fns[1]() + fns[2](); // 5 + 10 + 15 = 30 +} +assert(testCaptureInArrayLiteral() == 30); + +// Test 12: Closure returning closure (nested capture) +function testNestedClosureCapture(): i32 { + let outer = 100; + let makeAdder = (): (y: i32) => i32 => { + return (y: i32): i32 => outer + y; + }; + let adder = makeAdder(); + return adder(23); // 100 + 23 = 123 +} +assert(testNestedClosureCapture() == 123); + +// Test 13: Multiple closures in array capturing same variable +function testMultipleClosuresInArray(): i32 { + let shared = 0; + let incrementers: Array<() => void> = []; + + for (let i = 0; i < 3; i++) { + incrementers.push((): void => { shared = shared + 1; }); + } + + for (let i = 0; i < incrementers.length; i++) { + incrementers[i](); + } + + return shared; // Should be 3 +} +assert(testMultipleClosuresInArray() == 3); + +// Test 14: Closure with ternary expression using captured variable +function testCaptureInTernary(): i32 { + let flag = true; + let a = 10; + let b = 20; + let chooser = (): i32 => flag ? a : b; + + assert(chooser() == 10); + flag = false; + return chooser(); // Should be 20 now +} +assert(testCaptureInTernary() == 20); + +// Test 15: Closure capturing from condition expression +function testCaptureFromCondition(): i32 { + let threshold = 50; + let value = 75; + let isAboveThreshold = (): bool => value > threshold; + + assert(isAboveThreshold() == true); + value = 25; + return isAboveThreshold() ? 1 : 0; // Should be 0 +} +assert(testCaptureFromCondition() == 0); + +// Test 16: Deeply nested loops with closure +function testDeepLoopCapture(): i32 { + let total = 0; + for (let i = 0; i < 2; i++) { + for (let j = 0; j < 2; j++) { + let addBoth = (): void => { total = total + i + j; }; + addBoth(); + } + } + // i=0,j=0: +0, i=0,j=1: +1, i=1,j=0: +1, i=1,j=1: +2 = 4 + return total; +} +assert(testDeepLoopCapture() == 4); + +// Test 17: Closure capturing counter pattern +function makeCounter(): () => i32 { + let count = 0; + return (): i32 => { + count = count + 1; + return count; + }; +} +let counter1 = makeCounter(); +let counter2 = makeCounter(); +assert(counter1() == 1); +assert(counter1() == 2); +assert(counter2() == 1); // Independent counter +assert(counter1() == 3); +assert(counter2() == 2); From 17e08b132c74294bb287a833a2366a20923eca58 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:09:21 -0500 Subject: [PATCH 2/4] Nitpick: extra $ Replaces all occurrences of the closure environment global variable from '$$~lib/__closure_env' to '$~lib/__closure_env' in the compiler source and test files. This change ensures consistency in global naming and avoids the use of double dollar signs. --- src/compiler.ts | 6 +- tests/compiler/closure-stress.debug.wat | 392 +++++++++++----------- tests/compiler/closure-stress.release.wat | 346 +++++++++---------- tests/compiler/closure.debug.wat | 114 +++---- tests/compiler/closure.release.wat | 96 +++--- 5 files changed, 477 insertions(+), 477 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 1c3edbbed1..218241ee6e 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -1852,7 +1852,7 @@ export class Compiler extends DiagnosticEmitter { // For closures (functions that capture from outer scope), create a local to cache // the environment pointer. This is needed because indirect calls to other closures - // can overwrite the global $$~lib/__closure_env. + // can overwrite the global $~lib/__closure_env. if (instance.outerFunction && !instance.closureEnvLocal) { let closureEnvLocal = flow.addScopedLocal("$closureEnv", this.options.usizeType); instance.closureEnvLocal = closureEnvLocal; @@ -1898,7 +1898,7 @@ export class Compiler extends DiagnosticEmitter { // For closures (functions that capture from outer scope), emit code to cache the // environment pointer in a local at function entry. This is needed because indirect - // calls to other closures can overwrite the global $$~lib/__closure_env. + // calls to other closures can overwrite the global $~lib/__closure_env. if (instance.closureEnvLocal) { let closureEnvLocal = instance.closureEnvLocal; @@ -6725,7 +6725,7 @@ export class Compiler extends DiagnosticEmitter { /** Ensures the closure environment global variable exists. */ ensureClosureEnvironmentGlobal(): string { - let name = "$~lib/__closure_env"; + let name = "~lib/__closure_env"; if (!this.closureEnvironmentGlobal) { let module = this.module; let sizeTypeRef = this.options.sizeTypeRef; diff --git a/tests/compiler/closure-stress.debug.wat b/tests/compiler/closure-stress.debug.wat index 989f4d7ded..2a313fb5cc 100644 --- a/tests/compiler/closure-stress.debug.wat +++ b/tests/compiler/closure-stress.debug.wat @@ -19,7 +19,7 @@ (type $17 (func (param i32 i32 i32 i32 i32 i32 i32 i32) (result i32))) (type $18 (func (param i32 i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $$~lib/__closure_env (mut i32) (i32.const 0)) + (global $~lib/__closure_env (mut i32) (i32.const 0)) (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)) @@ -157,7 +157,7 @@ (start $~start) (func $closure-stress/captureI32Param~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2389,7 +2389,7 @@ ) (func $closure-stress/captureI64Param~anonymous|0 (result i64) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i64.load offset=8 @@ -2421,7 +2421,7 @@ ) (func $closure-stress/captureF32Param~anonymous|0 (result f32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv f32.load offset=4 @@ -2453,7 +2453,7 @@ ) (func $closure-stress/captureF64Param~anonymous|0 (result f64) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv f64.load offset=8 @@ -2485,7 +2485,7 @@ ) (func $closure-stress/captureBool~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load8_u offset=4 @@ -2517,7 +2517,7 @@ ) (func $closure-stress/captureMultipleI32~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2561,7 +2561,7 @@ ) (func $closure-stress/captureMixedTypes~anonymous|0 (result f64) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2614,7 +2614,7 @@ ) (func $closure-stress/capture8Params~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2688,7 +2688,7 @@ ) (func $closure-stress/captureParamsAndLocals~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2740,7 +2740,7 @@ ) (func $closure-stress/makeCounter~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2780,7 +2780,7 @@ ) (func $closure-stress/testBidirectionalMutation~anonymous|0 (param $x i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $x @@ -2788,14 +2788,14 @@ ) (func $closure-stress/testBidirectionalMutation~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/testSharedMutation~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2806,7 +2806,7 @@ ) (func $closure-stress/testSharedMutation~anonymous|1 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2817,14 +2817,14 @@ ) (func $closure-stress/testSharedMutation~anonymous|2 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/testOuterScopeMutation~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2835,14 +2835,14 @@ ) (func $closure-stress/testOuterScopeMutation~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/curriedAdd~anonymous|0 (param $b i32) (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2876,7 +2876,7 @@ ) (func $closure-stress/makeGreaterThan~anonymous|0 (param $x i32) (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $x local.get $$closureEnv @@ -3002,7 +3002,7 @@ ) (func $closure-stress/simpleClosureArray~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -3075,35 +3075,35 @@ ) (func $closure-stress/simpleClosureArray~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 ) (func $closure-stress/simpleClosureArray~anonymous|2 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=12 ) (func $closure-stress/closureInConditional~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/closureInConditional~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 ) (func $closure-stress/closureEscapingBlock~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -3151,7 +3151,7 @@ ) (func $closure-stress/testMapWithClosure~anonymous|0 (param $x i32) (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $x local.get $$closureEnv @@ -3160,7 +3160,7 @@ ) (func $closure-stress/testFilterWithClosure~anonymous|0 (param $x i32) (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $x local.get $$closureEnv @@ -3174,7 +3174,7 @@ ) (func $closure-stress/testReduceWithClosure~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 @@ -3184,7 +3184,7 @@ ) (func $closure-stress/makeAdder~anonymous|0 (param $x i32) (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $x local.get $$closureEnv @@ -3218,7 +3218,7 @@ ) (func $closure-stress/makeMultiplier~anonymous|0 (param $x i32) (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $x local.get $$closureEnv @@ -3484,7 +3484,7 @@ ) (func $closure-stress/captureOnlyNoParams~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -3497,21 +3497,21 @@ ) (func $closure-stress/multipleClosureReturns~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/multipleClosureReturns~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 ) (func $closure-stress/multipleClosureReturns~anonymous|2 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=12 @@ -3622,7 +3622,7 @@ ) (func $closure-stress/captureSmallTypes~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load8_s offset=4 @@ -3638,7 +3638,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3649,7 +3649,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|1 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3660,7 +3660,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|2 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3671,7 +3671,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|3 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3682,7 +3682,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|4 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3693,14 +3693,14 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|5 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/manyCaptures~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -3740,7 +3740,7 @@ ) (func $closure-stress/simpleIIFE~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -3750,7 +3750,7 @@ ) (func $closure-stress/captureLoopValue~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -3782,14 +3782,14 @@ ) (func $closure-stress/interleavedClosures~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/interleavedClosures~anonymous|1 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3800,7 +3800,7 @@ ) (func $closure-stress/interleavedClosures~anonymous|2 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3811,7 +3811,7 @@ ) (func $closure-stress/interleavedClosures~anonymous|3 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -3822,7 +3822,7 @@ ) (func $closure-stress/captureString~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -3946,14 +3946,14 @@ ) (func $closure-stress/mutateStringRef~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/testNestedClosureFunctions~anonymous|0~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load @@ -3970,7 +3970,7 @@ ) (func $closure-stress/testRangeWithClosure~anonymous|0 (param $i i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -4006,7 +4006,7 @@ i32.store local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $5) @@ -4024,7 +4024,7 @@ ) (func $closure-stress/add~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -4062,14 +4062,14 @@ ) (func $closure-stress/testTwoClosuresSameVar~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure-stress/testTwoClosuresSameVar~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -4083,7 +4083,7 @@ ) (func $closure-stress/testDeeplyNestedClosures~anonymous|0~anonymous|0~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load @@ -4100,7 +4100,7 @@ ) (func $closure-stress/makeAdderPair~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -4114,7 +4114,7 @@ ) (func $closure-stress/makeAdderPair~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -4986,7 +4986,7 @@ i32.store offset=12 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $0) @@ -5005,7 +5005,7 @@ i32.store offset=16 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -5025,7 +5025,7 @@ i32.store offset=20 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $0) @@ -5308,7 +5308,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5427,7 +5427,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -5450,7 +5450,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5528,7 +5528,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5665,7 +5665,7 @@ i32.store offset=12 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -5688,7 +5688,7 @@ i32.store offset=16 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -5700,7 +5700,7 @@ i32.store offset=20 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $0) @@ -5723,7 +5723,7 @@ i32.store offset=24 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $3) @@ -5735,7 +5735,7 @@ i32.store offset=28 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $0) @@ -5804,7 +5804,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5840,7 +5840,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5946,7 +5946,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $1) @@ -6199,7 +6199,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $1) @@ -6380,7 +6380,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $4) @@ -6517,7 +6517,7 @@ i32.store offset=16 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -7198,7 +7198,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 @@ -7237,7 +7237,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $1) @@ -7299,7 +7299,7 @@ i32.store offset=8 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $1) @@ -7335,7 +7335,7 @@ i32.store offset=12 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $1) @@ -7371,7 +7371,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $1) @@ -7407,7 +7407,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $1) @@ -7526,7 +7526,7 @@ i32.store offset=12 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -7762,7 +7762,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -7990,7 +7990,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -8013,7 +8013,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -8026,7 +8026,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -8039,7 +8039,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -8089,7 +8089,7 @@ i32.store offset=44 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $0) @@ -8102,7 +8102,7 @@ i32.store offset=48 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $0) @@ -8125,7 +8125,7 @@ i32.store offset=52 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $0) @@ -8148,7 +8148,7 @@ i32.store offset=56 local.get $13 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $13 i32.load call_indirect (type $0) @@ -8160,7 +8160,7 @@ i32.store offset=60 local.get $14 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $14 i32.load call_indirect (type $0) @@ -8251,7 +8251,7 @@ i32.store local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -8275,7 +8275,7 @@ i32.store offset=4 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -8299,7 +8299,7 @@ i32.store offset=8 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8323,7 +8323,7 @@ i32.store offset=12 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $9) @@ -8347,7 +8347,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $9) @@ -8371,7 +8371,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $10) @@ -8395,7 +8395,7 @@ i32.store offset=24 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $10) @@ -8419,7 +8419,7 @@ i32.store offset=28 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $7) @@ -8443,7 +8443,7 @@ i32.store offset=32 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $7) @@ -8467,7 +8467,7 @@ i32.store offset=36 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -8493,7 +8493,7 @@ i32.store offset=40 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $0) @@ -8521,7 +8521,7 @@ i32.store offset=44 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $0) @@ -8547,7 +8547,7 @@ i32.store offset=48 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $0) @@ -8574,7 +8574,7 @@ i32.store offset=52 local.get $13 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $13 i32.load call_indirect (type $7) @@ -8605,7 +8605,7 @@ i32.store offset=56 local.get $14 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $14 i32.load call_indirect (type $0) @@ -8630,7 +8630,7 @@ i32.store offset=60 local.get $15 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $15 i32.load call_indirect (type $0) @@ -8655,7 +8655,7 @@ i32.store offset=64 local.get $16 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $16 i32.load call_indirect (type $0) @@ -8678,7 +8678,7 @@ i32.store offset=68 local.get $17 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $17 i32.load call_indirect (type $0) @@ -8701,7 +8701,7 @@ i32.store offset=72 local.get $18 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $18 i32.load call_indirect (type $0) @@ -8726,7 +8726,7 @@ i32.store offset=76 local.get $19 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $19 i32.load call_indirect (type $0) @@ -8749,7 +8749,7 @@ i32.store offset=80 local.get $20 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $20 i32.load call_indirect (type $0) @@ -8812,7 +8812,7 @@ i32.store offset=84 local.get $21 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $21 i32.load call_indirect (type $1) @@ -8836,7 +8836,7 @@ i32.store offset=88 local.get $22 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $22 i32.load call_indirect (type $1) @@ -8863,7 +8863,7 @@ i32.store offset=92 local.get $23 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $23 i32.load call_indirect (type $1) @@ -8889,7 +8889,7 @@ i32.store offset=96 local.get $24 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $24 i32.load call_indirect (type $1) @@ -9043,7 +9043,7 @@ i32.store offset=100 local.get $25 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $25 i32.load call_indirect (type $1) @@ -9067,7 +9067,7 @@ i32.store offset=104 local.get $26 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $26 i32.load call_indirect (type $1) @@ -9091,7 +9091,7 @@ i32.store offset=112 local.get $27 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $27 i32.load call_indirect (type $1) @@ -9103,7 +9103,7 @@ i32.store offset=108 local.get $28 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $28 i32.load call_indirect (type $1) @@ -9133,7 +9133,7 @@ i32.store offset=116 local.get $29 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $29 i32.load call_indirect (type $1) @@ -9157,7 +9157,7 @@ i32.store offset=120 local.get $30 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $30 i32.load call_indirect (type $1) @@ -9181,7 +9181,7 @@ i32.store offset=128 local.get $31 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $31 i32.load call_indirect (type $1) @@ -9193,7 +9193,7 @@ i32.store offset=124 local.get $32 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $32 i32.load call_indirect (type $1) @@ -9231,7 +9231,7 @@ i32.store offset=140 local.get $33 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $33 i32.load call_indirect (type $1) @@ -9266,7 +9266,7 @@ i32.store offset=144 local.get $34 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $34 i32.load call_indirect (type $0) @@ -9314,7 +9314,7 @@ i32.store offset=148 local.get $35 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $35 i32.load call_indirect (type $0) @@ -9338,7 +9338,7 @@ i32.store offset=152 local.get $36 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $36 i32.load call_indirect (type $0) @@ -9362,7 +9362,7 @@ i32.store offset=156 local.get $37 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $37 i32.load call_indirect (type $0) @@ -9388,7 +9388,7 @@ i32.store offset=160 local.get $38 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $38 i32.load call_indirect (type $1) @@ -9412,7 +9412,7 @@ i32.store offset=164 local.get $39 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $39 i32.load call_indirect (type $1) @@ -9569,7 +9569,7 @@ i32.store offset=168 local.get $40 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $40 i32.load call_indirect (type $0) @@ -10117,7 +10117,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $5) @@ -10129,7 +10129,7 @@ i32.store offset=12 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -10153,7 +10153,7 @@ i32.store offset=16 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $5) @@ -10165,7 +10165,7 @@ i32.store offset=20 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -10188,7 +10188,7 @@ i32.store offset=24 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $0) @@ -10285,7 +10285,7 @@ i32.store offset=12 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $3) @@ -10297,7 +10297,7 @@ i32.store offset=16 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $3) @@ -10309,7 +10309,7 @@ i32.store offset=20 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $3) @@ -10321,7 +10321,7 @@ i32.store offset=24 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $3) @@ -10333,7 +10333,7 @@ i32.store offset=28 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $3) @@ -10345,7 +10345,7 @@ i32.store offset=32 local.get $13 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $13 i32.load call_indirect (type $3) @@ -10357,7 +10357,7 @@ i32.store offset=36 local.get $14 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $14 i32.load call_indirect (type $0) @@ -10436,7 +10436,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -10448,7 +10448,7 @@ i32.store offset=12 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -10471,7 +10471,7 @@ i32.store offset=16 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $3) @@ -10483,7 +10483,7 @@ i32.store offset=20 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -10506,7 +10506,7 @@ i32.store offset=24 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $0) @@ -10587,7 +10587,7 @@ i32.store offset=4 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -10652,7 +10652,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -10665,7 +10665,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -10772,7 +10772,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -10784,7 +10784,7 @@ i32.store offset=12 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -10796,7 +10796,7 @@ i32.store offset=16 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $3) @@ -10808,7 +10808,7 @@ i32.store offset=20 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -10833,7 +10833,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $x global.get $~lib/memory/__stack_pointer @@ -10845,7 +10845,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $1) @@ -10858,7 +10858,7 @@ i32.store local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $1) @@ -10960,7 +10960,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -10999,7 +10999,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -11069,7 +11069,7 @@ i32.store offset=4 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -11213,7 +11213,7 @@ i32.store offset=24 local.get $14 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $14 i32.load call_indirect (type $3) @@ -11225,7 +11225,7 @@ i32.store offset=28 local.get $15 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $15 i32.load call_indirect (type $3) @@ -11237,7 +11237,7 @@ i32.store offset=32 local.get $16 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $16 i32.load call_indirect (type $3) @@ -11249,7 +11249,7 @@ i32.store offset=36 local.get $17 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $17 i32.load call_indirect (type $3) @@ -11261,7 +11261,7 @@ i32.store offset=40 local.get $18 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $18 i32.load call_indirect (type $3) @@ -11273,7 +11273,7 @@ i32.store offset=44 local.get $19 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $19 i32.load call_indirect (type $0) @@ -11375,7 +11375,7 @@ i32.store offset=4 local.get $15 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $15 i32.load call_indirect (type $0) @@ -11429,7 +11429,7 @@ i32.store local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -11516,7 +11516,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -11542,7 +11542,7 @@ i32.store offset=16 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $3) @@ -11554,7 +11554,7 @@ i32.store offset=20 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $3) @@ -11580,7 +11580,7 @@ i32.store offset=28 local.get $13 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $13 i32.load call_indirect (type $3) @@ -11592,7 +11592,7 @@ i32.store offset=32 local.get $14 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $14 i32.load call_indirect (type $3) @@ -11604,7 +11604,7 @@ i32.store offset=36 local.get $15 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $15 i32.load call_indirect (type $3) @@ -11616,7 +11616,7 @@ i32.store offset=40 local.get $16 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $16 i32.load call_indirect (type $0) @@ -11674,7 +11674,7 @@ i32.store offset=4 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -11753,7 +11753,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $5) @@ -11766,7 +11766,7 @@ i32.store offset=12 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $5) @@ -11779,7 +11779,7 @@ i32.store offset=16 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $5) @@ -11791,7 +11791,7 @@ i32.store offset=20 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -11818,7 +11818,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv i32.const 8 call $~lib/rt/tlsf/__alloc @@ -11854,7 +11854,7 @@ i32.store offset=4 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -11915,7 +11915,7 @@ i32.store offset=4 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -11995,7 +11995,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -12020,7 +12020,7 @@ i32.store offset=12 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $0) @@ -12076,7 +12076,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv i32.const 16 call $~lib/rt/tlsf/__alloc @@ -12109,7 +12109,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -12137,7 +12137,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv i32.const 12 call $~lib/rt/tlsf/__alloc @@ -12170,7 +12170,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -12228,7 +12228,7 @@ i32.store offset=4 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) diff --git a/tests/compiler/closure-stress.release.wat b/tests/compiler/closure-stress.release.wat index 749605566c..fd81fb0f00 100644 --- a/tests/compiler/closure-stress.release.wat +++ b/tests/compiler/closure-stress.release.wat @@ -16,7 +16,7 @@ (type $14 (func (param f32) (result i32))) (type $15 (func (param f64) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $$~lib/__closure_env (mut i32) (i32.const 0)) + (global $~lib/__closure_env (mut i32) (i32.const 0)) (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)) @@ -234,7 +234,7 @@ (export "memory" (memory $0)) (start $~start) (func $closure-stress/captureI32Param~anonymous|0 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 ) (func $~lib/rt/itcms/visitRoots @@ -1770,7 +1770,7 @@ local.get $0 ) (func $closure-stress/captureI64Param~anonymous|0 (result i64) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i64.load offset=8 ) (func $closure-stress/captureI64Param (param $0 i64) (result i32) @@ -1805,7 +1805,7 @@ local.get $2 ) (func $closure-stress/captureF32Param~anonymous|0 (result f32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env f32.load offset=4 ) (func $closure-stress/captureF32Param (param $0 f32) (result i32) @@ -1840,7 +1840,7 @@ local.get $2 ) (func $closure-stress/captureF64Param~anonymous|0 (result f64) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env f64.load offset=8 ) (func $closure-stress/captureF64Param (param $0 f64) (result i32) @@ -1875,7 +1875,7 @@ local.get $2 ) (func $closure-stress/captureBool~anonymous|0 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load8_u offset=4 ) (func $closure-stress/captureBool (param $0 i32) (result i32) @@ -1911,7 +1911,7 @@ ) (func $closure-stress/captureMultipleI32~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=12 local.get $0 @@ -1960,7 +1960,7 @@ ) (func $closure-stress/captureMixedTypes~anonymous|0 (result f64) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 f64.convert_i32_s @@ -1978,7 +1978,7 @@ ) (func $closure-stress/capture8Params~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=32 local.get $0 @@ -2005,7 +2005,7 @@ ) (func $closure-stress/captureParamsAndLocals~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=16 local.get $0 @@ -2020,7 +2020,7 @@ ) (func $closure-stress/makeCounter~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2062,13 +2062,13 @@ local.get $1 ) (func $closure-stress/testBidirectionalMutation~anonymous|0 (param $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.get $0 i32.store offset=4 ) (func $closure-stress/testSharedMutation~anonymous|0 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2078,7 +2078,7 @@ ) (func $closure-stress/testSharedMutation~anonymous|1 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2088,7 +2088,7 @@ ) (func $closure-stress/testOuterScopeMutation~anonymous|0 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2097,14 +2097,14 @@ i32.store offset=4 ) (func $closure-stress/curriedAdd~anonymous|0 (param $0 i32) (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.get $0 i32.add ) (func $closure-stress/makeGreaterThan~anonymous|0 (param $0 i32) (result i32) local.get $0 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 i32.gt_s ) @@ -2168,22 +2168,22 @@ end ) (func $closure-stress/simpleClosureArray~anonymous|1 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=8 ) (func $closure-stress/simpleClosureArray~anonymous|2 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=12 ) (func $closure-stress/testMapWithClosure~anonymous|0 (param $0 i32) (result i32) local.get $0 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 i32.mul ) (func $closure-stress/testFilterWithClosure~anonymous|0 (param $0 i32) (result i32) local.get $0 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 i32.ge_s ) @@ -2194,7 +2194,7 @@ ) (func $closure-stress/testReduceWithClosure~anonymous|1 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=8 local.get $0 @@ -2203,7 +2203,7 @@ ) (func $closure-stress/makeAdder~anonymous|0 (param $0 i32) (result i32) local.get $0 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 i32.add ) @@ -2283,7 +2283,7 @@ ) (func $closure-stress/captureOnlyNoParams~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.get $0 @@ -2376,7 +2376,7 @@ ) (func $closure-stress/captureSmallTypes~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load16_u offset=8 local.get $0 @@ -2391,7 +2391,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|1 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2401,7 +2401,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|2 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2411,7 +2411,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|3 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2421,7 +2421,7 @@ ) (func $closure-stress/manyClosuresSameEnv~anonymous|4 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2431,7 +2431,7 @@ ) (func $closure-stress/manyCaptures~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=48 local.get $0 @@ -2469,14 +2469,14 @@ i32.add ) (func $closure-stress/simpleIIFE~anonymous|0 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 i32.const 9 i32.add ) (func $closure-stress/interleavedClosures~anonymous|2 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2486,7 +2486,7 @@ ) (func $closure-stress/interleavedClosures~anonymous|3 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -2495,13 +2495,13 @@ i32.store offset=4 ) (func $closure-stress/captureString~anonymous|0 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 ) (func $closure-stress/testNestedClosureFunctions~anonymous|0~anonymous|0 (result i32) (local $0 i32) (local $1 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load local.tee $1 @@ -2516,7 +2516,7 @@ ) (func $closure-stress/testRangeWithClosure~anonymous|0 (param $0 i32) (local $1 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 local.get $1 i32.load offset=4 @@ -2527,7 +2527,7 @@ (func $closure-stress/testDeeplyNestedClosures~anonymous|0~anonymous|0~anonymous|0 (result i32) (local $0 i32) (local $1 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load local.set $0 @@ -3362,7 +3362,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $0 @@ -3420,7 +3420,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -3501,7 +3501,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $0 @@ -3543,7 +3543,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $0 i32.store @@ -4051,7 +4051,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $2 i32.load offset=8 local.tee $1 @@ -4177,7 +4177,7 @@ i32.store offset=4 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 local.get $1 i32.load @@ -4387,7 +4387,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $4 i32.load offset=4 local.tee $2 @@ -4650,7 +4650,7 @@ i32.store local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4671,7 +4671,7 @@ i32.store offset=4 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4692,7 +4692,7 @@ i32.store offset=8 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4713,7 +4713,7 @@ i32.store offset=12 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $8) @@ -4734,7 +4734,7 @@ i32.store offset=16 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $8) @@ -4755,7 +4755,7 @@ i32.store offset=20 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $9) @@ -4776,7 +4776,7 @@ i32.store offset=24 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $9) @@ -4797,7 +4797,7 @@ i32.store offset=28 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $5) @@ -4818,7 +4818,7 @@ i32.store offset=32 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $5) @@ -4839,7 +4839,7 @@ i32.store offset=36 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4859,7 +4859,7 @@ i32.store offset=40 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4880,7 +4880,7 @@ i32.store offset=44 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4903,7 +4903,7 @@ i32.store offset=48 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4956,7 +4956,7 @@ i32.store offset=52 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $5) @@ -5021,7 +5021,7 @@ i32.store offset=56 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -5074,7 +5074,7 @@ i32.store offset=60 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -5096,7 +5096,7 @@ i32.store offset=64 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5116,7 +5116,7 @@ i32.store offset=68 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5136,7 +5136,7 @@ i32.store offset=72 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5158,7 +5158,7 @@ i32.store offset=76 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5178,7 +5178,7 @@ i32.store offset=80 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5251,7 +5251,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 10 local.get $4 i32.load @@ -5261,7 +5261,7 @@ i32.store offset=12 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -5280,7 +5280,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 20 local.get $4 i32.load @@ -5290,7 +5290,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -5309,7 +5309,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -5398,7 +5398,7 @@ i32.store offset=12 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -5407,7 +5407,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -5416,7 +5416,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -5425,7 +5425,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -5434,7 +5434,7 @@ i32.store offset=28 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -5443,7 +5443,7 @@ i32.store offset=32 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -5452,7 +5452,7 @@ i32.store offset=36 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -5529,7 +5529,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -5538,7 +5538,7 @@ i32.store offset=12 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -5557,7 +5557,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -5566,7 +5566,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -5585,7 +5585,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -5636,7 +5636,7 @@ i32.store offset=84 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 5 local.get $0 i32.load @@ -5657,7 +5657,7 @@ i32.store offset=88 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 20 local.get $0 i32.load @@ -5705,7 +5705,7 @@ i32.store offset=92 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 10 local.get $0 i32.load @@ -5725,7 +5725,7 @@ i32.store offset=96 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3 local.get $0 i32.load @@ -5847,7 +5847,7 @@ i32.store offset=12 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5863,7 +5863,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -5881,7 +5881,7 @@ i32.store offset=20 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -5972,7 +5972,7 @@ i32.store offset=4 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -5982,7 +5982,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -6075,7 +6075,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -6180,7 +6180,7 @@ i32.store offset=12 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -6199,7 +6199,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -6208,7 +6208,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -6227,7 +6227,7 @@ i32.store offset=24 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -6236,7 +6236,7 @@ i32.store offset=28 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -6371,7 +6371,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -6380,7 +6380,7 @@ i32.store offset=12 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -6389,7 +6389,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -6398,7 +6398,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -6535,7 +6535,7 @@ i32.store offset=8 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 local.get $2 local.get $6 @@ -6707,7 +6707,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $1) @@ -6910,7 +6910,7 @@ i32.store offset=4 i32.const 2772 i32.load - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 local.get $5 i32.const 2768 @@ -6948,7 +6948,7 @@ i32.store offset=16 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -6978,7 +6978,7 @@ i32.store offset=100 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3 local.get $0 i32.load @@ -6999,7 +6999,7 @@ i32.store offset=104 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3 local.get $0 i32.load @@ -7020,7 +7020,7 @@ i32.store offset=112 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 0 local.get $0 i32.load @@ -7031,7 +7031,7 @@ i32.store offset=108 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $1) @@ -7057,7 +7057,7 @@ i32.store offset=116 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 5 local.get $0 i32.load @@ -7078,7 +7078,7 @@ i32.store offset=120 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 5 local.get $0 i32.load @@ -7099,7 +7099,7 @@ i32.store offset=128 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 4 local.get $0 i32.load @@ -7110,7 +7110,7 @@ i32.store offset=124 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $1) @@ -7168,7 +7168,7 @@ i32.store offset=140 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3 local.get $0 i32.load @@ -7318,7 +7318,7 @@ i32.store offset=8 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 5 local.get $1 i32.load @@ -7349,7 +7349,7 @@ i32.store offset=12 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 5 local.get $1 i32.load @@ -7380,7 +7380,7 @@ i32.store offset=16 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3 local.get $1 i32.load @@ -7411,7 +7411,7 @@ i32.store offset=20 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 5 local.get $1 i32.load @@ -7457,7 +7457,7 @@ i32.store offset=144 i32.const 3172 i32.load - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3168 i32.load call_indirect (type $0) @@ -7518,7 +7518,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -7555,7 +7555,7 @@ i32.store offset=4 i32.const 3236 i32.load - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3232 i32.load call_indirect (type $0) @@ -7580,7 +7580,7 @@ i32.store offset=148 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -7601,7 +7601,7 @@ i32.store offset=152 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -7622,7 +7622,7 @@ i32.store offset=156 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -7643,7 +7643,7 @@ i32.store offset=160 i32.const 3364 i32.load - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 5 i32.const 3360 i32.load @@ -7664,7 +7664,7 @@ i32.store offset=164 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 6 local.get $0 i32.load @@ -7732,7 +7732,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -7857,7 +7857,7 @@ i32.store offset=24 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $2) @@ -7866,7 +7866,7 @@ i32.store offset=28 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -7875,7 +7875,7 @@ i32.store offset=32 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -7884,7 +7884,7 @@ i32.store offset=36 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -7893,7 +7893,7 @@ i32.store offset=40 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -7902,7 +7902,7 @@ i32.store offset=44 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -7997,7 +7997,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8056,7 +8056,7 @@ i32.store local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8164,7 +8164,7 @@ i32.store offset=12 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -8252,7 +8252,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -8273,7 +8273,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -8282,7 +8282,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -8303,7 +8303,7 @@ i32.store offset=28 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -8312,7 +8312,7 @@ i32.store offset=32 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -8321,7 +8321,7 @@ i32.store offset=36 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -8330,7 +8330,7 @@ i32.store offset=40 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8392,7 +8392,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8475,7 +8475,7 @@ i32.store offset=8 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 4032 local.get $2 i32.load @@ -8485,7 +8485,7 @@ i32.store offset=12 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 4064 local.get $2 i32.load @@ -8495,7 +8495,7 @@ i32.store offset=16 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 4096 local.get $2 i32.load @@ -8505,7 +8505,7 @@ i32.store offset=20 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -8573,7 +8573,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8653,7 +8653,7 @@ i32.store local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 local.get $2 i32.load @@ -8721,7 +8721,7 @@ i32.store offset=168 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -8796,7 +8796,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -8815,7 +8815,7 @@ i32.store offset=12 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -8901,7 +8901,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8959,7 +8959,7 @@ i32.store offset=16 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -8978,7 +8978,7 @@ i32.store offset=20 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -8988,7 +8988,7 @@ i32.store offset=24 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -8998,7 +8998,7 @@ i32.store offset=28 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -9040,7 +9040,7 @@ i32.store offset=44 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -9050,7 +9050,7 @@ i32.store offset=48 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -9069,7 +9069,7 @@ i32.store offset=52 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -9088,7 +9088,7 @@ i32.store offset=56 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -9098,7 +9098,7 @@ i32.store offset=60 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -9203,7 +9203,7 @@ i32.store offset=4 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -9234,14 +9234,14 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $2 i32.load offset=8 local.tee $1 i32.store offset=4 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 local.get $1 i32.load @@ -9253,7 +9253,7 @@ i32.store local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $1) @@ -9327,7 +9327,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $3 global.get $~lib/rt/tlsf/ROOT i32.eqz @@ -9365,7 +9365,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -9399,7 +9399,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $0 global.get $~lib/rt/tlsf/ROOT i32.eqz @@ -9435,7 +9435,7 @@ i32.store offset=4 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -9466,7 +9466,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $0 global.get $~lib/rt/tlsf/ROOT i32.eqz @@ -9502,7 +9502,7 @@ i32.store offset=4 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) diff --git a/tests/compiler/closure.debug.wat b/tests/compiler/closure.debug.wat index 058e3f55f4..54aa3b5e53 100644 --- a/tests/compiler/closure.debug.wat +++ b/tests/compiler/closure.debug.wat @@ -11,7 +11,7 @@ (type $9 (func (param i32 i32 i32) (result i32))) (type $10 (func (param i32 i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $$~lib/__closure_env (mut i32) (i32.const 0)) + (global $~lib/__closure_env (mut i32) (i32.const 0)) (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)) @@ -83,7 +83,7 @@ (start $~start) (func $closure/testCaptureParam~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2315,7 +2315,7 @@ ) (func $closure/testCaptureVar~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2348,7 +2348,7 @@ ) (func $closure/testCaptureLet~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2381,7 +2381,7 @@ ) (func $closure/testClosureWrite~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2392,14 +2392,14 @@ ) (func $closure/testClosureWrite~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure/testMultipleCaptures~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2444,7 +2444,7 @@ ) (func $closure/testSharedEnvironment~anonymous|0 (param $x i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $x @@ -2452,14 +2452,14 @@ ) (func $closure/testSharedEnvironment~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure/testCaptureInWhile~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2471,7 +2471,7 @@ ) (func $closure/testCaptureInDoWhile~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2483,7 +2483,7 @@ ) (func $closure/testCaptureInFor~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2495,7 +2495,7 @@ ) (func $closure/testCaptureInSwitch~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.const 10 @@ -2503,7 +2503,7 @@ ) (func $closure/testCaptureInSwitch~anonymous|1 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.const 20 @@ -2511,7 +2511,7 @@ ) (func $closure/testCaptureInSwitch~anonymous|2 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.const 99 @@ -2519,21 +2519,21 @@ ) (func $closure/testCaptureInArrayLiteral~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 ) (func $closure/testCaptureInArrayLiteral~anonymous|1 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 ) (func $closure/testCaptureInArrayLiteral~anonymous|2 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -2698,7 +2698,7 @@ ) (func $closure/testNestedClosureCapture~anonymous|0~anonymous|0 (param $y i32) (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load @@ -2710,7 +2710,7 @@ (local $$closureEnv i32) (local $$env i32) (local $2 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv i32.const 8 call $~lib/rt/tlsf/__alloc @@ -2733,7 +2733,7 @@ ) (func $closure/testMultipleClosuresInArray~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2757,7 +2757,7 @@ ) (func $closure/testCaptureInTernary~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load8_u offset=4 @@ -2771,7 +2771,7 @@ ) (func $closure/testCaptureFromCondition~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 @@ -2781,7 +2781,7 @@ ) (func $closure/testDeepLoopCapture~anonymous|0 (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2796,7 +2796,7 @@ ) (func $closure/makeCounter~anonymous|0 (result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $$closureEnv @@ -2881,7 +2881,7 @@ i32.store local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -2906,7 +2906,7 @@ i32.store offset=4 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -2931,7 +2931,7 @@ i32.store offset=8 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -2970,7 +2970,7 @@ i32.store offset=12 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3156,7 +3156,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -3179,7 +3179,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -3202,7 +3202,7 @@ i32.store offset=24 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -3225,7 +3225,7 @@ i32.store offset=28 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -3248,7 +3248,7 @@ i32.store offset=32 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $0) @@ -3860,7 +3860,7 @@ i32.store offset=12 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $0) @@ -3879,7 +3879,7 @@ i32.store offset=16 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -3899,7 +3899,7 @@ i32.store offset=20 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $0) @@ -4173,7 +4173,7 @@ i32.store offset=12 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -4570,7 +4570,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -4582,7 +4582,7 @@ i32.store offset=12 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -4594,7 +4594,7 @@ i32.store offset=16 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $3) @@ -4606,7 +4606,7 @@ i32.store offset=20 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -4685,7 +4685,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $4) @@ -4697,7 +4697,7 @@ i32.store offset=12 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -4765,7 +4765,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $3) @@ -4839,7 +4839,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $3) @@ -4921,7 +4921,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $3) @@ -5014,7 +5014,7 @@ i32.store offset=4 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -5042,7 +5042,7 @@ i32.store offset=12 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $3) @@ -5070,7 +5070,7 @@ i32.store offset=20 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $3) @@ -5191,7 +5191,7 @@ i32.store offset=4 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -5206,7 +5206,7 @@ i32.store offset=12 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $1) @@ -5276,7 +5276,7 @@ i32.store offset=4 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -5302,7 +5302,7 @@ i32.store offset=8 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -5368,7 +5368,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -5396,7 +5396,7 @@ i32.store offset=8 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $0) @@ -5479,7 +5479,7 @@ i32.store offset=4 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) diff --git a/tests/compiler/closure.release.wat b/tests/compiler/closure.release.wat index 01dd39220d..61d1e2e52b 100644 --- a/tests/compiler/closure.release.wat +++ b/tests/compiler/closure.release.wat @@ -10,7 +10,7 @@ (type $8 (func (param i32 i32 i64))) (type $9 (func (param i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $$~lib/__closure_env (mut i32) (i32.const 0)) + (global $~lib/__closure_env (mut i32) (i32.const 0)) (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)) @@ -105,7 +105,7 @@ (export "memory" (memory $0)) (start $~start) (func $closure/testCaptureParam~anonymous|0 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 ) (func $~lib/rt/itcms/visitRoots @@ -1609,7 +1609,7 @@ ) (func $closure/testClosureWrite~anonymous|0 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -1619,7 +1619,7 @@ ) (func $closure/testMultipleCaptures~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=12 local.get $0 @@ -1630,13 +1630,13 @@ i32.add ) (func $closure/testSharedEnvironment~anonymous|0 (param $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.const 50 i32.store offset=4 ) (func $closure/testCaptureInWhile~anonymous|0 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -1647,7 +1647,7 @@ ) (func $closure/testCaptureInDoWhile~anonymous|0 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -1657,27 +1657,27 @@ i32.store offset=4 ) (func $closure/testCaptureInSwitch~anonymous|0 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.const 10 i32.store offset=4 ) (func $closure/testCaptureInSwitch~anonymous|1 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.const 20 i32.store offset=4 ) (func $closure/testCaptureInSwitch~anonymous|2 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.const 99 i32.store offset=4 ) (func $closure/testCaptureInArrayLiteral~anonymous|1 (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=8 ) (func $closure/testCaptureInArrayLiteral~anonymous|2 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.get $0 @@ -1744,7 +1744,7 @@ end ) (func $closure/testNestedClosureCapture~anonymous|0~anonymous|0 (param $0 i32) (result i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load i32.load offset=4 i32.const 23 @@ -1753,7 +1753,7 @@ (func $closure/testNestedClosureCapture~anonymous|0 (result i32) (local $0 i32) (local $1 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $1 global.get $~lib/rt/tlsf/ROOT i32.eqz @@ -1781,7 +1781,7 @@ ) (func $closure/testCaptureInTernary~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load8_u offset=4 if (result i32) @@ -1794,7 +1794,7 @@ ) (func $closure/testCaptureFromCondition~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=8 local.get $0 @@ -1803,7 +1803,7 @@ ) (func $closure/testDeepLoopCapture~anonymous|0 (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=12 @@ -1817,7 +1817,7 @@ ) (func $closure/makeCounter~anonymous|0 (result i32) (local $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 local.get $0 i32.load offset=4 @@ -1946,7 +1946,7 @@ i32.store local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -1994,7 +1994,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -2042,7 +2042,7 @@ i32.store offset=8 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -2114,7 +2114,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $1) @@ -2123,7 +2123,7 @@ i32.store offset=12 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $1) @@ -2132,7 +2132,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $1) @@ -2141,7 +2141,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -2199,7 +2199,7 @@ i32.store offset=12 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -2273,7 +2273,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 50 local.get $4 i32.load @@ -2283,7 +2283,7 @@ i32.store offset=12 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -2355,7 +2355,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $1) @@ -2433,7 +2433,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $1) @@ -2519,7 +2519,7 @@ i32.store offset=4 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $1) @@ -2676,7 +2676,7 @@ i32.store offset=12 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -2692,7 +2692,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -2710,7 +2710,7 @@ i32.store offset=20 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -2778,7 +2778,7 @@ i32.store offset=4 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env global.get $~lib/memory/__stack_pointer local.get $4 i32.load @@ -2790,7 +2790,7 @@ i32.store offset=12 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 23 local.get $2 i32.load @@ -2961,7 +2961,7 @@ i32.store offset=12 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $1) @@ -3042,7 +3042,7 @@ i32.store offset=4 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3064,7 +3064,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3133,7 +3133,7 @@ i32.store offset=4 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3154,7 +3154,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3235,7 +3235,7 @@ i32.store offset=4 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $1) @@ -3283,7 +3283,7 @@ i32.store offset=16 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3303,7 +3303,7 @@ i32.store offset=20 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3323,7 +3323,7 @@ i32.store offset=24 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3343,7 +3343,7 @@ i32.store offset=28 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3363,7 +3363,7 @@ i32.store offset=32 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3924,7 +3924,7 @@ end local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $1) From 8379613183a1a0313a4b03b1f6a47e158731bb77 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:27:47 -0500 Subject: [PATCH 3/4] Fix closure capture for default parameter values Ensure that default values of function parameters are scanned for variable captures before parameter names are added to the inner function scope. This fixes issues where closures in default parameter expressions could not capture outer variables. Adds new tests for closures in default parameter values. --- src/compiler.ts | 40 +++- tests/compiler/closure.debug.wat | 358 ++++++++++++++++++++++++---- tests/compiler/closure.release.wat | 370 +++++++++++++++++++++++------ tests/compiler/closure.ts | 16 ++ 4 files changed, 673 insertions(+), 111 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 218241ee6e..5c1f1000fe 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -7719,6 +7719,13 @@ export class Compiler extends DiagnosticEmitter { let funcExpr = node; let decl = funcExpr.declaration; let params = decl.signature.parameters; + // Scan parameter default values for captures (before adding params to inner names) + for (let i = 0, k = params.length; i < k; i++) { + let paramInit = params[i].initializer; + if (paramInit) { + this.scanNodeForCaptures(paramInit, outerFlow, innerFunctionNames, captures); + } + } for (let i = 0, k = params.length; i < k; i++) { innerFunctionNames.add(params[i].name.text); } @@ -7940,8 +7947,16 @@ export class Compiler extends DiagnosticEmitter { let captures = new Map(); let innerFunctionNames = new Set(); - // Add the function's own parameters to the inner names set + // Scan parameter default values for captures (before adding params to inner names) let params = declaration.signature.parameters; + for (let i = 0, k = params.length; i < k; i++) { + let paramInit = params[i].initializer; + if (paramInit) { + this.scanNodeForCaptures(paramInit, outerFlow, innerFunctionNames, captures); + } + } + + // Add the function's own parameters to the inner names set for (let i = 0, k = params.length; i < k; i++) { innerFunctionNames.add(params[i].name.text); } @@ -8415,8 +8430,9 @@ export class Compiler extends DiagnosticEmitter { case NodeKind.Empty: break; - // Class expression - scan members would be complex, but class expressions with closures are rare + // Class expressions are not supported (will error during compilation) case NodeKind.Class: + // Constructor keyword - not a capturable expression case NodeKind.Constructor: break; @@ -8473,8 +8489,16 @@ export class Compiler extends DiagnosticEmitter { let capturedNames = new Map(); let innerFunctionNames = new Set(); - // Add the function's own parameters to the inner names set + // Scan parameter default values for captures (before adding params to inner names) let params = declaration.signature.parameters; + for (let i = 0, k = params.length; i < k; i++) { + let paramInit = params[i].initializer; + if (paramInit) { + this.collectCapturedNames(paramInit, innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } + + // Add the function's own parameters to the inner names set for (let i = 0, k = params.length; i < k; i++) { innerFunctionNames.add(params[i].name.text); } @@ -8639,6 +8663,13 @@ export class Compiler extends DiagnosticEmitter { let funcExpr = node; let decl = funcExpr.declaration; let params = decl.signature.parameters; + // Scan parameter default values for captures (before adding params to inner names) + for (let i = 0, k = params.length; i < k; i++) { + let paramInit = params[i].initializer; + if (paramInit) { + this.collectCapturedNames(paramInit, innerFunctionNames, outerFlow, declaredVars, capturedNames); + } + } // Add the nested function's params to inner names for (let i = 0, k = params.length; i < k; i++) { innerFunctionNames.add(params[i].name.text); @@ -8788,8 +8819,9 @@ export class Compiler extends DiagnosticEmitter { case NodeKind.Empty: break; - // Class expression - would need to scan members, but rare in closure context + // Class expressions are not supported (will error during compilation) case NodeKind.Class: + // Constructor keyword - not a capturable expression case NodeKind.Constructor: break; diff --git a/tests/compiler/closure.debug.wat b/tests/compiler/closure.debug.wat index 54aa3b5e53..3518b2bcb7 100644 --- a/tests/compiler/closure.debug.wat +++ b/tests/compiler/closure.debug.wat @@ -3,8 +3,8 @@ (type $1 (func (param i32) (result i32))) (type $2 (func (param i32 i32))) (type $3 (func)) - (type $4 (func (param i32))) - (type $5 (func (param i32 i32) (result i32))) + (type $4 (func (param i32 i32) (result i32))) + (type $5 (func (param i32))) (type $6 (func (param i32 i32 i32))) (type $7 (func (param i32 i32 i32 i32))) (type $8 (func (param i32 i32 i64) (result i32))) @@ -34,10 +34,10 @@ (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) (global $closure/counter1 (mut i32) (i32.const 0)) (global $closure/counter2 (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 1488)) - (global $~lib/memory/__data_end i32 (i32.const 1544)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34312)) - (global $~lib/memory/__heap_base i32 (i32.const 34312)) + (global $~lib/rt/__rtti_base i32 (i32.const 1552)) + (global $~lib/memory/__data_end i32 (i32.const 1616)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34384)) + (global $~lib/memory/__heap_base i32 (i32.const 34384)) (memory $0 1) (data $0 (i32.const 12) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") (data $1 (i32.const 44) "<\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") @@ -76,9 +76,11 @@ (data $34 (i32.const 1388) "\1c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\08\00\00\00\16\00\00\00\00\00\00\00\00\00\00\00") (data $35 (i32.const 1420) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\17\00\00\00\00\00\00\00\00\00\00\00") (data $36 (i32.const 1452) "\1c\00\00\00\00\00\00\00\00\00\00\00\04\00\00\00\08\00\00\00\18\00\00\00\00\00\00\00\00\00\00\00") - (data $37 (i32.const 1488) "\r\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02A\00\00\02\t\00\00\00\00\00\00\00\00\00\00\02A\00\00\00\00\00\00") - (table $0 25 25 funcref) - (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureVar~anonymous|0 $closure/testCaptureLet~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testClosureWrite~anonymous|1 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testSharedEnvironment~anonymous|1 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInDoWhile~anonymous|0 $closure/testCaptureInFor~anonymous|0 $closure/testCaptureInSwitch~anonymous|0 $closure/testCaptureInSwitch~anonymous|1 $closure/testCaptureInSwitch~anonymous|2 $closure/testCaptureInArrayLiteral~anonymous|0 $closure/testCaptureInArrayLiteral~anonymous|1 $closure/testCaptureInArrayLiteral~anonymous|2 $closure/testNestedClosureCapture~anonymous|0~anonymous|0 $closure/testNestedClosureCapture~anonymous|0 $closure/testMultipleClosuresInArray~anonymous|0 $closure/testCaptureInTernary~anonymous|0 $closure/testCaptureFromCondition~anonymous|0 $closure/testDeepLoopCapture~anonymous|0 $closure/makeCounter~anonymous|0) + (data $37 (i32.const 1484) "\1c\00\00\00\00\00\00\00\00\00\00\00\r\00\00\00\08\00\00\00\19\00\00\00\00\00\00\00\00\00\00\00") + (data $38 (i32.const 1516) "\1c\00\00\00\00\00\00\00\00\00\00\00\0e\00\00\00\08\00\00\00\1a\00\00\00\00\00\00\00\00\00\00\00") + (data $39 (i32.const 1552) "\0f\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02A\00\00\02\t\00\00\00\00\00\00\00\00\00\00\02A\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (table $0 27 27 funcref) + (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureVar~anonymous|0 $closure/testCaptureLet~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testClosureWrite~anonymous|1 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testSharedEnvironment~anonymous|1 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInDoWhile~anonymous|0 $closure/testCaptureInFor~anonymous|0 $closure/testCaptureInSwitch~anonymous|0 $closure/testCaptureInSwitch~anonymous|1 $closure/testCaptureInSwitch~anonymous|2 $closure/testCaptureInArrayLiteral~anonymous|0 $closure/testCaptureInArrayLiteral~anonymous|1 $closure/testCaptureInArrayLiteral~anonymous|2 $closure/testNestedClosureCapture~anonymous|0~anonymous|0 $closure/testNestedClosureCapture~anonymous|0 $closure/testMultipleClosuresInArray~anonymous|0 $closure/testCaptureInTernary~anonymous|0 $closure/testCaptureFromCondition~anonymous|0 $closure/testDeepLoopCapture~anonymous|0 $closure/makeCounter~anonymous|0 $closure/testDefaultParamCapture~anonymous|0@varargs $closure/testDefaultParamWithOtherParam~anonymous|0@varargs) (export "memory" (memory $0)) (start $~start) (func $closure/testCaptureParam~anonymous|0 (result i32) @@ -2834,6 +2836,18 @@ local.get $2 return ) + (func $closure/testDefaultParamCapture~anonymous|0 (param $x i32) (result i32) + (local $$closureEnv i32) + global.get $~lib/__closure_env + local.set $$closureEnv + local.get $x + ) + (func $closure/testDefaultParamWithOtherParam~anonymous|0 (param $a i32) (param $b i32) (result i32) + (local $$closureEnv i32) + global.get $~lib/__closure_env + local.set $$closureEnv + local.get $b + ) (func $start:closure (local $0 i32) (local $1 i32) @@ -3263,11 +3277,72 @@ call $~lib/builtins/abort unreachable end + call $closure/testDefaultParamCapture + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 224 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $closure/testDefaultParamWithOtherParam + i32.const 30 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 464 + i32.const 232 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer i32.const 36 i32.add global.set $~lib/memory/__stack_pointer ) + (func $closure/testDefaultParamCapture~anonymous|0@varargs (param $x i32) (result i32) + block $1of1 + block $0of1 + block $outOfRange + global.get $~argumentsLength + br_table $0of1 $1of1 $outOfRange + end + unreachable + end + global.get $~lib/__closure_env + i32.load offset=4 + local.set $x + end + local.get $x + call $closure/testDefaultParamCapture~anonymous|0 + ) + (func $closure/testDefaultParamWithOtherParam~anonymous|0@varargs (param $a i32) (param $b i32) (result i32) + block $1of1 + block $0of1 + block $outOfRange + global.get $~argumentsLength + i32.const 1 + i32.sub + br_table $0of1 $1of1 $outOfRange + end + unreachable + end + local.get $a + global.get $~lib/__closure_env + i32.load offset=4 + i32.mul + local.set $b + end + local.get $a + local.get $b + call $closure/testDefaultParamWithOtherParam~anonymous|0 + ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) i32.const 256 @@ -3403,81 +3478,117 @@ local.get $1 call $~lib/function/Function<%28%29=>bool>#__visit ) + (func $~lib/function/Function<%28i32?%29=>i32>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28i32?%29=>i32>~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/function/Function<%28i32?%29=>i32>#__visit + ) + (func $~lib/function/Function<%28i32%2Ci32?%29=>i32>#get:_env (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/function/Function<%28i32%2Ci32?%29=>i32>~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/function/Function<%28i32%2Ci32?%29=>i32>#__visit + ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $~lib/function/Function<%28%29=>bool> - block $~lib/array/Array<%28%29=>void> - block $~lib/function/Function<%28%29=>%28i32%29=>i32> - block $~lib/function/Function<%28i32%29=>i32> - block $~lib/array/Array - block $~lib/array/Array<%28%29=>i32> - block $~lib/function/Function<%28i32%29=>void> - block $~lib/function/Function<%28%29=>void> - block $~lib/function/Function<%28%29=>i32> - 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/function/Function<%28%29=>i32> $~lib/function/Function<%28%29=>void> $~lib/function/Function<%28i32%29=>void> $~lib/array/Array<%28%29=>i32> $~lib/array/Array $~lib/function/Function<%28i32%29=>i32> $~lib/function/Function<%28%29=>%28i32%29=>i32> $~lib/array/Array<%28%29=>void> $~lib/function/Function<%28%29=>bool> $invalid + block $~lib/function/Function<%28i32%2Ci32?%29=>i32> + block $~lib/function/Function<%28i32?%29=>i32> + block $~lib/function/Function<%28%29=>bool> + block $~lib/array/Array<%28%29=>void> + block $~lib/function/Function<%28%29=>%28i32%29=>i32> + block $~lib/function/Function<%28i32%29=>i32> + block $~lib/array/Array + block $~lib/array/Array<%28%29=>i32> + block $~lib/function/Function<%28i32%29=>void> + block $~lib/function/Function<%28%29=>void> + block $~lib/function/Function<%28%29=>i32> + 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/function/Function<%28%29=>i32> $~lib/function/Function<%28%29=>void> $~lib/function/Function<%28i32%29=>void> $~lib/array/Array<%28%29=>i32> $~lib/array/Array $~lib/function/Function<%28i32%29=>i32> $~lib/function/Function<%28%29=>%28i32%29=>i32> $~lib/array/Array<%28%29=>void> $~lib/function/Function<%28%29=>bool> $~lib/function/Function<%28i32?%29=>i32> $~lib/function/Function<%28i32%2Ci32?%29=>i32> $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/function/Function<%28%29=>i32>~visit return end local.get $0 local.get $1 - call $~lib/arraybuffer/ArrayBufferView~visit + call $~lib/function/Function<%28%29=>void>~visit return end local.get $0 local.get $1 - call $~lib/function/Function<%28%29=>i32>~visit + call $~lib/function/Function<%28i32%29=>void>~visit return end local.get $0 local.get $1 - call $~lib/function/Function<%28%29=>void>~visit + call $~lib/array/Array<%28%29=>i32>~visit return end local.get $0 local.get $1 - call $~lib/function/Function<%28i32%29=>void>~visit + call $~lib/array/Array~visit return end local.get $0 local.get $1 - call $~lib/array/Array<%28%29=>i32>~visit + call $~lib/function/Function<%28i32%29=>i32>~visit return end local.get $0 local.get $1 - call $~lib/array/Array~visit + call $~lib/function/Function<%28%29=>%28i32%29=>i32>~visit return end local.get $0 local.get $1 - call $~lib/function/Function<%28i32%29=>i32>~visit + call $~lib/array/Array<%28%29=>void>~visit return end local.get $0 local.get $1 - call $~lib/function/Function<%28%29=>%28i32%29=>i32>~visit + call $~lib/function/Function<%28%29=>bool>~visit return end local.get $0 local.get $1 - call $~lib/array/Array<%28%29=>void>~visit + call $~lib/function/Function<%28i32?%29=>i32>~visit return end local.get $0 local.get $1 - call $~lib/function/Function<%28%29=>bool>~visit + call $~lib/function/Function<%28i32%2Ci32?%29=>i32>~visit return end unreachable @@ -3490,8 +3601,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 34336 - i32.const 34384 + i32.const 34416 + i32.const 34464 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -4504,6 +4615,54 @@ i32.add global.set $~lib/memory/__stack_pointer ) + (func $~lib/function/Function<%28i32?%29=>i32>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28i32?%29=>i32>#get:_env + 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/function/Function<%28i32%2Ci32?%29=>i32>#__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 + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store + local.get $2 + call $~lib/function/Function<%28i32%2Ci32?%29=>i32>#get:_env + 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 $closure/testClosureWrite (result i32) (local $counter i32) (local $$env i32) @@ -4688,7 +4847,7 @@ global.set $~lib/__closure_env local.get $6 i32.load - call_indirect (type $4) + call_indirect (type $5) global.get $~lib/memory/__stack_pointer i32.const 0 global.set $~argumentsLength @@ -5511,4 +5670,123 @@ local.get $7 return ) + (func $closure/testDefaultParamCapture (result i32) + (local $defaultVal i32) + (local $$env i32) + (local $2 i32) + (local $fn i32) + (local $4 i32) + (local $5 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 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 42 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 13 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + i32.const 25 + i32.store + local.get $2 + local.get $$env + i32.store offset=4 + local.get $2 + local.tee $fn + i32.store + i32.const 0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + global.set $~argumentsLength + local.get $fn + local.tee $4 + i32.store offset=4 + local.get $4 + i32.load offset=4 + global.set $~lib/__closure_env + local.get $4 + i32.load + call_indirect (type $1) + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) + (func $closure/testDefaultParamWithOtherParam (result i32) + (local $multiplier i32) + (local $$env i32) + (local $2 i32) + (local $fn i32) + (local $4 i32) + (local $5 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 8 + call $~lib/rt/tlsf/__alloc + local.set $$env + local.get $$env + i32.const 0 + i32.store + local.get $$env + i32.const 3 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 14 + call $~lib/rt/itcms/__new + local.set $2 + local.get $2 + i32.const 26 + i32.store + local.get $2 + local.get $$env + i32.store offset=4 + local.get $2 + local.tee $fn + i32.store + i32.const 10 + i32.const 0 + global.get $~lib/memory/__stack_pointer + i32.const 1 + global.set $~argumentsLength + local.get $fn + local.tee $4 + i32.store offset=4 + local.get $4 + i32.load offset=4 + global.set $~lib/__closure_env + local.get $4 + i32.load + call_indirect (type $4) + local.set $5 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $5 + return + ) ) diff --git a/tests/compiler/closure.release.wat b/tests/compiler/closure.release.wat index 61d1e2e52b..7b855eedb1 100644 --- a/tests/compiler/closure.release.wat +++ b/tests/compiler/closure.release.wat @@ -3,8 +3,8 @@ (type $1 (func)) (type $2 (func (param i32))) (type $3 (func (param i32 i32) (result i32))) - (type $4 (func (param i32 i32))) - (type $5 (func (param i32) (result i32))) + (type $4 (func (param i32) (result i32))) + (type $5 (func (param i32 i32))) (type $6 (func (param i32 i32 i32))) (type $7 (func (param i32 i32 i32 i32))) (type $8 (func (param i32 i32 i64))) @@ -22,12 +22,13 @@ (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $closure/fn1 (mut i32) (i32.const 0)) + (global $~argumentsLength (mut i32) (i32.const 0)) (global $closure/fn2 (mut i32) (i32.const 0)) (global $closure/fn3 (mut i32) (i32.const 0)) (global $closure/fn5 (mut i32) (i32.const 0)) (global $closure/counter1 (mut i32) (i32.const 0)) (global $closure/counter2 (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 35336)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 35408)) (memory $0 1) (data $0 (i32.const 1036) "\1c") (data $0.1 (i32.const 1048) "\04\00\00\00\08\00\00\00\01") @@ -97,11 +98,15 @@ (data $35.1 (i32.const 2456) "\05\00\00\00\08\00\00\00\17") (data $36 (i32.const 2476) "\1c") (data $36.1 (i32.const 2488) "\04\00\00\00\08\00\00\00\18") - (data $37 (i32.const 2512) "\r\00\00\00 \00\00\00 \00\00\00 ") - (data $37.1 (i32.const 2544) "\02A\00\00\02\t") - (data $37.2 (i32.const 2560) "\02A") - (table $0 25 25 funcref) - (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInDoWhile~anonymous|0 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInSwitch~anonymous|0 $closure/testCaptureInSwitch~anonymous|1 $closure/testCaptureInSwitch~anonymous|2 $closure/testCaptureParam~anonymous|0 $closure/testCaptureInArrayLiteral~anonymous|1 $closure/testCaptureInArrayLiteral~anonymous|2 $closure/testNestedClosureCapture~anonymous|0~anonymous|0 $closure/testNestedClosureCapture~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testCaptureInTernary~anonymous|0 $closure/testCaptureFromCondition~anonymous|0 $closure/testDeepLoopCapture~anonymous|0 $closure/makeCounter~anonymous|0) + (data $37 (i32.const 2508) "\1c") + (data $37.1 (i32.const 2520) "\r\00\00\00\08\00\00\00\19") + (data $38 (i32.const 2540) "\1c") + (data $38.1 (i32.const 2552) "\0e\00\00\00\08\00\00\00\1a") + (data $39 (i32.const 2576) "\0f\00\00\00 \00\00\00 \00\00\00 ") + (data $39.1 (i32.const 2608) "\02A\00\00\02\t") + (data $39.2 (i32.const 2624) "\02A") + (table $0 27 27 funcref) + (elem $0 (i32.const 1) $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testMultipleCaptures~anonymous|0 $closure/testSharedEnvironment~anonymous|0 $closure/testCaptureParam~anonymous|0 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInDoWhile~anonymous|0 $closure/testCaptureInWhile~anonymous|0 $closure/testCaptureInSwitch~anonymous|0 $closure/testCaptureInSwitch~anonymous|1 $closure/testCaptureInSwitch~anonymous|2 $closure/testCaptureParam~anonymous|0 $closure/testCaptureInArrayLiteral~anonymous|1 $closure/testCaptureInArrayLiteral~anonymous|2 $closure/testNestedClosureCapture~anonymous|0~anonymous|0 $closure/testNestedClosureCapture~anonymous|0 $closure/testClosureWrite~anonymous|0 $closure/testCaptureInTernary~anonymous|0 $closure/testCaptureFromCondition~anonymous|0 $closure/testDeepLoopCapture~anonymous|0 $closure/makeCounter~anonymous|0 $closure/testDefaultParamCapture~anonymous|0@varargs $closure/testDefaultParamWithOtherParam~anonymous|0@varargs) (export "memory" (memory $0)) (start $~start) (func $closure/testCaptureParam~anonymous|0 (result i32) @@ -180,7 +185,7 @@ local.get $1 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$192 + block $__inlined_func$~lib/rt/itcms/Object#unlink$200 local.get $0 i32.load offset=4 i32.const -4 @@ -192,7 +197,7 @@ i32.load offset=8 i32.eqz local.get $0 - i32.const 35336 + i32.const 35408 i32.lt_u i32.and i32.eqz @@ -204,7 +209,7 @@ call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$192 + br $__inlined_func$~lib/rt/itcms/Object#unlink$200 end local.get $0 i32.load offset=8 @@ -241,7 +246,7 @@ i32.const 1 else local.get $1 - i32.const 2512 + i32.const 2576 i32.load i32.gt_u if @@ -255,7 +260,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 2516 + i32.const 2580 i32.add i32.load i32.const 32 @@ -839,10 +844,10 @@ if unreachable end - i32.const 35344 + i32.const 35408 i32.const 0 i32.store - i32.const 36912 + i32.const 36976 i32.const 0 i32.store loop $for-loop|0 @@ -853,7 +858,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 35344 + i32.const 35408 i32.add i32.const 0 i32.store offset=4 @@ -871,7 +876,7 @@ i32.add i32.const 2 i32.shl - i32.const 35344 + i32.const 35408 i32.add i32.const 0 i32.store offset=96 @@ -889,14 +894,14 @@ br $for-loop|0 end end - i32.const 35344 - i32.const 36916 + i32.const 35408 + i32.const 36980 memory.size i64.extend_i32_s i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - i32.const 35344 + i32.const 35408 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -981,7 +986,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 35336 + i32.const 35408 i32.lt_u if local.get $0 @@ -1077,7 +1082,7 @@ unreachable end local.get $0 - i32.const 35336 + i32.const 35408 i32.lt_u if local.get $0 @@ -1100,7 +1105,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 35336 + i32.const 35408 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1747,7 +1752,7 @@ global.get $~lib/__closure_env i32.load i32.load offset=4 - i32.const 23 + local.get $0 i32.add ) (func $closure/testNestedClosureCapture~anonymous|0 (result i32) @@ -1873,7 +1878,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1883,7 +1888,7 @@ memory.size i32.const 16 i32.shl - i32.const 35336 + i32.const 35408 i32.sub i32.const 1 i32.shr_u @@ -1940,6 +1945,8 @@ i32.store offset=4 local.get $2 global.set $closure/fn1 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/fn1 local.tee $2 @@ -1988,6 +1995,8 @@ i32.store offset=4 local.get $2 global.set $closure/fn2 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/fn2 local.tee $2 @@ -2036,6 +2045,8 @@ i32.store offset=4 local.get $2 global.set $closure/fn3 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/fn3 local.tee $2 @@ -2061,7 +2072,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2109,6 +2120,8 @@ i32.store offset=4 local.get $5 i32.store offset=4 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=8 @@ -2118,6 +2131,8 @@ local.get $4 i32.load call_indirect (type $1) + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=12 @@ -2127,6 +2142,8 @@ local.get $4 i32.load call_indirect (type $1) + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=16 @@ -2136,6 +2153,8 @@ local.get $4 i32.load call_indirect (type $1) + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $5 i32.store offset=20 @@ -2193,6 +2212,8 @@ i32.store offset=4 local.get $2 global.set $closure/fn5 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/fn5 local.tee $2 @@ -2218,7 +2239,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2268,6 +2289,8 @@ i32.store offset=4 local.get $5 i32.store offset=4 + i32.const 1 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=8 @@ -2278,6 +2301,8 @@ local.get $4 i32.load call_indirect (type $2) + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $5 i32.store offset=12 @@ -2306,7 +2331,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2350,6 +2375,8 @@ i32.store offset=4 local.get $5 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $5 i32.store offset=4 @@ -2389,7 +2416,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2428,6 +2455,8 @@ i32.store offset=4 local.get $5 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $5 i32.store offset=4 @@ -2470,7 +2499,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2514,6 +2543,8 @@ i32.store offset=4 local.get $5 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $5 i32.store offset=4 @@ -2589,7 +2620,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2665,6 +2696,8 @@ call $~lib/array/Array<%28%29=>i32>#__set local.get $4 i32.store offset=4 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=8 @@ -2681,6 +2714,8 @@ i32.load call_indirect (type $0) local.set $2 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=8 @@ -2699,6 +2734,8 @@ local.get $2 i32.add local.set $2 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=8 @@ -2735,7 +2772,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2773,6 +2810,8 @@ i32.store offset=4 local.get $4 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $4 i32.store offset=4 @@ -2785,6 +2824,8 @@ call_indirect (type $0) local.tee $2 i32.store offset=8 + i32.const 1 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $2 i32.store offset=12 @@ -2794,7 +2835,7 @@ i32.const 23 local.get $2 i32.load - call_indirect (type $5) + call_indirect (type $4) global.get $~lib/memory/__stack_pointer i32.const 16 i32.add @@ -2814,7 +2855,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2872,7 +2913,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2930,7 +2971,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2950,6 +2991,8 @@ local.get $1 i32.lt_s if + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $6 i32.store offset=4 @@ -2993,7 +3036,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3037,6 +3080,8 @@ i32.store offset=4 local.get $3 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $3 i32.store offset=4 @@ -3059,6 +3104,8 @@ local.get $0 i32.const 0 i32.store8 offset=8 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $3 i32.store offset=8 @@ -3087,7 +3134,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3128,6 +3175,8 @@ i32.store offset=4 local.get $3 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $3 i32.store offset=4 @@ -3149,6 +3198,8 @@ local.get $0 i32.const 25 i32.store offset=12 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $3 i32.store offset=8 @@ -3177,7 +3228,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -3230,6 +3281,8 @@ i32.store offset=4 local.get $3 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $3 i32.store offset=4 @@ -3277,6 +3330,8 @@ global.set $closure/counter1 call $closure/makeCounter global.set $closure/counter2 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/counter1 local.tee $0 @@ -3297,6 +3352,8 @@ call $~lib/builtins/abort unreachable end + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/counter1 local.tee $0 @@ -3317,6 +3374,8 @@ call $~lib/builtins/abort unreachable end + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/counter2 local.tee $0 @@ -3337,6 +3396,8 @@ call $~lib/builtins/abort unreachable end + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/counter1 local.tee $0 @@ -3357,6 +3418,8 @@ call $~lib/builtins/abort unreachable end + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer global.get $closure/counter2 local.tee $0 @@ -3378,18 +3441,185 @@ 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 2640 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 8 + call $~lib/rt/tlsf/allocateBlock + local.tee $0 + i32.const 4 + i32.add + local.tee $1 + i32.const 0 + i32.store + local.get $0 + i32.const 42 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 13 + call $~lib/rt/itcms/__new + local.tee $2 + i32.const 25 + i32.store + local.get $2 + local.get $1 + i32.store offset=4 + local.get $2 + i32.store + i32.const 0 + global.set $~argumentsLength + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.load offset=4 + global.set $~lib/__closure_env + i32.const 0 + local.get $2 + i32.load + call_indirect (type $4) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 42 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 224 + 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 2640 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + i32.const 8 + call $~lib/rt/tlsf/allocateBlock + local.tee $0 + i32.const 4 + i32.add + local.tee $1 + i32.const 0 + i32.store + local.get $0 + i32.const 3 + i32.store offset=8 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.const 14 + call $~lib/rt/itcms/__new + local.tee $2 + i32.const 26 + i32.store + local.get $2 + local.get $1 + i32.store offset=4 + local.get $2 + i32.store + i32.const 1 + global.set $~argumentsLength + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + i32.load offset=4 + global.set $~lib/__closure_env + i32.const 10 + i32.const 0 + local.get $2 + i32.load + call_indirect (type $3) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 30 + i32.ne + if + i32.const 0 + i32.const 1488 + i32.const 232 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer i32.const 36 i32.add global.set $~lib/memory/__stack_pointer return end - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable ) + (func $closure/testDefaultParamCapture~anonymous|0@varargs (param $0 i32) (result i32) + block $1of1 + block $0of1 + block $outOfRange + global.get $~argumentsLength + br_table $0of1 $1of1 $outOfRange + end + unreachable + end + global.get $~lib/__closure_env + i32.load offset=4 + local.set $0 + end + local.get $0 + ) + (func $closure/testDefaultParamWithOtherParam~anonymous|0@varargs (param $0 i32) (param $1 i32) (result i32) + block $1of1 + block $0of1 + block $outOfRange + global.get $~argumentsLength + i32.const 1 + i32.sub + br_table $0of1 $1of1 $outOfRange + end + unreachable + end + global.get $~lib/__closure_env + i32.load offset=4 + i32.const 10 + i32.mul + local.set $1 + end + local.get $1 + ) (func $~lib/array/Array<%28%29=>i32>~visit (param $0 i32) (local $1 i32) (local $2 i32) @@ -3399,11 +3629,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s if - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3473,7 +3703,7 @@ 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 $folding-inner0 $~lib/array/Array<%28%29=>i32> $~lib/array/Array $folding-inner0 $folding-inner0 $~lib/array/Array<%28%29=>void> $folding-inner0 $invalid + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $folding-inner0 $folding-inner0 $folding-inner0 $~lib/array/Array<%28%29=>i32> $~lib/array/Array $folding-inner0 $folding-inner0 $~lib/array/Array<%28%29=>void> $folding-inner0 $folding-inner0 $folding-inner0 $invalid end return end @@ -3495,7 +3725,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -3524,7 +3754,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s br_if $folding-inner1 global.get $~lib/memory/__stack_pointer @@ -3542,8 +3772,8 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3561,11 +3791,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s if - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3599,7 +3829,7 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store - block $__inlined_func$~lib/rt/itcms/__renew$191 + block $__inlined_func$~lib/rt/itcms/__renew$199 i32.const 1073741820 local.get $2 i32.const 1 @@ -3642,7 +3872,7 @@ i32.store offset=16 local.get $2 local.set $1 - br $__inlined_func$~lib/rt/itcms/__renew$191 + br $__inlined_func$~lib/rt/itcms/__renew$199 end local.get $3 local.get $4 @@ -3691,11 +3921,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s if - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3762,11 +3992,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s if - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3828,11 +4058,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s if - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3884,6 +4114,8 @@ i32.store offset=4 local.get $0 i32.store + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=4 @@ -3901,6 +4133,8 @@ i32.store offset=4 local.get $0 i32.store offset=8 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=12 @@ -3918,6 +4152,8 @@ i32.store offset=4 local.get $0 i32.store offset=16 + i32.const 0 + global.set $~argumentsLength global.get $~lib/memory/__stack_pointer local.get $0 i32.store offset=20 @@ -3944,11 +4180,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 2568 + i32.const 2640 i32.lt_s if - i32.const 35360 - i32.const 35408 + i32.const 35440 + i32.const 35488 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/closure.ts b/tests/compiler/closure.ts index 4ca450e29a..b181b2547f 100644 --- a/tests/compiler/closure.ts +++ b/tests/compiler/closure.ts @@ -214,3 +214,19 @@ assert(counter1() == 2); assert(counter2() == 1); // Independent counter assert(counter1() == 3); assert(counter2() == 2); + +// Test 18: Closure with parameter default value capturing outer variable +function testDefaultParamCapture(): i32 { + let defaultVal = 42; + let fn = (x: i32 = defaultVal): i32 => x; + return fn(); +} +assert(testDefaultParamCapture() == 42); + +// Test 19: Closure with parameter default value using another param +function testDefaultParamWithOtherParam(): i32 { + let multiplier = 3; + let fn = (a: i32, b: i32 = a * multiplier): i32 => b; + return fn(10); // b defaults to 10 * 3 = 30 +} +assert(testDefaultParamWithOtherParam() == 30); From 967571943230727c0e5ae469f1a462b242c4c423 Mon Sep 17 00:00:00 2001 From: BlobMaster41 <96896824+BlobMaster41@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:57:31 -0500 Subject: [PATCH 4/4] Refactor closure capture analysis and remove collectCapturedNames Replaces the collectCapturedNames function with a unified scanNodeForCaptures that supports both local and name modes for closure variable capture analysis. Updates all relevant call sites and improves handling of various node kinds, making closure capture logic more robust and maintainable. Also updates test WAT files to reflect changes in closure environment global naming. Refactor closure function creation logic Removed unused parameters and redundant local set in array rest parameter initialization. Simplified compileClosureFunctionCreation by removing the staticOffset argument, as it is no longer used. --- src/compiler.ts | 680 +++++++---------------- tests/compiler/closure-class.debug.wat | 286 +++++----- tests/compiler/closure-class.release.wat | 276 ++++----- 3 files changed, 488 insertions(+), 754 deletions(-) diff --git a/src/compiler.ts b/src/compiler.ts index 5c1f1000fe..c1d63879f1 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -6822,9 +6822,8 @@ export class Compiler extends DiagnosticEmitter { let initializer = declaration.initializer; let initExpr: ExpressionRef; if (declaration.parameterKind === ParameterKind.Rest) { - const arrExpr = new ArrayLiteralExpression([], declaration.range.atEnd); + const arrExpr = new ArrayLiteralExpression([], declaration.range.atEnd); initExpr = this.compileArrayLiteral(arrExpr, type, Constraints.ConvExplicit); - initExpr = module.local_set(operandIndex, initExpr, type.isManaged); } else if (initializer) { initExpr = this.compileExpression( initializer, @@ -7592,12 +7591,11 @@ export class Compiler extends DiagnosticEmitter { } let offset = this.ensureRuntimeFunction(instance); // reports - let sizeTypeRef = this.options.sizeTypeRef; // If this is a closure, we need to allocate the Function object dynamically // and set the _env field to point to our environment if (instance.capturedLocals && instance.capturedLocals.size > 0) { - return this.compileClosureFunctionCreation(instance, sourceFunction, offset); + return this.compileClosureFunctionCreation(instance, sourceFunction); } let expr = this.options.isWasm64 @@ -7635,12 +7633,22 @@ export class Compiler extends DiagnosticEmitter { // === Closure Support ========================================================================== - /** Scans a node and its children for captured variables from outer scopes. */ + /** Scans a node and its children for captured variables from outer scopes. + * + * This function supports two modes: + * 1. Local mode (captures provided): Resolves names to Local objects and calculates slot indices. + * Used when compiling function expressions where outer function's locals already exist. + * 2. Name mode (capturedNames provided): Collects just variable names for later resolution. + * Used during prescan when the function body hasn't been compiled yet. + * In this mode, declaredVars contains pre-scanned variable names from the outer function. + */ private scanNodeForCaptures( node: Node, outerFlow: Flow, innerFunctionNames: Set, - captures: Map + captures: Map | null, + capturedNames: Map | null = null, + declaredVars: Map | null = null ): void { switch (node.kind) { case NodeKind.Identifier: { @@ -7648,68 +7656,79 @@ export class Compiler extends DiagnosticEmitter { let name = ident.text; // Skip identifiers that are parameters/locals of inner functions if (innerFunctionNames.has(name)) break; - // Check if this references a local from an outer scope - let local = outerFlow.lookupLocal(name); - if (!local) { - // Also check via outer flow chain - local = outerFlow.lookupLocalInOuter(name); - } - if (local && !captures.has(local)) { - local.isCaptured = true; - // Set envOwner to track which function's environment holds this local - if (!local.envOwner) { - local.envOwner = local.parent; + + if (captures) { + // Local mode: resolve to Local and calculate slot index + let local = outerFlow.lookupLocal(name); + if (!local) { + local = outerFlow.lookupLocalInOuter(name); } - // If envSlotIndex is already set (from variable declaration), use it - if (local.envSlotIndex >= 0) { - captures.set(local, local.envSlotIndex); - } else { - // Calculate proper byte offset based on existing captures with alignment - // Reserve slot 0 for parent environment pointer (4 or 8 bytes depending on wasm32/64) - let ptrSize = this.options.usizeType.byteSize; - let currentOffset = ptrSize; // Start after parent pointer slot - for (let _keys = Map_keys(captures), idx = 0, cnt = _keys.length; idx < cnt; ++idx) { - let existingLocal = _keys[idx]; - // The slot index already accounts for alignment, add the size to get next free offset - let endOfSlot = existingLocal.envSlotIndex + existingLocal.type.byteSize; - if (endOfSlot > currentOffset) currentOffset = endOfSlot; + if (local && !captures.has(local)) { + local.isCaptured = true; + if (!local.envOwner) { + local.envOwner = local.parent; + } + if (local.envSlotIndex >= 0) { + captures.set(local, local.envSlotIndex); + } else { + // Calculate proper byte offset with alignment + let ptrSize = this.options.usizeType.byteSize; + let currentOffset = ptrSize; + for (let _keys = Map_keys(captures), idx = 0, cnt = _keys.length; idx < cnt; ++idx) { + let existingLocal = _keys[idx]; + let endOfSlot = existingLocal.envSlotIndex + existingLocal.type.byteSize; + if (endOfSlot > currentOffset) currentOffset = endOfSlot; + } + let typeSize = local.type.byteSize; + let align = typeSize; + currentOffset = (currentOffset + align - 1) & ~(align - 1); + local.envSlotIndex = currentOffset; + captures.set(local, local.envSlotIndex); } - // Align to the type's natural alignment - let typeSize = local.type.byteSize; - let align = typeSize; - currentOffset = (currentOffset + align - 1) & ~(align - 1); - local.envSlotIndex = currentOffset; - captures.set(local, local.envSlotIndex); + } + } else if (capturedNames) { + // Name mode: collect name if it's from outer scope + let isFromOuter = (declaredVars && declaredVars.has(name)) || outerFlow.lookupLocal(name); + if (isFromOuter) { + capturedNames.set(name, null); } } break; } case NodeKind.This: { - // Handle 'this' capture - look it up in outer flow + // Handle 'this' capture let local = outerFlow.lookupLocal(CommonNames.this_); if (!local) { local = outerFlow.lookupLocalInOuter(CommonNames.this_); } - if (local && !captures.has(local)) { - local.isCaptured = true; - if (!local.envOwner) { - local.envOwner = local.parent; - } - if (local.envSlotIndex >= 0) { - captures.set(local, local.envSlotIndex); - } else { - let ptrSize = this.options.usizeType.byteSize; - let currentOffset = ptrSize; - for (let _keys = Map_keys(captures), idx = 0, cnt = _keys.length; idx < cnt; ++idx) { - let existingLocal = _keys[idx]; - let endOfSlot = existingLocal.envSlotIndex + existingLocal.type.byteSize; - if (endOfSlot > currentOffset) currentOffset = endOfSlot; + if (captures) { + // Local mode + if (local && !captures.has(local)) { + local.isCaptured = true; + if (!local.envOwner) { + local.envOwner = local.parent; + } + if (local.envSlotIndex >= 0) { + captures.set(local, local.envSlotIndex); + } else { + let ptrSize = this.options.usizeType.byteSize; + let currentOffset = ptrSize; + for (let _keys = Map_keys(captures), idx = 0, cnt = _keys.length; idx < cnt; ++idx) { + let existingLocal = _keys[idx]; + let endOfSlot = existingLocal.envSlotIndex + existingLocal.type.byteSize; + if (endOfSlot > currentOffset) currentOffset = endOfSlot; + } + let typeSize = local.type.byteSize; + let align = typeSize; + currentOffset = (currentOffset + align - 1) & ~(align - 1); + local.envSlotIndex = currentOffset; + captures.set(local, local.envSlotIndex); } - let typeSize = local.type.byteSize; - let align = typeSize; - currentOffset = (currentOffset + align - 1) & ~(align - 1); - local.envSlotIndex = currentOffset; - captures.set(local, local.envSlotIndex); + } + } else if (capturedNames) { + // Name mode + if (local) { + capturedNames.set(CommonNames.this_, null); } } break; @@ -7723,14 +7742,14 @@ export class Compiler extends DiagnosticEmitter { for (let i = 0, k = params.length; i < k; i++) { let paramInit = params[i].initializer; if (paramInit) { - this.scanNodeForCaptures(paramInit, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(paramInit, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } } for (let i = 0, k = params.length; i < k; i++) { innerFunctionNames.add(params[i].name.text); } if (decl.body) { - this.scanNodeForCaptures(decl.body, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(decl.body, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } for (let i = 0, k = params.length; i < k; i++) { innerFunctionNames.delete(params[i].name.text); @@ -7740,21 +7759,21 @@ export class Compiler extends DiagnosticEmitter { // Expression nodes case NodeKind.Assertion: { let expr = node; - this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Binary: { let expr = node; - this.scanNodeForCaptures(expr.left, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(expr.right, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.left, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(expr.right, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Call: { let expr = node; - this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); let args = expr.args; for (let i = 0, k = args.length; i < k; i++) { - this.scanNodeForCaptures(args[i], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(args[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } break; } @@ -7762,55 +7781,82 @@ export class Compiler extends DiagnosticEmitter { let expr = node; let expressions = expr.expressions; for (let i = 0, k = expressions.length; i < k; i++) { - this.scanNodeForCaptures(expressions[i], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expressions[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + } + break; + } + case NodeKind.Literal: { + let literal = node; + if (literal.literalKind == LiteralKind.Array) { + let arrLiteral = literal; + let elements = arrLiteral.elementExpressions; + for (let i = 0, k = elements.length; i < k; i++) { + let elem = elements[i]; + if (elem) { + this.scanNodeForCaptures(elem, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + } + } + } else if (literal.literalKind == LiteralKind.Object) { + let objLiteral = literal; + let values = objLiteral.values; + for (let i = 0, k = values.length; i < k; i++) { + this.scanNodeForCaptures(values[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + } + } else if (literal.literalKind == LiteralKind.Template) { + let tmplLiteral = literal; + let expressions = tmplLiteral.expressions; + for (let i = 0, k = expressions.length; i < k; i++) { + this.scanNodeForCaptures(expressions[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + } } + // Other literal kinds (Integer, Float, String, RegExp) have no variable refs break; } case NodeKind.ElementAccess: { let expr = node; - this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(expr.elementExpression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(expr.elementExpression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.New: { let expr = node; - this.scanNodeForCaptures(expr.typeName, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.typeName, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); let args = expr.args; for (let i = 0, k = args.length; i < k; i++) { - this.scanNodeForCaptures(args[i], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(args[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } break; } case NodeKind.Parenthesized: { let expr = node; - this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.PropertyAccess: { let expr = node; - this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Ternary: { let expr = node; - this.scanNodeForCaptures(expr.condition, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(expr.ifThen, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(expr.ifElse, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.condition, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(expr.ifThen, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(expr.ifElse, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.UnaryPostfix: { let expr = node; - this.scanNodeForCaptures(expr.operand, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.operand, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.UnaryPrefix: { let expr = node; - this.scanNodeForCaptures(expr.operand, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.operand, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.InstanceOf: { let expr = node; - this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(expr.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } // Statement nodes @@ -7818,83 +7864,83 @@ export class Compiler extends DiagnosticEmitter { let stmt = node; let statements = stmt.statements; for (let i = 0, k = statements.length; i < k; i++) { - this.scanNodeForCaptures(statements[i], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(statements[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } break; } case NodeKind.Do: { let stmt = node; - this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Expression: { let stmt = node; - this.scanNodeForCaptures(stmt.expression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.For: { let stmt = node; - if (stmt.initializer) this.scanNodeForCaptures(stmt.initializer, outerFlow, innerFunctionNames, captures); - if (stmt.condition) this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures); - if (stmt.incrementor) this.scanNodeForCaptures(stmt.incrementor, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures); + if (stmt.initializer) this.scanNodeForCaptures(stmt.initializer, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + if (stmt.condition) this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + if (stmt.incrementor) this.scanNodeForCaptures(stmt.incrementor, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.ForOf: { let stmt = node; - this.scanNodeForCaptures(stmt.variable, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(stmt.iterable, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.variable, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(stmt.iterable, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.If: { let stmt = node; - this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(stmt.ifTrue, outerFlow, innerFunctionNames, captures); - if (stmt.ifFalse) this.scanNodeForCaptures(stmt.ifFalse, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(stmt.ifTrue, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + if (stmt.ifFalse) this.scanNodeForCaptures(stmt.ifFalse, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Return: { let stmt = node; - if (stmt.value) this.scanNodeForCaptures(stmt.value, outerFlow, innerFunctionNames, captures); + if (stmt.value) this.scanNodeForCaptures(stmt.value, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Switch: { let stmt = node; - this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); let cases = stmt.cases; for (let i = 0, k = cases.length; i < k; i++) { let case_ = cases[i]; - if (case_.label) this.scanNodeForCaptures(case_.label, outerFlow, innerFunctionNames, captures); + if (case_.label) this.scanNodeForCaptures(case_.label, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); let stmts = case_.statements; for (let j = 0, l = stmts.length; j < l; j++) { - this.scanNodeForCaptures(stmts[j], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmts[j], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } } break; } case NodeKind.Throw: { let stmt = node; - this.scanNodeForCaptures(stmt.value, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.value, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Try: { let stmt = node; let bodyStmts = stmt.bodyStatements; for (let i = 0, k = bodyStmts.length; i < k; i++) { - this.scanNodeForCaptures(bodyStmts[i], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(bodyStmts[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } if (stmt.catchStatements) { let catchStmts = stmt.catchStatements; for (let i = 0, k = catchStmts.length; i < k; i++) { - this.scanNodeForCaptures(catchStmts[i], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(catchStmts[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } } if (stmt.finallyStatements) { let finallyStmts = stmt.finallyStatements; for (let i = 0, k = finallyStmts.length; i < k; i++) { - this.scanNodeForCaptures(finallyStmts[i], outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(finallyStmts[i], outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } } break; @@ -7907,35 +7953,75 @@ export class Compiler extends DiagnosticEmitter { // Add the variable name as a local name (not captured from outer) innerFunctionNames.add(decl.name.text); if (decl.initializer) { - this.scanNodeForCaptures(decl.initializer, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(decl.initializer, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); } } break; } case NodeKind.While: { let stmt = node; - this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures); - this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.condition, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); + this.scanNodeForCaptures(stmt.body, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } case NodeKind.Void: { let stmt = node; - this.scanNodeForCaptures(stmt.expression, outerFlow, innerFunctionNames, captures); + this.scanNodeForCaptures(stmt.expression, outerFlow, innerFunctionNames, captures, capturedNames, declaredVars); break; } - // Ignore other nodes (literals, this, super, etc.) - } - } - /** Scans an array of statements for captures. */ - private scanStatementsForCaptures( - statements: Statement[], - outerFlow: Flow, - innerFunctionNames: Set, - captures: Map - ): void { - for (let i = 0, k = statements.length; i < k; i++) { - this.scanNodeForCaptures(statements[i], outerFlow, innerFunctionNames, captures); + // Leaf nodes - no children to scan, no captures possible + case NodeKind.Null: + case NodeKind.True: + case NodeKind.False: + case NodeKind.Super: + case NodeKind.Constructor: + case NodeKind.Break: + case NodeKind.Continue: + case NodeKind.Empty: + case NodeKind.Omitted: + case NodeKind.Comment: + case NodeKind.Compiled: + break; + + // Class expressions - not supported (will error during compilation) + case NodeKind.Class: + break; + + // Type nodes - types don't contain runtime captures + case NodeKind.TypeName: + case NodeKind.NamedType: + case NodeKind.FunctionType: + case NodeKind.TypeParameter: + case NodeKind.Parameter: // Parameter initializers handled separately in Function case + break; + + // Top-level declarations - should not appear inside function bodies being scanned + case NodeKind.Source: + case NodeKind.ClassDeclaration: + case NodeKind.EnumDeclaration: + case NodeKind.EnumValueDeclaration: + case NodeKind.FunctionDeclaration: + case NodeKind.InterfaceDeclaration: + case NodeKind.NamespaceDeclaration: + case NodeKind.TypeDeclaration: + case NodeKind.Import: + case NodeKind.Export: + case NodeKind.ExportDefault: + case NodeKind.ExportImport: + case NodeKind.Module: + case NodeKind.Decorator: + case NodeKind.IndexSignature: + case NodeKind.FieldDeclaration: + case NodeKind.ImportDeclaration: + case NodeKind.ExportMember: + case NodeKind.MethodDeclaration: + case NodeKind.VariableDeclaration: + case NodeKind.SwitchCase: // Handled inline in Switch case + break; + + default: + assert(false, "scanNodeForCaptures: unhandled node kind: " + (node.kind as i32).toString()); } } @@ -8477,7 +8563,8 @@ export class Compiler extends DiagnosticEmitter { } } - /** Analyzes captured variables using both flow and pre-collected variable names. */ + /** Analyzes captured variables using both flow and pre-collected variable names. + * Uses name mode since Locals may not exist yet during prescan. */ private analyzeCapturedVariablesWithDeclared( declaration: FunctionDeclaration, outerFlow: Flow, @@ -8494,7 +8581,8 @@ export class Compiler extends DiagnosticEmitter { for (let i = 0, k = params.length; i < k; i++) { let paramInit = params[i].initializer; if (paramInit) { - this.collectCapturedNames(paramInit, innerFunctionNames, outerFlow, declaredVars, capturedNames); + // Use name mode (null captures, with capturedNames and declaredVars) + this.scanNodeForCaptures(paramInit, outerFlow, innerFunctionNames, null, capturedNames, declaredVars); } } @@ -8506,366 +8594,13 @@ export class Compiler extends DiagnosticEmitter { // Scan the function body for identifier usages let body = declaration.body; if (body) { - this.collectCapturedNames(body, innerFunctionNames, outerFlow, declaredVars, capturedNames); + // Use name mode (null captures, with capturedNames and declaredVars) + this.scanNodeForCaptures(body, outerFlow, innerFunctionNames, null, capturedNames, declaredVars); } return capturedNames; } - /** Collects names of variables that are captured from outer scope. */ - private collectCapturedNames( - node: Node, - innerFunctionNames: Set, - outerFlow: Flow, - declaredVars: Map, - capturedNames: Map - ): void { - switch (node.kind) { - case NodeKind.Identifier: { - let ident = node; - let name = ident.text; - // Skip if it's an inner function parameter/local - if (innerFunctionNames.has(name)) break; - // Check if it's a declared variable in outer scope OR a local in the flow - if (declaredVars.has(name) || outerFlow.lookupLocal(name)) { - capturedNames.set(name, null); - } - break; - } - case NodeKind.This: { - // Handle 'this' capture - check if outer function has a 'this' local - let thisLocal = outerFlow.lookupLocal(CommonNames.this_); - if (!thisLocal) { - thisLocal = outerFlow.lookupLocalInOuter(CommonNames.this_); - } - if (thisLocal) { - capturedNames.set(CommonNames.this_, null); - } - break; - } - case NodeKind.Block: { - let block = node; - for (let i = 0, k = block.statements.length; i < k; i++) { - this.collectCapturedNames(block.statements[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - break; - } - case NodeKind.Expression: { - let exprStmt = node; - this.collectCapturedNames(exprStmt.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Return: { - let ret = node; - if (ret.value) { - this.collectCapturedNames(ret.value, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - break; - } - case NodeKind.Variable: { - // Add declared variables to inner names so they're not considered captures - let varStmt = node; - for (let i = 0, k = varStmt.declarations.length; i < k; i++) { - let decl = varStmt.declarations[i]; - innerFunctionNames.add(decl.name.text); - // Scan initializers for captures - if (decl.initializer) { - this.collectCapturedNames(decl.initializer, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } - break; - } - case NodeKind.Binary: { - let binary = node; - this.collectCapturedNames(binary.left, innerFunctionNames, outerFlow, declaredVars, capturedNames); - this.collectCapturedNames(binary.right, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Call: { - let call = node; - this.collectCapturedNames(call.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - let args = call.args; - for (let i = 0, k = args.length; i < k; i++) { - this.collectCapturedNames(args[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - break; - } - case NodeKind.If: { - let ifStmt = node; - this.collectCapturedNames(ifStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); - this.collectCapturedNames(ifStmt.ifTrue, innerFunctionNames, outerFlow, declaredVars, capturedNames); - if (ifStmt.ifFalse) { - this.collectCapturedNames(ifStmt.ifFalse, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - break; - } - case NodeKind.ElementAccess: { - let elemAccess = node; - this.collectCapturedNames(elemAccess.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - this.collectCapturedNames(elemAccess.elementExpression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.PropertyAccess: { - let propAccess = node; - this.collectCapturedNames(propAccess.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Parenthesized: { - let paren = node; - this.collectCapturedNames(paren.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.UnaryPrefix: { - let unary = node; - this.collectCapturedNames(unary.operand, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.UnaryPostfix: { - let unary = node; - this.collectCapturedNames(unary.operand, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Ternary: { - let ternary = node; - this.collectCapturedNames(ternary.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); - this.collectCapturedNames(ternary.ifThen, innerFunctionNames, outerFlow, declaredVars, capturedNames); - this.collectCapturedNames(ternary.ifElse, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Assertion: { - let assertion = node; - this.collectCapturedNames(assertion.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.New: { - let newExpr = node; - let args = newExpr.args; - for (let i = 0, k = args.length; i < k; i++) { - this.collectCapturedNames(args[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - break; - } - case NodeKind.InstanceOf: { - let instanceOf = node; - this.collectCapturedNames(instanceOf.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Comma: { - let comma = node; - for (let i = 0, k = comma.expressions.length; i < k; i++) { - this.collectCapturedNames(comma.expressions[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - break; - } - case NodeKind.Function: { - // For nested function expressions, scan their body recursively - // This is critical for deeply nested closures that capture from grandparent scopes - let funcExpr = node; - let decl = funcExpr.declaration; - let params = decl.signature.parameters; - // Scan parameter default values for captures (before adding params to inner names) - for (let i = 0, k = params.length; i < k; i++) { - let paramInit = params[i].initializer; - if (paramInit) { - this.collectCapturedNames(paramInit, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } - // Add the nested function's params to inner names - for (let i = 0, k = params.length; i < k; i++) { - innerFunctionNames.add(params[i].name.text); - } - if (decl.body) { - this.collectCapturedNames(decl.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - // Remove the params after scanning - for (let i = 0, k = params.length; i < k; i++) { - innerFunctionNames.delete(params[i].name.text); - } - break; - } - case NodeKind.While: { - let whileStmt = node; - this.collectCapturedNames(whileStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); - this.collectCapturedNames(whileStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Do: { - let doStmt = node; - this.collectCapturedNames(doStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); - this.collectCapturedNames(doStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.For: { - let forStmt = node; - if (forStmt.initializer) { - this.collectCapturedNames(forStmt.initializer, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - if (forStmt.condition) { - this.collectCapturedNames(forStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - if (forStmt.incrementor) { - this.collectCapturedNames(forStmt.incrementor, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - this.collectCapturedNames(forStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.ForOf: { - let forOfStmt = node; - this.collectCapturedNames(forOfStmt.iterable, innerFunctionNames, outerFlow, declaredVars, capturedNames); - // Add the loop variable to inner names - let varDecl = forOfStmt.variable; - if (varDecl.kind == NodeKind.Variable) { - let varStmt = varDecl; - for (let i = 0, k = varStmt.declarations.length; i < k; i++) { - innerFunctionNames.add(varStmt.declarations[i].name.text); - } - } - this.collectCapturedNames(forOfStmt.body, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Switch: { - let switchStmt = node; - this.collectCapturedNames(switchStmt.condition, innerFunctionNames, outerFlow, declaredVars, capturedNames); - let cases = switchStmt.cases; - for (let i = 0, k = cases.length; i < k; i++) { - let switchCase = cases[i]; - if (switchCase.label) { - this.collectCapturedNames(switchCase.label, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - let statements = switchCase.statements; - for (let j = 0, l = statements.length; j < l; j++) { - this.collectCapturedNames(statements[j], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } - break; - } - case NodeKind.Try: { - let tryStmt = node; - let bodyStatements = tryStmt.bodyStatements; - for (let i = 0, k = bodyStatements.length; i < k; i++) { - this.collectCapturedNames(bodyStatements[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - let catchVariable = tryStmt.catchVariable; - if (catchVariable) { - innerFunctionNames.add(catchVariable.text); - } - let catchStatements = tryStmt.catchStatements; - if (catchStatements) { - for (let i = 0, k = catchStatements.length; i < k; i++) { - this.collectCapturedNames(catchStatements[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } - let finallyStatements = tryStmt.finallyStatements; - if (finallyStatements) { - for (let i = 0, k = finallyStatements.length; i < k; i++) { - this.collectCapturedNames(finallyStatements[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } - if (catchVariable) { - innerFunctionNames.delete(catchVariable.text); - } - break; - } - case NodeKind.Throw: { - let throwStmt = node; - this.collectCapturedNames(throwStmt.value, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Void: { - let voidStmt = node; - this.collectCapturedNames(voidStmt.expression, innerFunctionNames, outerFlow, declaredVars, capturedNames); - break; - } - case NodeKind.Literal: { - let literal = node; - if (literal.literalKind == LiteralKind.Array) { - let arrLiteral = literal; - let elements = arrLiteral.elementExpressions; - for (let i = 0, k = elements.length; i < k; i++) { - let elem = elements[i]; - if (elem) { - this.collectCapturedNames(elem, innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } - } else if (literal.literalKind == LiteralKind.Object) { - let objLiteral = literal; - let values = objLiteral.values; - for (let i = 0, k = values.length; i < k; i++) { - this.collectCapturedNames(values[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } else if (literal.literalKind == LiteralKind.Template) { - let tmplLiteral = literal; - let expressions = tmplLiteral.expressions; - for (let i = 0, k = expressions.length; i < k; i++) { - this.collectCapturedNames(expressions[i], innerFunctionNames, outerFlow, declaredVars, capturedNames); - } - } - // Other literal kinds (Integer, Float, String, RegExp) have no variable refs - break; - } - - // Leaf expressions - no variable references - case NodeKind.True: - case NodeKind.False: - case NodeKind.Null: - case NodeKind.Super: - case NodeKind.Omitted: - case NodeKind.Compiled: - break; - - // Statements without expressions - case NodeKind.Break: - case NodeKind.Continue: - case NodeKind.Empty: - break; - - // Class expressions are not supported (will error during compilation) - case NodeKind.Class: - // Constructor keyword - not a capturable expression - case NodeKind.Constructor: - break; - - // Module-level declarations (shouldn't appear in closure bodies normally) - case NodeKind.Export: - case NodeKind.ExportDefault: - case NodeKind.ExportImport: - case NodeKind.Import: - case NodeKind.Module: - case NodeKind.ClassDeclaration: - case NodeKind.EnumDeclaration: - case NodeKind.InterfaceDeclaration: - case NodeKind.NamespaceDeclaration: - case NodeKind.TypeDeclaration: - case NodeKind.FunctionDeclaration: - break; - - // Type nodes - no runtime variable references - case NodeKind.NamedType: - case NodeKind.FunctionType: - case NodeKind.TypeName: - case NodeKind.TypeParameter: - case NodeKind.Parameter: - break; - - // Special nodes - case NodeKind.Source: - case NodeKind.Decorator: - case NodeKind.ExportMember: - case NodeKind.SwitchCase: - case NodeKind.IndexSignature: - case NodeKind.Comment: - case NodeKind.EnumValueDeclaration: - case NodeKind.FieldDeclaration: - case NodeKind.ImportDeclaration: - case NodeKind.MethodDeclaration: - case NodeKind.VariableDeclaration: - break; - - default: - assert(false, "collectCapturedNames: unhandled node kind: " + (node.kind as i32).toString()); - } - } - /** Computes the total size needed for a closure environment. */ private computeEnvironmentSize(captures: Map): i32 { // Calculate the total size based on already-assigned slot indices @@ -8917,8 +8652,7 @@ export class Compiler extends DiagnosticEmitter { /** Compiles the creation of a closure Function object with environment pointer. */ private compileClosureFunctionCreation( instance: Function, - outerFunc: Function, - staticOffset: i64 + outerFunc: Function ): ExpressionRef { let module = this.module; let program = this.program; diff --git a/tests/compiler/closure-class.debug.wat b/tests/compiler/closure-class.debug.wat index 8d9d00637e..9ea83bc205 100644 --- a/tests/compiler/closure-class.debug.wat +++ b/tests/compiler/closure-class.debug.wat @@ -26,7 +26,7 @@ (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/__closure_env (mut i32) (i32.const 0)) + (global $~lib/__closure_env (mut i32) (i32.const 0)) (global $~argumentsLength (mut i32) (i32.const 0)) (global $~lib/native/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) @@ -3783,7 +3783,7 @@ ) (func $closure-class/testTaskCallbacks~anonymous|0 (param $result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $result @@ -3793,7 +3793,7 @@ ) (func $closure-class/testTaskCallbackAfterComplete~anonymous|0 (param $result i32) (local $$closureEnv i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv local.get $result @@ -4973,7 +4973,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5009,7 +5009,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5077,7 +5077,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $5) @@ -5089,7 +5089,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $5) @@ -5101,7 +5101,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $5) @@ -5113,7 +5113,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -5207,7 +5207,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $5) @@ -5219,7 +5219,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $5) @@ -5231,7 +5231,7 @@ i32.store offset=36 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $5) @@ -5243,7 +5243,7 @@ i32.store offset=40 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $5) @@ -5255,7 +5255,7 @@ i32.store offset=44 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $5) @@ -5267,7 +5267,7 @@ i32.store offset=48 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $2) @@ -5281,7 +5281,7 @@ i32.store offset=52 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $2) @@ -5357,7 +5357,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5411,7 +5411,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5489,7 +5489,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5517,7 +5517,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -5616,7 +5616,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $3) @@ -5628,7 +5628,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -5652,7 +5652,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -5677,7 +5677,7 @@ i32.store offset=36 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $2) @@ -5701,7 +5701,7 @@ i32.store offset=40 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -5726,7 +5726,7 @@ i32.store offset=44 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $2) @@ -5749,7 +5749,7 @@ i32.store offset=48 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $2) @@ -5773,7 +5773,7 @@ i32.store offset=52 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $3) @@ -5786,7 +5786,7 @@ i32.store offset=56 local.get $13 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $13 i32.load call_indirect (type $0) @@ -5811,7 +5811,7 @@ i32.store offset=60 local.get $14 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $14 i32.load call_indirect (type $2) @@ -5825,7 +5825,7 @@ i32.store offset=64 local.get $15 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $15 i32.load call_indirect (type $2) @@ -5895,7 +5895,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 @@ -6058,7 +6058,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -6071,7 +6071,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -6084,7 +6084,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -6097,7 +6097,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $2) @@ -6242,7 +6242,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -6285,7 +6285,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -6360,7 +6360,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $2) @@ -6384,7 +6384,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $3) @@ -6396,7 +6396,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -6419,7 +6419,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -6579,7 +6579,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -6607,7 +6607,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -6643,7 +6643,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -6822,7 +6822,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -6845,7 +6845,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -6873,7 +6873,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $5) @@ -6885,7 +6885,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $5) @@ -6897,7 +6897,7 @@ i32.store offset=36 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $2) @@ -7176,7 +7176,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -7598,7 +7598,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $3) @@ -7909,7 +7909,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -7941,7 +7941,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -7973,7 +7973,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -8114,7 +8114,7 @@ i32.const 0 i32.const 24 memory.fill - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv global.get $~lib/memory/__stack_pointer i32.const 1392 @@ -8292,7 +8292,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $3) @@ -8305,7 +8305,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -8318,7 +8318,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -8331,7 +8331,7 @@ i32.store offset=36 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $2) @@ -8420,7 +8420,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -8485,7 +8485,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -8536,7 +8536,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -8601,7 +8601,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -8628,7 +8628,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -8739,7 +8739,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -8762,7 +8762,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $2) @@ -8787,7 +8787,7 @@ i32.store offset=36 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $2) @@ -8810,7 +8810,7 @@ i32.store offset=40 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $2) @@ -8835,7 +8835,7 @@ i32.store offset=44 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $2) @@ -8860,7 +8860,7 @@ i32.store offset=48 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $2) @@ -8883,7 +8883,7 @@ i32.store offset=52 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $2) @@ -8908,7 +8908,7 @@ i32.store offset=56 local.get $13 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $13 i32.load call_indirect (type $2) @@ -8931,7 +8931,7 @@ i32.store offset=60 local.get $14 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $14 i32.load call_indirect (type $2) @@ -8956,7 +8956,7 @@ i32.store offset=64 local.get $15 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $15 i32.load call_indirect (type $2) @@ -8979,7 +8979,7 @@ i32.store offset=68 local.get $16 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $16 i32.load call_indirect (type $2) @@ -9004,7 +9004,7 @@ i32.store offset=72 local.get $17 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $17 i32.load call_indirect (type $5) @@ -9016,7 +9016,7 @@ i32.store offset=76 local.get $18 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $18 i32.load call_indirect (type $2) @@ -9039,7 +9039,7 @@ i32.store offset=80 local.get $19 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $19 i32.load call_indirect (type $2) @@ -9330,7 +9330,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store offset=8 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -9467,7 +9467,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store offset=8 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -9531,7 +9531,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $1) @@ -9558,7 +9558,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -9640,7 +9640,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -9676,7 +9676,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -9787,7 +9787,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $3) @@ -9811,7 +9811,7 @@ i32.store offset=32 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -9824,7 +9824,7 @@ i32.store offset=36 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -9837,7 +9837,7 @@ i32.store offset=40 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $3) @@ -9850,7 +9850,7 @@ i32.store offset=44 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $3) @@ -9862,7 +9862,7 @@ i32.store offset=48 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $2) @@ -9921,7 +9921,7 @@ i32.store offset=52 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $2) @@ -10008,7 +10008,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store offset=8 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -10033,7 +10033,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -10054,7 +10054,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -10129,7 +10129,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $3) @@ -10147,7 +10147,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $3) @@ -10165,7 +10165,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $3) @@ -10177,7 +10177,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -10201,7 +10201,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -10219,7 +10219,7 @@ i32.store local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -10277,7 +10277,7 @@ i32.store offset=12 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -10355,7 +10355,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 @@ -10397,7 +10397,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=8 @@ -10493,7 +10493,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -10506,7 +10506,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -10519,7 +10519,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -10532,7 +10532,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $2) @@ -10639,7 +10639,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store offset=8 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -10666,7 +10666,7 @@ i32.store offset=4 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $3) @@ -10714,7 +10714,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store offset=8 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -10777,7 +10777,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $3) @@ -10895,7 +10895,7 @@ i32.store offset=16 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $3) @@ -10921,7 +10921,7 @@ i32.store offset=20 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -11027,7 +11027,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $3) @@ -11058,7 +11058,7 @@ i32.store offset=20 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $3) @@ -11137,7 +11137,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -11187,7 +11187,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -11240,7 +11240,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store offset=8 - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -11277,7 +11277,7 @@ i32.store offset=8 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $2) @@ -11396,7 +11396,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -11419,7 +11419,7 @@ i32.store offset=24 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -11444,7 +11444,7 @@ i32.store offset=28 local.get $6 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $6 i32.load call_indirect (type $2) @@ -11475,7 +11475,7 @@ i32.store offset=32 local.get $7 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $7 i32.load call_indirect (type $0) @@ -11504,7 +11504,7 @@ i32.store offset=36 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $0) @@ -11533,7 +11533,7 @@ i32.store offset=40 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $0) @@ -11574,7 +11574,7 @@ i32.store offset=44 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $2) @@ -11599,7 +11599,7 @@ i32.store offset=48 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $2) @@ -11630,7 +11630,7 @@ i32.store offset=52 local.get $12 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $12 i32.load call_indirect (type $0) @@ -12071,7 +12071,7 @@ i32.const 0 i32.const 20 memory.fill - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -12135,7 +12135,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -12174,7 +12174,7 @@ i32.const 0 i32.const 20 memory.fill - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -12256,7 +12256,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -12438,7 +12438,7 @@ i32.store offset=40 local.get $8 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $8 i32.load call_indirect (type $2) @@ -12461,7 +12461,7 @@ i32.store offset=44 local.get $9 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $9 i32.load call_indirect (type $2) @@ -12484,7 +12484,7 @@ i32.store offset=48 local.get $10 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $10 i32.load call_indirect (type $2) @@ -12498,7 +12498,7 @@ i32.store offset=52 local.get $11 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $11 i32.load call_indirect (type $2) @@ -12598,7 +12598,7 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -12675,7 +12675,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.set $$closureEnv local.get $$closureEnv i32.load offset=4 @@ -12776,7 +12776,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -12790,7 +12790,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) @@ -12864,7 +12864,7 @@ i32.store offset=16 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $2) @@ -12878,7 +12878,7 @@ i32.store offset=20 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $2) diff --git a/tests/compiler/closure-class.release.wat b/tests/compiler/closure-class.release.wat index 56343cde8f..561f6453b5 100644 --- a/tests/compiler/closure-class.release.wat +++ b/tests/compiler/closure-class.release.wat @@ -20,7 +20,7 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $$~lib/__closure_env (mut i32) (i32.const 0)) + (global $~lib/__closure_env (mut i32) (i32.const 0)) (global $~lib/memory/__stack_pointer (mut i32) (i32.const 36860)) (memory $0 1) (data $0 (i32.const 1036) "<") @@ -1986,14 +1986,14 @@ local.get $0 ) (func $closure-class/testTaskCallbacks~anonymous|0 (param $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.get $0 i32.const 1 i32.shl i32.store offset=4 ) (func $closure-class/testTaskCallbackAfterComplete~anonymous|0 (param $0 i32) - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.get $0 i32.store offset=4 ) @@ -2210,7 +2210,7 @@ i32.store offset=16 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $3) @@ -2219,7 +2219,7 @@ i32.store offset=20 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $3) @@ -2228,7 +2228,7 @@ i32.store offset=24 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $3) @@ -2237,7 +2237,7 @@ i32.store offset=28 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -2312,7 +2312,7 @@ i32.store offset=28 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $3) @@ -2321,7 +2321,7 @@ i32.store offset=32 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $3) @@ -2330,7 +2330,7 @@ i32.store offset=36 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $3) @@ -2339,7 +2339,7 @@ i32.store offset=40 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $3) @@ -2348,7 +2348,7 @@ i32.store offset=44 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $3) @@ -2357,7 +2357,7 @@ i32.store offset=48 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -2369,7 +2369,7 @@ i32.store offset=52 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -2485,7 +2485,7 @@ i32.store offset=20 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -2495,7 +2495,7 @@ i32.store offset=24 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -2505,7 +2505,7 @@ i32.store offset=28 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -2515,7 +2515,7 @@ i32.store offset=32 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -2713,7 +2713,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -2732,7 +2732,7 @@ i32.store offset=20 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 20 local.get $1 i32.load @@ -2742,7 +2742,7 @@ i32.store offset=24 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -2761,7 +2761,7 @@ i32.store offset=28 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3011,7 +3011,7 @@ i32.store offset=20 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3030,7 +3030,7 @@ i32.store offset=24 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3055,7 +3055,7 @@ i32.store offset=28 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $3) @@ -3064,7 +3064,7 @@ i32.store offset=32 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $3) @@ -3073,7 +3073,7 @@ i32.store offset=36 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -3305,7 +3305,7 @@ i32.store offset=24 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 2576 local.get $3 i32.load @@ -3315,7 +3315,7 @@ i32.store offset=28 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 2624 local.get $4 i32.load @@ -3325,7 +3325,7 @@ i32.store offset=32 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 2656 local.get $5 i32.load @@ -3335,7 +3335,7 @@ i32.store offset=36 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env global.get $~lib/memory/__stack_pointer local.get $1 i32.load @@ -3468,7 +3468,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3200 local.get $3 i32.load @@ -3481,7 +3481,7 @@ i32.store offset=20 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3232 local.get $3 i32.load @@ -3494,7 +3494,7 @@ i32.store offset=24 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3264 local.get $3 i32.load @@ -3504,7 +3504,7 @@ i32.store offset=28 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3578,7 +3578,7 @@ i32.store offset=12 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env global.get $~lib/memory/__stack_pointer i32.const 3328 local.get $0 @@ -3712,7 +3712,7 @@ i32.store offset=20 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3722,7 +3722,7 @@ i32.store offset=24 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -3732,7 +3732,7 @@ i32.store offset=28 local.get $5 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $5 i32.load call_indirect (type $0) @@ -3742,7 +3742,7 @@ i32.store offset=32 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -3831,7 +3831,7 @@ i32.store offset=16 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 local.get $2 i32.load @@ -3851,7 +3851,7 @@ i32.store offset=20 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 21 local.get $3 i32.load @@ -3964,7 +3964,7 @@ i32.store offset=16 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 50 local.get $1 i32.load @@ -3991,7 +3991,7 @@ i32.store offset=20 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 local.get $2 i32.load @@ -4131,7 +4131,7 @@ i32.store offset=40 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -4150,7 +4150,7 @@ i32.store offset=44 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4169,7 +4169,7 @@ i32.store offset=48 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -4181,7 +4181,7 @@ i32.store offset=52 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -4244,7 +4244,7 @@ i32.store offset=16 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -4254,7 +4254,7 @@ i32.store offset=20 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -4322,7 +4322,7 @@ i32.store offset=16 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -4332,7 +4332,7 @@ i32.store offset=20 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -4622,7 +4622,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $0 @@ -4664,7 +4664,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $0 i32.store @@ -4698,7 +4698,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $2 i32.load offset=4 local.tee $3 @@ -4758,7 +4758,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $2 @@ -4834,7 +4834,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $0 i32.store @@ -5041,7 +5041,7 @@ i32.store offset=24 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 50 local.get $4 i32.load @@ -5051,7 +5051,7 @@ i32.store offset=28 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -5070,7 +5070,7 @@ i32.store offset=32 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 30 local.get $1 i32.load @@ -5089,7 +5089,7 @@ i32.store offset=36 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -5108,7 +5108,7 @@ i32.store offset=40 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 200 local.get $1 i32.load @@ -5126,7 +5126,7 @@ i32.store offset=44 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -5145,7 +5145,7 @@ i32.store offset=48 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5164,7 +5164,7 @@ i32.store offset=52 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 100 local.get $4 i32.load @@ -5174,7 +5174,7 @@ i32.store offset=56 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 220 local.get $1 i32.load @@ -5193,7 +5193,7 @@ i32.store offset=60 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -5205,7 +5205,7 @@ i32.store offset=64 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -5246,7 +5246,7 @@ global.get $~lib/memory/__stack_pointer i64.const 0 i64.store - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=8 local.tee $1 @@ -5350,7 +5350,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -5396,7 +5396,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $1 i32.store offset=4 @@ -5435,7 +5435,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $0 @@ -5477,7 +5477,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $0 i32.store @@ -5832,7 +5832,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $2 i32.load offset=4 local.tee $1 @@ -6247,7 +6247,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 local.get $3 i32.load @@ -6523,7 +6523,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $1 i32.store @@ -6563,7 +6563,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $1 i32.store @@ -6603,7 +6603,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $1 i32.store @@ -6751,7 +6751,7 @@ memory.fill global.get $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $2 @@ -6862,7 +6862,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -6926,7 +6926,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -6979,7 +6979,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -7044,7 +7044,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $0 i32.store @@ -7281,7 +7281,7 @@ i32.store offset=28 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -7298,7 +7298,7 @@ i32.store offset=32 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -7316,7 +7316,7 @@ i32.store offset=36 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -7335,7 +7335,7 @@ i32.store offset=40 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -7352,7 +7352,7 @@ i32.store offset=44 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -7370,7 +7370,7 @@ i32.store offset=48 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -7389,7 +7389,7 @@ i32.store offset=52 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -7407,7 +7407,7 @@ i32.store offset=56 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -7426,7 +7426,7 @@ i32.store offset=60 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -7444,7 +7444,7 @@ i32.store offset=64 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -7463,7 +7463,7 @@ i32.store offset=68 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -7480,7 +7480,7 @@ i32.store offset=72 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $3) @@ -7489,7 +7489,7 @@ i32.store offset=76 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -7506,7 +7506,7 @@ i32.store offset=80 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $4 i32.load call_indirect (type $0) @@ -7547,7 +7547,7 @@ i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $1 i32.store offset=8 @@ -7594,7 +7594,7 @@ i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $3 @@ -7644,7 +7644,7 @@ i32.store offset=8 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 local.get $0 local.get $4 @@ -7682,7 +7682,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $0 @@ -7725,7 +7725,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $3 i32.load offset=4 local.tee $2 @@ -8086,7 +8086,7 @@ i32.store offset=24 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 local.get $0 i32.load @@ -8128,7 +8128,7 @@ i32.store offset=32 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 local.get $0 i32.load @@ -8138,7 +8138,7 @@ i32.store offset=36 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 10 local.get $1 i32.load @@ -8148,7 +8148,7 @@ i32.store offset=40 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 25 local.get $1 i32.load @@ -8158,7 +8158,7 @@ i32.store offset=44 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 20 local.get $1 i32.load @@ -8168,7 +8168,7 @@ i32.store offset=48 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8217,7 +8217,7 @@ i32.store offset=52 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -8315,7 +8315,7 @@ i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $2 i32.load offset=4 local.tee $1 @@ -8333,7 +8333,7 @@ i32.store offset=4 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 local.get $2 local.get $0 @@ -8366,7 +8366,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env i32.load offset=4 local.tee $1 i32.store offset=4 @@ -8377,7 +8377,7 @@ i32.store local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $2) @@ -8409,7 +8409,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=8 local.tee $2 @@ -8456,7 +8456,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=8 local.tee $2 @@ -8576,7 +8576,7 @@ i64.const 0 i64.store offset=8 global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $2 @@ -8596,7 +8596,7 @@ i32.store offset=4 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $1) @@ -8649,7 +8649,7 @@ i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $3 @@ -8699,7 +8699,7 @@ i32.store offset=8 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 local.get $3 i32.load @@ -8738,7 +8738,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -8790,7 +8790,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -8844,7 +8844,7 @@ i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $2 @@ -8873,7 +8873,7 @@ i32.store offset=8 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $0 i32.load call_indirect (type $0) @@ -9086,7 +9086,7 @@ i32.store offset=20 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3648 local.get $4 i32.load @@ -9106,7 +9106,7 @@ i32.store offset=24 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -9124,7 +9124,7 @@ i32.store offset=28 local.get $1 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 i32.load call_indirect (type $0) @@ -9144,7 +9144,7 @@ i32.store offset=32 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3680 local.get $4 i32.load @@ -9167,7 +9167,7 @@ i32.store offset=36 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3712 local.get $4 i32.load @@ -9190,7 +9190,7 @@ i32.store offset=40 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3744 local.get $4 i32.load @@ -9225,7 +9225,7 @@ i32.store offset=44 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -9243,7 +9243,7 @@ i32.store offset=48 local.get $2 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $2 i32.load call_indirect (type $0) @@ -9263,7 +9263,7 @@ i32.store offset=52 local.get $4 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env i32.const 3776 local.get $4 i32.load @@ -9516,7 +9516,7 @@ i32.const 20 memory.fill global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $2 i32.load offset=4 local.tee $0 @@ -9567,7 +9567,7 @@ i32.store offset=16 local.get $3 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $3 i32.load call_indirect (type $0) @@ -9613,7 +9613,7 @@ i32.const 20 memory.fill global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $3 i32.load offset=4 local.tee $0 @@ -9677,7 +9677,7 @@ i32.store offset=16 local.get $0 i32.load offset=4 - global.set $$~lib/__closure_env + global.set $~lib/__closure_env local.get $1 local.get $0 i32.load @@ -9793,7 +9793,7 @@ i32.const 0 i32.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $0 i32.load offset=4 local.tee $1 @@ -9864,7 +9864,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - global.get $$~lib/__closure_env + global.get $~lib/__closure_env local.tee $1 i32.load offset=4 local.tee $0