From 46c9eadb5303efeff9b812acc1418fa9e9f2c3b5 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Sat, 11 Jan 2025 21:42:55 -0800 Subject: [PATCH 1/6] Refactor to extract existing inference logic --- src/resolver.ts | 221 ++++++++++++++++++++++++++++-------------------- 1 file changed, 128 insertions(+), 93 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index d0837282e9..d85943234b 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -731,110 +731,145 @@ export class Resolver extends DiagnosticEmitter { // infer generic call if type arguments have been omitted if (prototype.is(CommonFlags.Generic)) { - let contextualTypeArguments = cloneMap(ctxFlow.contextualTypeArguments); + let resolvedTypeArguments = this.inferGenericTypesArguments( + node, + prototype, + prototype.typeParameterNodes, + ctxFlow, + reportMode, + ); + + return this.resolveFunction( + prototype, + resolvedTypeArguments, + cloneMap(ctxFlow.contextualTypeArguments), + reportMode + ); + } - // fill up contextual types with auto for each generic component - let typeParameterNodes = assert(prototype.typeParameterNodes); - let numTypeParameters = typeParameterNodes.length; - let typeParameterNames = new Set(); - for (let i = 0; i < numTypeParameters; ++i) { - let name = typeParameterNodes[i].name.text; - contextualTypeArguments.set(name, Type.auto); - typeParameterNames.add(name); - } - - let parameterNodes = prototype.functionTypeNode.parameters; - let numParameters = parameterNodes.length; - let argumentNodes = node.args; - let numArguments = argumentNodes.length; - - // infer types with generic components while updating contextual types - for (let i = 0; i < numParameters; ++i) { - let argumentExpression = i < numArguments - ? argumentNodes[i] - : parameterNodes[i].initializer; - if (!argumentExpression) { - // optional but not have initializer should be handled in the other place - if (parameterNodes[i].parameterKind == ParameterKind.Optional) { - continue; - } - // missing initializer -> too few arguments - if (reportMode == ReportMode.Report) { - this.error( - DiagnosticCode.Expected_0_arguments_but_got_1, - node.range, numParameters.toString(), numArguments.toString() - ); - } - return null; + // otherwise resolve the non-generic call as usual + return this.resolveFunction(prototype, null, new Map(), reportMode); + } + + inferGenericTypesArguments( + node: CallExpression | NewExpression, + prototype: FunctionPrototype, + typeParameterNodes: TypeParameterNode[] | null, + ctxFlow: Flow, + reportMode: ReportMode = ReportMode.Report, + ): Type[] | null { + + if (!typeParameterNodes) { + return null; + } + + let contextualTypeArguments = cloneMap(ctxFlow.contextualTypeArguments); + + // fill up contextual types with auto for each generic component + let numTypeParameters = typeParameterNodes.length; + let typeParameterNames = new Set(); + for (let i = 0; i < numTypeParameters; ++i) { + let name = typeParameterNodes[i].name.text; + contextualTypeArguments.set(name, Type.auto); + typeParameterNames.add(name); + } + + let parameterNodes = prototype.functionTypeNode.parameters; + let numParameters = parameterNodes.length; + let argumentNodes = node.args; + let numArguments = argumentNodes.length; + + // infer types with generic components while updating contextual types + for (let i = 0; i < numParameters; ++i) { + let argumentExpression = i < numArguments + ? argumentNodes[i] + : parameterNodes[i].initializer; + if (!argumentExpression) { + // optional but not have initializer should be handled in the other place + if (parameterNodes[i].parameterKind == ParameterKind.Optional) { + continue; + } + // missing initializer -> too few arguments + if (reportMode == ReportMode.Report) { + this.error( + DiagnosticCode.Expected_0_arguments_but_got_1, + node.range, numParameters.toString(), numArguments.toString() + ); } - let typeNode = parameterNodes[i].type; - if (typeNode.hasGenericComponent(typeParameterNodes)) { - let type = this.resolveExpression(argumentExpression, ctxFlow, Type.auto, ReportMode.Swallow); - if (type) { - this.propagateInferredGenericTypes( - typeNode, - type, - prototype, - contextualTypeArguments, - typeParameterNames - ); - } + return null; + } + let typeNode = parameterNodes[i].type; + if (typeNode.hasGenericComponent(typeParameterNodes)) { + let type = this.resolveExpression(argumentExpression, ctxFlow, Type.auto, ReportMode.Swallow); + if (type) { + this.propagateInferredGenericTypes( + typeNode, + type, + prototype, + contextualTypeArguments, + typeParameterNames + ); } } + } - // apply concrete types to the generic function signature - let resolvedTypeArguments = new Array(numTypeParameters); - for (let i = 0; i < numTypeParameters; ++i) { - let typeParameterNode = typeParameterNodes[i]; - let name = typeParameterNode.name.text; - if (contextualTypeArguments.has(name)) { - let inferredType = assert(contextualTypeArguments.get(name)); - if (inferredType != Type.auto) { - resolvedTypeArguments[i] = inferredType; - continue; + // apply concrete types to the generic function signature + let resolvedTypeArguments = new Array(numTypeParameters); + for (let i = 0; i < numTypeParameters; ++i) { + let typeParameterNode = typeParameterNodes[i]; + let name = typeParameterNode.name.text; + if (contextualTypeArguments.has(name)) { + let inferredType = assert(contextualTypeArguments.get(name)); + if (inferredType != Type.auto) { + resolvedTypeArguments[i] = inferredType; + continue; + } + let defaultType = typeParameterNode.defaultType; + if (defaultType) { + // Default parameters are resolved in context of the called function, not the calling function + let parent = prototype.parent; + let defaultTypeContextualTypeArguments: Map | null = null; + if (parent.kind == ElementKind.Class) { + defaultTypeContextualTypeArguments = (parent).contextualTypeArguments; + } else if (parent.kind == ElementKind.Function) { + defaultTypeContextualTypeArguments = (parent).contextualTypeArguments; } - let defaultType = typeParameterNode.defaultType; - if (defaultType) { - // Default parameters are resolved in context of the called function, not the calling function - let parent = prototype.parent; - let defaultTypeContextualTypeArguments: Map | null = null; - if (parent.kind == ElementKind.Class) { - defaultTypeContextualTypeArguments = (parent).contextualTypeArguments; - } else if (parent.kind == ElementKind.Function) { - defaultTypeContextualTypeArguments = (parent).contextualTypeArguments; - } - let resolvedDefaultType = this.resolveType( - defaultType, - null, - prototype, - defaultTypeContextualTypeArguments, - reportMode - ); - if (!resolvedDefaultType) return null; - resolvedTypeArguments[i] = resolvedDefaultType; - continue; - } - } - // unused template, e.g. `function test(): void {...}` called as `test()` - // invalid because the type is effectively unknown inside the function body - if (reportMode == ReportMode.Report) { - this.error( - DiagnosticCode.Type_argument_expected, - node.expression.range.atEnd + let resolvedDefaultType = this.resolveType( + defaultType, + null, + prototype, + defaultTypeContextualTypeArguments, + reportMode ); + if (!resolvedDefaultType) return null; + resolvedTypeArguments[i] = resolvedDefaultType; + continue; } - return null; } - return this.resolveFunction( - prototype, - resolvedTypeArguments, - cloneMap(ctxFlow.contextualTypeArguments), - reportMode - ); + // unused template, e.g. `function test(): void {...}` called as `test()` + // invalid because the type is effectively unknown inside the function body + if (reportMode == ReportMode.Report) { + let range: Range; + switch (node.kind) { + case NodeKind.Call: + range = (node).expression.range; + break; + case NodeKind.New: + range = (node).typeName.range; + break; + default: + assert(false); + return null; + } + this.error( + DiagnosticCode.Type_argument_expected, + range.atEnd + ); + } + return null; } - // otherwise resolve the non-generic call as usual - return this.resolveFunction(prototype, null, new Map(), reportMode); + return resolvedTypeArguments; } /** Updates contextual types with a possibly encapsulated inferred type. */ From df03df9381dd501c7c0c4b9dad636053f2e1c578 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Sat, 11 Jan 2025 21:43:27 -0800 Subject: [PATCH 2/6] Infer type arguments for constructor calls --- src/resolver.ts | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index d85943234b..0aa68afbd9 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -731,7 +731,7 @@ export class Resolver extends DiagnosticEmitter { // infer generic call if type arguments have been omitted if (prototype.is(CommonFlags.Generic)) { - let resolvedTypeArguments = this.inferGenericTypesArguments( + let resolvedTypeArguments = this.inferGenericTypeArguments( node, prototype, prototype.typeParameterNodes, @@ -751,7 +751,7 @@ export class Resolver extends DiagnosticEmitter { return this.resolveFunction(prototype, null, new Map(), reportMode); } - inferGenericTypesArguments( + private inferGenericTypeArguments( node: CallExpression | NewExpression, prototype: FunctionPrototype, typeParameterNodes: TypeParameterNode[] | null, @@ -3679,15 +3679,28 @@ export class Resolver extends DiagnosticEmitter { // Resolve type arguments if generic if (prototype.is(CommonFlags.Generic)) { - resolvedTypeArguments = this.resolveTypeArguments( // reports - assert(prototype.typeParameterNodes), // must be present if generic - typeArgumentNodes, - flow, - ctxElement, - ctxTypes, // update - reportNode, - reportMode - ); + + // if no type arguments are provided, try to infer them from the constructor call + if (!typeArgumentNodes && prototype.constructorPrototype && flow) { + resolvedTypeArguments = this.inferGenericTypeArguments( + reportNode as NewExpression, + prototype.constructorPrototype, + prototype.typeParameterNodes, + flow, + ); + } else { + // resolve them from the provided type argument nodes + resolvedTypeArguments = this.resolveTypeArguments( // reports + assert(prototype.typeParameterNodes), // must be present if generic + typeArgumentNodes, + flow, + ctxElement, + ctxTypes, // update + reportNode, + reportMode + ); + } + if (!resolvedTypeArguments) return null; // Otherwise make sure that no type arguments have been specified From 983c40fa1a2bb797dd993845f0ec42957dfbb630 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Sat, 11 Jan 2025 16:05:31 -0800 Subject: [PATCH 3/6] Update tests --- tests/compiler/call-inferred.debug.wat | 2529 +++++++++++++++++++++- tests/compiler/call-inferred.release.wat | 1745 +++++++++++++++ tests/compiler/call-inferred.ts | 18 + 3 files changed, 4282 insertions(+), 10 deletions(-) diff --git a/tests/compiler/call-inferred.debug.wat b/tests/compiler/call-inferred.debug.wat index 9f7eb4fa7e..27172b5f77 100644 --- a/tests/compiler/call-inferred.debug.wat +++ b/tests/compiler/call-inferred.debug.wat @@ -1,16 +1,46 @@ (module - (type $0 (func (param f32) (result f32))) - (type $1 (func)) - (type $2 (func (param i32) (result i32))) - (type $3 (func (param i32 i32 i32 i32))) - (type $4 (func (param f64) (result f64))) + (type $0 (func (param i32) (result i32))) + (type $1 (func (param i32 i32))) + (type $2 (func (param i32))) + (type $3 (func)) + (type $4 (func (param i32 i32) (result i32))) + (type $5 (func (param f32) (result f32))) + (type $6 (func (param i32 i32 i32))) + (type $7 (func (param i32 i32 i32 i32))) + (type $8 (func (param f64) (result f64))) + (type $9 (func (param i32 i32 i64) (result i32))) + (type $10 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~argumentsLength (mut i32) (i32.const 0)) - (global $~lib/memory/__data_end i32 (i32.const 76)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 32844)) - (global $~lib/memory/__heap_base i32 (i32.const 32844)) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Stub i32 (i32.const 0)) + (global $~lib/shared/runtime/Runtime.Minimal i32 (i32.const 1)) + (global $~lib/shared/runtime/Runtime.Incremental i32 (i32.const 2)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) + (global $~lib/rt/__rtti_base i32 (i32.const 480)) + (global $~lib/memory/__data_end i32 (i32.const 508)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33276)) + (global $~lib/memory/__heap_base i32 (i32.const 33276)) (memory $0 1) (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $1 (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data $2 (i32.const 140) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $3 (i32.const 208) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $4 (i32.const 240) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $5 (i32.const 268) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data $6 (i32.const 332) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data $7 (i32.const 384) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $8 (i32.const 412) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $9 (i32.const 480) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) @@ -46,7 +76,2381 @@ local.get $a call $call-inferred/bar ) + (func $~lib/rt/itcms/Object#set:nextWithColor (param $this i32) (param $nextWithColor i32) + local.get $this + local.get $nextWithColor + i32.store offset=4 + ) + (func $~lib/rt/itcms/Object#set:prev (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store offset=8 + ) + (func $~lib/rt/itcms/initLazy (param $space i32) (result i32) + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $space + local.get $space + call $~lib/rt/itcms/Object#set:prev + local.get $space + return + ) + (func $~lib/rt/itcms/Object#get:nextWithColor (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/rt/itcms/Object#get:next (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + return + ) + (func $~lib/rt/itcms/Object#get:color (param $this i32) (result i32) + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + return + ) + (func $~lib/rt/itcms/visitRoots (param $cookie i32) + (local $pn i32) + (local $iter i32) + local.get $cookie + call $~lib/rt/__visit_globals + global.get $~lib/rt/itcms/pinSpace + local.set $pn + local.get $pn + call $~lib/rt/itcms/Object#get:next + local.set $iter + loop $while-continue|0 + local.get $iter + local.get $pn + i32.ne + if + i32.const 1 + drop + local.get $iter + call $~lib/rt/itcms/Object#get:color + i32.const 3 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 160 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $iter + i32.const 20 + i32.add + local.get $cookie + call $~lib/rt/__visit_members + local.get $iter + call $~lib/rt/itcms/Object#get:next + local.set $iter + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/Object#set:color (param $this i32) (param $color i32) + local.get $this + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $color + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#get:prev (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/rt/itcms/Object#set:next (param $this i32) (param $obj i32) + local.get $this + local.get $obj + local.get $this + call $~lib/rt/itcms/Object#get:nextWithColor + i32.const 3 + i32.and + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + ) + (func $~lib/rt/itcms/Object#unlink (param $this i32) + (local $next i32) + (local $prev i32) + local.get $this + call $~lib/rt/itcms/Object#get:next + local.set $next + local.get $next + i32.const 0 + i32.eq + if + i32.const 1 + drop + local.get $this + call $~lib/rt/itcms/Object#get:prev + i32.const 0 + i32.eq + if (result i32) + local.get $this + global.get $~lib/memory/__heap_base + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 160 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + return + end + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.set $prev + i32.const 1 + drop + local.get $prev + i32.eqz + if + i32.const 0 + i32.const 160 + i32.const 132 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $next + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $next + call $~lib/rt/itcms/Object#set:next + ) + (func $~lib/rt/itcms/Object#get:rtId (param $this i32) (result i32) + local.get $this + i32.load offset=12 + ) + (func $~lib/shared/typeinfo/Typeinfo#get:flags (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/__typeinfo (param $id i32) (result i32) + (local $ptr i32) + global.get $~lib/rt/__rtti_base + local.set $ptr + local.get $id + local.get $ptr + i32.load + i32.gt_u + if + i32.const 288 + i32.const 352 + i32.const 21 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $ptr + i32.const 4 + i32.add + local.get $id + i32.const 4 + i32.mul + i32.add + call $~lib/shared/typeinfo/Typeinfo#get:flags + return + ) + (func $~lib/rt/itcms/Object#get:isPointerfree (param $this i32) (result i32) + (local $rtId i32) + local.get $this + call $~lib/rt/itcms/Object#get:rtId + local.set $rtId + local.get $rtId + i32.const 2 + i32.le_u + if (result i32) + i32.const 1 + else + local.get $rtId + call $~lib/rt/__typeinfo + i32.const 32 + i32.and + i32.const 0 + i32.ne + end + return + ) + (func $~lib/rt/itcms/Object#linkTo (param $this i32) (param $list i32) (param $withColor i32) + (local $prev i32) + local.get $list + call $~lib/rt/itcms/Object#get:prev + local.set $prev + local.get $this + local.get $list + local.get $withColor + i32.or + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $this + local.get $prev + call $~lib/rt/itcms/Object#set:prev + local.get $prev + local.get $this + call $~lib/rt/itcms/Object#set:next + local.get $list + local.get $this + call $~lib/rt/itcms/Object#set:prev + ) + (func $~lib/rt/itcms/Object#makeGray (param $this i32) + (local $1 i32) + local.get $this + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $this + call $~lib/rt/itcms/Object#get:prev + local.tee $1 + i32.eqz + if (result i32) + i32.const 0 + i32.const 160 + i32.const 148 + i32.const 30 + call $~lib/builtins/abort + unreachable + else + local.get $1 + end + global.set $~lib/rt/itcms/iter + end + local.get $this + call $~lib/rt/itcms/Object#unlink + local.get $this + global.get $~lib/rt/itcms/toSpace + local.get $this + call $~lib/rt/itcms/Object#get:isPointerfree + if (result i32) + global.get $~lib/rt/itcms/white + i32.eqz + else + i32.const 2 + end + call $~lib/rt/itcms/Object#linkTo + ) + (func $~lib/rt/itcms/__visit (param $ptr i32) (param $cookie i32) + (local $obj i32) + local.get $ptr + i32.eqz + if + return + end + local.get $ptr + i32.const 20 + i32.sub + local.set $obj + i32.const 0 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eq + if + local.get $obj + call $~lib/rt/itcms/Object#makeGray + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/itcms/visitStack (param $cookie i32) + (local $ptr i32) + global.get $~lib/memory/__stack_pointer + local.set $ptr + loop $while-continue|0 + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $ptr + i32.load + local.get $cookie + call $~lib/rt/itcms/__visit + local.get $ptr + i32.const 4 + i32.add + local.set $ptr + br $while-continue|0 + end + end + ) + (func $~lib/rt/common/BLOCK#get:mmInfo (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/itcms/Object#get:size (param $this i32) (result i32) + i32.const 4 + local.get $this + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + return + ) + (func $~lib/rt/tlsf/Root#set:flMap (param $this i32) (param $flMap i32) + local.get $this + local.get $flMap + i32.store + ) + (func $~lib/rt/common/BLOCK#set:mmInfo (param $this i32) (param $mmInfo i32) + local.get $this + local.get $mmInfo + i32.store + ) + (func $~lib/rt/tlsf/Block#set:prev (param $this i32) (param $prev i32) + local.get $this + local.get $prev + i32.store offset=4 + ) + (func $~lib/rt/tlsf/Block#set:next (param $this i32) (param $next i32) + local.get $this + local.get $next + i32.store offset=8 + ) + (func $~lib/rt/tlsf/Block#get:prev (param $this i32) (result i32) + local.get $this + i32.load offset=4 + ) + (func $~lib/rt/tlsf/Block#get:next (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $~lib/rt/tlsf/Root#get:flMap (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/tlsf/removeBlock (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $6 i32) + (local $7 i32) + (local $boundedSize i32) + (local $prev i32) + (local $next i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $root|14 i32) + (local $fl|15 i32) + (local $sl|16 i32) + (local $head i32) + (local $root|18 i32) + (local $fl|19 i32) + (local $slMap i32) + (local $root|21 i32) + (local $fl|22 i32) + (local $slMap|23 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $6 + i32.const 1073741820 + local.tee $7 + local.get $6 + local.get $7 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/tlsf/Block#get:prev + local.set $prev + local.get $block + call $~lib/rt/tlsf/Block#get:next + local.set $next + local.get $prev + if + local.get $prev + local.get $next + call $~lib/rt/tlsf/Block#set:next + end + local.get $next + if + local.get $next + local.get $prev + call $~lib/rt/tlsf/Block#set:prev + end + local.get $block + block $~lib/rt/tlsf/GETHEAD|inlined.0 (result i32) + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.0 + end + i32.eq + if + local.get $root + local.set $root|14 + local.get $fl + local.set $fl|15 + local.get $sl + local.set $sl|16 + local.get $next + local.set $head + local.get $root|14 + local.get $fl|15 + i32.const 4 + i32.shl + local.get $sl|16 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store offset=96 + local.get $next + i32.eqz + if + block $~lib/rt/tlsf/GETSL|inlined.0 (result i32) + local.get $root + local.set $root|18 + local.get $fl + local.set $fl|19 + local.get $root|18 + local.get $fl|19 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.0 + end + local.set $slMap + local.get $root + local.set $root|21 + local.get $fl + local.set $fl|22 + local.get $slMap + i32.const 1 + local.get $sl + i32.shl + i32.const -1 + i32.xor + i32.and + local.tee $slMap + local.set $slMap|23 + local.get $root|21 + local.get $fl|22 + i32.const 2 + i32.shl + i32.add + local.get $slMap|23 + i32.store offset=4 + local.get $slMap + i32.eqz + if + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.const -1 + i32.xor + i32.and + call $~lib/rt/tlsf/Root#set:flMap + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $root i32) (param $block i32) + (local $blockInfo i32) + (local $block|3 i32) + (local $right i32) + (local $rightInfo i32) + (local $block|6 i32) + (local $block|7 i32) + (local $left i32) + (local $leftInfo i32) + (local $size i32) + (local $fl i32) + (local $sl i32) + (local $13 i32) + (local $14 i32) + (local $boundedSize i32) + (local $root|16 i32) + (local $fl|17 i32) + (local $sl|18 i32) + (local $head i32) + (local $root|20 i32) + (local $fl|21 i32) + (local $sl|22 i32) + (local $head|23 i32) + (local $root|24 i32) + (local $fl|25 i32) + (local $root|26 i32) + (local $fl|27 i32) + (local $slMap i32) + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $blockInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETRIGHT|inlined.0 (result i32) + local.get $block + local.set $block|3 + local.get $block|3 + i32.const 4 + i32.add + local.get $block|3 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.0 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + local.get $rightInfo + i32.const 1 + i32.and + if + local.get $root + local.get $right + call $~lib/rt/tlsf/removeBlock + local.get $block + local.get $blockInfo + i32.const 4 + i32.add + local.get $rightInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.1 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.1 + end + local.set $right + local.get $right + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $rightInfo + end + local.get $blockInfo + i32.const 2 + i32.and + if + block $~lib/rt/tlsf/GETFREELEFT|inlined.0 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.sub + i32.load + br $~lib/rt/tlsf/GETFREELEFT|inlined.0 + end + local.set $left + local.get $left + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $leftInfo + i32.const 1 + drop + local.get $leftInfo + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $left + call $~lib/rt/tlsf/removeBlock + local.get $left + local.set $block + local.get $block + local.get $leftInfo + i32.const 4 + i32.add + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + local.tee $blockInfo + call $~lib/rt/common/BLOCK#set:mmInfo + end + local.get $right + local.get $rightInfo + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.set $size + i32.const 1 + drop + local.get $size + i32.const 12 + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + i32.const 1 + drop + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.get $right + i32.eq + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $right + i32.const 4 + i32.sub + local.get $block + i32.store + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + local.tee $13 + i32.const 1073741820 + local.tee $14 + local.get $13 + local.get $14 + i32.lt_u + select + local.set $boundedSize + i32.const 31 + local.get $boundedSize + i32.clz + i32.sub + local.set $fl + local.get $boundedSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.1 (result i32) + local.get $root + local.set $root|16 + local.get $fl + local.set $fl|17 + local.get $sl + local.set $sl|18 + local.get $root|16 + local.get $fl|17 + i32.const 4 + i32.shl + local.get $sl|18 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.1 + end + local.set $head + local.get $block + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $block + local.get $head + call $~lib/rt/tlsf/Block#set:next + local.get $head + if + local.get $head + local.get $block + call $~lib/rt/tlsf/Block#set:prev + end + local.get $root + local.set $root|20 + local.get $fl + local.set $fl|21 + local.get $sl + local.set $sl|22 + local.get $block + local.set $head|23 + local.get $root|20 + local.get $fl|21 + i32.const 4 + i32.shl + local.get $sl|22 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head|23 + i32.store offset=96 + local.get $root + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 1 + local.get $fl + i32.shl + i32.or + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|26 + local.get $fl + local.set $fl|27 + block $~lib/rt/tlsf/GETSL|inlined.1 (result i32) + local.get $root + local.set $root|24 + local.get $fl + local.set $fl|25 + local.get $root|24 + local.get $fl|25 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.1 + end + i32.const 1 + local.get $sl + i32.shl + i32.or + local.set $slMap + local.get $root|26 + local.get $fl|27 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $root i32) (param $start i32) (param $endU64 i64) (result i32) + (local $end i32) + (local $root|4 i32) + (local $tail i32) + (local $tailInfo i32) + (local $size i32) + (local $leftSize i32) + (local $left i32) + (local $root|10 i32) + (local $tail|11 i32) + local.get $endU64 + i32.wrap_i64 + local.set $end + i32.const 1 + drop + local.get $start + i64.extend_i32_u + local.get $endU64 + i64.le_u + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 382 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + local.set $start + local.get $end + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $end + block $~lib/rt/tlsf/GETTAIL|inlined.0 (result i32) + local.get $root + local.set $root|4 + local.get $root|4 + i32.load offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.0 + end + local.set $tail + i32.const 0 + local.set $tailInfo + local.get $tail + if + i32.const 1 + drop + local.get $start + local.get $tail + i32.const 4 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 389 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $start + i32.const 16 + i32.sub + local.get $tail + i32.eq + if + local.get $start + i32.const 16 + i32.sub + local.set $start + local.get $tail + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $tailInfo + else + end + else + i32.const 1 + drop + local.get $start + local.get $root + i32.const 1572 + i32.add + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 402 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $end + local.get $start + i32.sub + local.set $size + local.get $size + i32.const 4 + i32.const 12 + i32.add + i32.const 4 + i32.add + i32.lt_u + if + i32.const 0 + return + end + local.get $size + i32.const 2 + i32.const 4 + i32.mul + i32.sub + local.set $leftSize + local.get $start + local.set $left + local.get $left + local.get $leftSize + i32.const 1 + i32.or + local.get $tailInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:prev + local.get $left + i32.const 0 + call $~lib/rt/tlsf/Block#set:next + local.get $start + i32.const 4 + i32.add + local.get $leftSize + i32.add + local.set $tail + local.get $tail + i32.const 0 + i32.const 2 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.set $root|10 + local.get $tail + local.set $tail|11 + local.get $root|10 + local.get $tail|11 + i32.store offset=1568 + local.get $root + local.get $left + call $~lib/rt/tlsf/insertBlock + i32.const 1 + return + ) + (func $~lib/rt/tlsf/initialize + (local $rootOffset i32) + (local $pagesBefore i32) + (local $pagesNeeded i32) + (local $root i32) + (local $root|4 i32) + (local $tail i32) + (local $fl i32) + (local $root|7 i32) + (local $fl|8 i32) + (local $slMap i32) + (local $sl i32) + (local $root|11 i32) + (local $fl|12 i32) + (local $sl|13 i32) + (local $head i32) + (local $memStart i32) + i32.const 0 + drop + global.get $~lib/memory/__heap_base + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + local.set $rootOffset + memory.size + local.set $pagesBefore + local.get $rootOffset + i32.const 1572 + i32.add + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesNeeded + local.get $pagesBefore + i32.gt_s + if (result i32) + local.get $pagesNeeded + local.get $pagesBefore + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + local.get $rootOffset + local.set $root + local.get $root + i32.const 0 + call $~lib/rt/tlsf/Root#set:flMap + local.get $root + local.set $root|4 + i32.const 0 + local.set $tail + local.get $root|4 + local.get $tail + i32.store offset=1568 + i32.const 0 + local.set $fl + loop $for-loop|0 + local.get $fl + i32.const 23 + i32.lt_u + if + local.get $root + local.set $root|7 + local.get $fl + local.set $fl|8 + i32.const 0 + local.set $slMap + local.get $root|7 + local.get $fl|8 + i32.const 2 + i32.shl + i32.add + local.get $slMap + i32.store offset=4 + i32.const 0 + local.set $sl + loop $for-loop|1 + local.get $sl + i32.const 16 + i32.lt_u + if + local.get $root + local.set $root|11 + local.get $fl + local.set $fl|12 + local.get $sl + local.set $sl|13 + i32.const 0 + local.set $head + local.get $root|11 + local.get $fl|12 + i32.const 4 + i32.shl + local.get $sl|13 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $head + i32.store offset=96 + local.get $sl + i32.const 1 + i32.add + local.set $sl + br $for-loop|1 + end + end + local.get $fl + i32.const 1 + i32.add + local.set $fl + br $for-loop|0 + end + end + local.get $rootOffset + i32.const 1572 + i32.add + local.set $memStart + i32.const 0 + drop + local.get $root + local.get $memStart + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + drop + local.get $root + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/tlsf/checkUsedBlock (param $ptr i32) (result i32) + (local $block i32) + local.get $ptr + i32.const 4 + i32.sub + local.set $block + local.get $ptr + i32.const 0 + i32.ne + if (result i32) + local.get $ptr + i32.const 15 + i32.and + i32.eqz + else + i32.const 0 + end + if (result i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.and + i32.eqz + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 562 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $block + return + ) + (func $~lib/rt/tlsf/freeBlock (param $root i32) (param $block i32) + i32.const 0 + drop + local.get $block + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $block + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/__free (param $ptr i32) + local.get $ptr + global.get $~lib/memory/__heap_base + i32.lt_u + if + return + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $ptr + call $~lib/rt/tlsf/checkUsedBlock + call $~lib/rt/tlsf/freeBlock + ) + (func $~lib/rt/itcms/free (param $obj i32) + local.get $obj + global.get $~lib/memory/__heap_base + i32.lt_u + if + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:nextWithColor + local.get $obj + i32.const 0 + call $~lib/rt/itcms/Object#set:prev + else + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.sub + global.set $~lib/rt/itcms/total + i32.const 0 + drop + local.get $obj + i32.const 4 + i32.add + call $~lib/rt/tlsf/__free + end + ) + (func $~lib/rt/itcms/step (result i32) + (local $obj i32) + (local $1 i32) + (local $black i32) + (local $from i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + local.set $1 + local.get $1 + i32.const 0 + i32.eq + br_if $case0|0 + local.get $1 + i32.const 1 + i32.eq + br_if $case1|0 + local.get $1 + i32.const 2 + i32.eq + br_if $case2|0 + br $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $black + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|1 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + global.set $~lib/rt/itcms/iter + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + i32.const 0 + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.eq + if + i32.const 0 + call $~lib/rt/itcms/visitStack + global.get $~lib/rt/itcms/iter + call $~lib/rt/itcms/Object#get:next + local.set $obj + loop $while-continue|2 + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:color + local.get $black + i32.ne + if + local.get $obj + local.get $black + call $~lib/rt/itcms/Object#set:color + local.get $obj + i32.const 20 + i32.add + i32.const 0 + call $~lib/rt/__visit_members + end + local.get $obj + call $~lib/rt/itcms/Object#get:next + local.set $obj + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $from + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $from + global.set $~lib/rt/itcms/toSpace + local.get $black + global.set $~lib/rt/itcms/white + local.get $from + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.mul + return + end + global.get $~lib/rt/itcms/iter + local.set $obj + local.get $obj + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $obj + call $~lib/rt/itcms/Object#get:next + global.set $~lib/rt/itcms/iter + i32.const 1 + drop + local.get $obj + call $~lib/rt/itcms/Object#get:color + global.get $~lib/rt/itcms/white + i32.eqz + i32.eq + i32.eqz + if + i32.const 0 + i32.const 160 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $obj + call $~lib/rt/itcms/free + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:nextWithColor + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + call $~lib/rt/itcms/Object#set:prev + i32.const 0 + global.set $~lib/rt/itcms/state + br $break|0 + end + i32.const 0 + return + ) + (func $~lib/rt/itcms/interrupt + (local $budget i32) + i32.const 0 + drop + i32.const 0 + drop + i32.const 1024 + i32.const 200 + i32.mul + i32.const 100 + i32.div_u + local.set $budget + loop $do-loop|0 + local.get $budget + call $~lib/rt/itcms/step + i32.sub + local.set $budget + global.get $~lib/rt/itcms/state + i32.const 0 + i32.eq + if + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i32.const 200 + i64.extend_i32_u + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + return + end + local.get $budget + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + i32.const 0 + drop + global.get $~lib/rt/itcms/total + i32.const 1024 + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.mul + i32.add + global.set $~lib/rt/itcms/threshold + i32.const 0 + drop + ) + (func $~lib/rt/tlsf/computeSize (param $size i32) (result i32) + local.get $size + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.add + i32.const 15 + i32.const -1 + i32.xor + i32.and + i32.const 4 + i32.sub + end + return + ) + (func $~lib/rt/tlsf/prepareSize (param $size i32) (result i32) + local.get $size + i32.const 1073741820 + i32.gt_u + if + i32.const 96 + i32.const 432 + i32.const 461 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $size + call $~lib/rt/tlsf/computeSize + return + ) + (func $~lib/rt/tlsf/roundSize (param $size i32) (result i32) + local.get $size + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $size + i32.const 1 + i32.const 27 + local.get $size + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $size + end + return + ) + (func $~lib/rt/tlsf/searchBlock (param $root i32) (param $size i32) (result i32) + (local $fl i32) + (local $sl i32) + (local $requestSize i32) + (local $root|5 i32) + (local $fl|6 i32) + (local $slMap i32) + (local $head i32) + (local $flMap i32) + (local $root|10 i32) + (local $fl|11 i32) + (local $root|12 i32) + (local $fl|13 i32) + (local $sl|14 i32) + (local $root|15 i32) + (local $fl|16 i32) + (local $sl|17 i32) + local.get $size + i32.const 256 + i32.lt_u + if + i32.const 0 + local.set $fl + local.get $size + i32.const 4 + i32.shr_u + local.set $sl + else + local.get $size + call $~lib/rt/tlsf/roundSize + local.set $requestSize + i32.const 4 + i32.const 8 + i32.mul + i32.const 1 + i32.sub + local.get $requestSize + i32.clz + i32.sub + local.set $fl + local.get $requestSize + local.get $fl + i32.const 4 + i32.sub + i32.shr_u + i32.const 1 + i32.const 4 + i32.shl + i32.xor + local.set $sl + local.get $fl + i32.const 8 + i32.const 1 + i32.sub + i32.sub + local.set $fl + end + i32.const 1 + drop + local.get $fl + i32.const 23 + i32.lt_u + if (result i32) + local.get $sl + i32.const 16 + i32.lt_u + else + i32.const 0 + end + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETSL|inlined.2 (result i32) + local.get $root + local.set $root|5 + local.get $fl + local.set $fl|6 + local.get $root|5 + local.get $fl|6 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.2 + end + i32.const 0 + i32.const -1 + i32.xor + local.get $sl + i32.shl + i32.and + local.set $slMap + i32.const 0 + local.set $head + local.get $slMap + i32.eqz + if + local.get $root + call $~lib/rt/tlsf/Root#get:flMap + i32.const 0 + i32.const -1 + i32.xor + local.get $fl + i32.const 1 + i32.add + i32.shl + i32.and + local.set $flMap + local.get $flMap + i32.eqz + if + i32.const 0 + local.set $head + else + local.get $flMap + i32.ctz + local.set $fl + block $~lib/rt/tlsf/GETSL|inlined.3 (result i32) + local.get $root + local.set $root|10 + local.get $fl + local.set $fl|11 + local.get $root|10 + local.get $fl|11 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + br $~lib/rt/tlsf/GETSL|inlined.3 + end + local.set $slMap + i32.const 1 + drop + local.get $slMap + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + block $~lib/rt/tlsf/GETHEAD|inlined.2 (result i32) + local.get $root + local.set $root|12 + local.get $fl + local.set $fl|13 + local.get $slMap + i32.ctz + local.set $sl|14 + local.get $root|12 + local.get $fl|13 + i32.const 4 + i32.shl + local.get $sl|14 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.2 + end + local.set $head + end + else + block $~lib/rt/tlsf/GETHEAD|inlined.3 (result i32) + local.get $root + local.set $root|15 + local.get $fl + local.set $fl|16 + local.get $slMap + i32.ctz + local.set $sl|17 + local.get $root|15 + local.get $fl|16 + i32.const 4 + i32.shl + local.get $sl|17 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + br $~lib/rt/tlsf/GETHEAD|inlined.3 + end + local.set $head + end + local.get $head + return + ) + (func $~lib/rt/tlsf/growMemory (param $root i32) (param $size i32) + (local $pagesBefore i32) + (local $root|3 i32) + (local $pagesNeeded i32) + (local $5 i32) + (local $6 i32) + (local $pagesWanted i32) + (local $pagesAfter i32) + i32.const 0 + drop + local.get $size + i32.const 256 + i32.ge_u + if + local.get $size + call $~lib/rt/tlsf/roundSize + local.set $size + end + memory.size + local.set $pagesBefore + local.get $size + i32.const 4 + local.get $pagesBefore + i32.const 16 + i32.shl + i32.const 4 + i32.sub + block $~lib/rt/tlsf/GETTAIL|inlined.1 (result i32) + local.get $root + local.set $root|3 + local.get $root|3 + i32.load offset=1568 + br $~lib/rt/tlsf/GETTAIL|inlined.1 + end + i32.ne + i32.shl + i32.add + local.set $size + local.get $size + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + local.set $pagesNeeded + local.get $pagesBefore + local.tee $5 + local.get $pagesNeeded + local.tee $6 + local.get $5 + local.get $6 + i32.gt_s + select + local.set $pagesWanted + local.get $pagesWanted + memory.grow + i32.const 0 + i32.lt_s + if + local.get $pagesNeeded + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + memory.size + local.set $pagesAfter + local.get $root + local.get $pagesBefore + i32.const 16 + i32.shl + local.get $pagesAfter + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + drop + ) + (func $~lib/rt/tlsf/prepareBlock (param $root i32) (param $block i32) (param $size i32) + (local $blockInfo i32) + (local $remaining i32) + (local $spare i32) + (local $block|6 i32) + (local $block|7 i32) + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + local.set $blockInfo + i32.const 1 + drop + local.get $size + i32.const 4 + i32.add + i32.const 15 + i32.and + i32.eqz + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $blockInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $size + i32.sub + local.set $remaining + local.get $remaining + i32.const 4 + i32.const 12 + i32.add + i32.ge_u + if + local.get $block + local.get $size + local.get $blockInfo + i32.const 2 + i32.and + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $block + i32.const 4 + i32.add + local.get $size + i32.add + local.set $spare + local.get $spare + local.get $remaining + i32.const 4 + i32.sub + i32.const 1 + i32.or + call $~lib/rt/common/BLOCK#set:mmInfo + local.get $root + local.get $spare + call $~lib/rt/tlsf/insertBlock + else + local.get $block + local.get $blockInfo + i32.const 1 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + block $~lib/rt/tlsf/GETRIGHT|inlined.3 (result i32) + local.get $block + local.set $block|7 + local.get $block|7 + i32.const 4 + i32.add + local.get $block|7 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.3 + end + block $~lib/rt/tlsf/GETRIGHT|inlined.2 (result i32) + local.get $block + local.set $block|6 + local.get $block|6 + i32.const 4 + i32.add + local.get $block|6 + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + i32.add + br $~lib/rt/tlsf/GETRIGHT|inlined.2 + end + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 2 + i32.const -1 + i32.xor + i32.and + call $~lib/rt/common/BLOCK#set:mmInfo + end + ) + (func $~lib/rt/tlsf/allocateBlock (param $root i32) (param $size i32) (result i32) + (local $payloadSize i32) + (local $block i32) + local.get $size + call $~lib/rt/tlsf/prepareSize + local.set $payloadSize + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + local.get $block + i32.eqz + if + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/growMemory + local.get $root + local.get $payloadSize + call $~lib/rt/tlsf/searchBlock + local.set $block + i32.const 1 + drop + local.get $block + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 499 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + i32.const 1 + drop + local.get $block + call $~lib/rt/common/BLOCK#get:mmInfo + i32.const 3 + i32.const -1 + i32.xor + i32.and + local.get $payloadSize + i32.ge_u + i32.eqz + if + i32.const 0 + i32.const 432 + i32.const 501 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $root + local.get $block + call $~lib/rt/tlsf/removeBlock + local.get $root + local.get $block + local.get $payloadSize + call $~lib/rt/tlsf/prepareBlock + i32.const 0 + drop + local.get $block + return + ) + (func $~lib/rt/tlsf/__alloc (param $size i32) (result i32) + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.get $size + call $~lib/rt/tlsf/allocateBlock + i32.const 4 + i32.add + return + ) + (func $~lib/rt/itcms/Object#set:rtId (param $this i32) (param $rtId i32) + local.get $this + local.get $rtId + i32.store offset=12 + ) + (func $~lib/rt/itcms/Object#set:rtSize (param $this i32) (param $rtSize i32) + local.get $this + local.get $rtSize + i32.store offset=16 + ) + (func $~lib/rt/itcms/__new (param $size i32) (param $id i32) (result i32) + (local $obj i32) + (local $ptr i32) + local.get $size + i32.const 1073741804 + i32.ge_u + if + i32.const 96 + i32.const 160 + 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 + call $~lib/rt/itcms/interrupt + end + i32.const 16 + local.get $size + i32.add + call $~lib/rt/tlsf/__alloc + i32.const 4 + i32.sub + local.set $obj + local.get $obj + local.get $id + call $~lib/rt/itcms/Object#set:rtId + local.get $obj + local.get $size + call $~lib/rt/itcms/Object#set:rtSize + local.get $obj + global.get $~lib/rt/itcms/fromSpace + global.get $~lib/rt/itcms/white + call $~lib/rt/itcms/Object#linkTo + global.get $~lib/rt/itcms/total + local.get $obj + call $~lib/rt/itcms/Object#get:size + i32.add + global.set $~lib/rt/itcms/total + local.get $obj + i32.const 20 + i32.add + local.set $ptr + local.get $ptr + i32.const 0 + local.get $size + memory.fill + local.get $ptr + return + ) + (func $call-inferred/Foo#set:value (param $this i32) (param $value i32) + local.get $this + local.get $value + i32.store + ) + (func $call-inferred/Foo#get:value (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $call-inferred/Foo.create (param $value i32) (result i32) + i32.const 0 + local.get $value + call $call-inferred/Foo#constructor + return + ) + (func $call-inferred/Bar#doSomething (param $this i32) (param $a i32) (result i32) + local.get $a + return + ) + (func $~lib/rt/__visit_globals (param $0 i32) + (local $1 i32) + i32.const 288 + local.get $0 + call $~lib/rt/itcms/__visit + i32.const 96 + 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.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) + (func $~lib/object/Object~visit (param $0 i32) (param $1 i32) + ) + (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) + block $invalid + block $call-inferred/Bar + block $call-inferred/Foo + 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 $call-inferred/Foo $call-inferred/Bar $invalid + end + return + end + return + end + return + end + local.get $0 + local.get $1 + call $~lib/arraybuffer/ArrayBufferView~visit + return + end + return + end + return + end + unreachable + ) + (func $~start + call $start:call-inferred + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 33296 + i32.const 33344 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $call-inferred/Foo#constructor (param $this i32) (param $value i32) (result i32) + (local $2 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + local.get $2 + i32.store offset=4 + local.get $2 + local.get $value + call $call-inferred/Foo#set:value + local.get $this + local.set $2 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $2 + ) + (func $call-inferred/Bar#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/object/Object#constructor + local.tee $this + i32.store + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) (func $start:call-inferred + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store i32.const 42 call $call-inferred/foo i32.const 42 @@ -101,8 +2505,113 @@ call $~lib/builtins/abort unreachable end + 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 208 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/pinSpace + i32.const 240 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/toSpace + i32.const 384 + call $~lib/rt/itcms/initLazy + global.set $~lib/rt/itcms/fromSpace + i32.const 0 + i32.const 42 + call $call-inferred/Foo#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $call-inferred/Foo#get:value + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 42 + call $call-inferred/Foo.create + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $call-inferred/Foo#get:value + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 23 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $call-inferred/Bar#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 42 + call $call-inferred/Bar#doSomething + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 31 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer ) - (func $~start - call $start:call-inferred + (func $~lib/object/Object#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 ) ) diff --git a/tests/compiler/call-inferred.release.wat b/tests/compiler/call-inferred.release.wat index d3392d9a85..afc3e73002 100644 --- a/tests/compiler/call-inferred.release.wat +++ b/tests/compiler/call-inferred.release.wat @@ -1,6 +1,1751 @@ (module + (type $0 (func)) + (type $1 (func (param i32))) + (type $2 (func (param i32 i32))) + (type $3 (func (result i32))) + (type $4 (func (param i32 i32) (result i32))) + (type $5 (func (param i32 i32 i32 i32))) + (type $6 (func (param i32 i32 i64))) + (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/state (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/visitCount (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/pinSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/iter (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/toSpace (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) + (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) + (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34300)) (memory $0 1) (data $0 (i32.const 1036) "<") (data $0.1 (i32.const 1048) "\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s") + (data $1 (i32.const 1100) "<") + (data $1.1 (i32.const 1112) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data $2 (i32.const 1164) "<") + (data $2.1 (i32.const 1176) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data $5 (i32.const 1292) "<") + (data $5.1 (i32.const 1304) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data $6 (i32.const 1356) ",") + (data $6.1 (i32.const 1368) "\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data $8 (i32.const 1436) "<") + (data $8.1 (i32.const 1448) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data $9 (i32.const 1504) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 ") (export "memory" (memory $0)) + (start $~start) + (func $~lib/rt/itcms/visitRoots + (local $0 i32) + (local $1 i32) + i32.const 1312 + call $~lib/rt/itcms/__visit + i32.const 1120 + call $~lib/rt/itcms/__visit + global.get $~lib/rt/itcms/pinSpace + local.tee $1 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|0 + local.get $0 + local.get $1 + i32.ne + if + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.const 3 + i32.ne + if + i32.const 0 + i32.const 1184 + i32.const 160 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|0 + end + end + ) + (func $~lib/rt/itcms/__visit (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 + i32.eq + if + local.get $1 + global.get $~lib/rt/itcms/iter + i32.eq + if + local.get $1 + i32.load offset=8 + local.tee $0 + i32.eqz + if + i32.const 0 + i32.const 1184 + 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$122 + local.get $1 + i32.load offset=4 + i32.const -4 + i32.and + local.tee $0 + i32.eqz + if + local.get $1 + i32.load offset=8 + i32.eqz + local.get $1 + i32.const 34300 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1184 + i32.const 128 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + br $__inlined_func$~lib/rt/itcms/Object#unlink$122 + end + local.get $1 + i32.load offset=8 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1184 + 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 1504 + i32.load + i32.gt_u + if + i32.const 1312 + i32.const 1376 + i32.const 21 + i32.const 28 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 2 + i32.shl + i32.const 1508 + i32.add + i32.load + i32.const 32 + i32.and + end + local.set $3 + local.get $2 + i32.load offset=8 + local.set $0 + local.get $1 + 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 $1 + local.get $0 + i32.store offset=8 + local.get $0 + local.get $1 + local.get $0 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + local.get $2 + local.get $1 + i32.store offset=8 + global.get $~lib/rt/itcms/visitCount + i32.const 1 + i32.add + global.set $~lib/rt/itcms/visitCount + end + ) + (func $~lib/rt/tlsf/removeBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 268 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const -4 + i32.and + local.tee $3 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 1456 + i32.const 270 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $3 + i32.const 256 + i32.lt_u + if (result i32) + local.get $3 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $3 + local.get $3 + i32.const 1073741820 + i32.ge_u + select + local.tee $3 + i32.clz + i32.sub + local.tee $4 + i32.const 7 + i32.sub + local.set $2 + local.get $3 + local.get $4 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $3 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 284 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load offset=8 + local.set $5 + local.get $1 + i32.load offset=4 + local.tee $4 + if + local.get $4 + local.get $5 + i32.store offset=8 + end + local.get $5 + if + local.get $5 + local.get $4 + i32.store offset=4 + end + local.get $1 + local.get $0 + local.get $2 + i32.const 4 + i32.shl + local.get $3 + i32.add + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load offset=96 + i32.eq + if + local.get $1 + local.get $5 + i32.store offset=96 + local.get $5 + i32.eqz + if + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + local.tee $1 + i32.load offset=4 + i32.const -2 + local.get $3 + i32.rotl + i32.and + local.set $3 + local.get $1 + local.get $3 + i32.store offset=4 + local.get $3 + i32.eqz + if + local.get $0 + local.get $0 + i32.load + i32.const -2 + local.get $2 + i32.rotl + i32.and + i32.store + end + end + end + ) + (func $~lib/rt/tlsf/insertBlock (param $0 i32) (param $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + local.get $1 + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 201 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.load + local.tee $3 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 203 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.tee $2 + i32.const 1 + i32.and + if + local.get $0 + local.get $4 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $3 + i32.const 4 + i32.add + local.get $2 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store + local.get $1 + i32.const 4 + i32.add + local.get $1 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $4 + i32.load + local.set $2 + end + local.get $3 + i32.const 2 + i32.and + if + local.get $1 + i32.const 4 + i32.sub + i32.load + local.tee $1 + i32.load + local.tee $6 + i32.const 1 + i32.and + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 221 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $1 + call $~lib/rt/tlsf/removeBlock + local.get $1 + local.get $6 + i32.const 4 + i32.add + local.get $3 + i32.const -4 + i32.and + i32.add + local.tee $3 + i32.store + end + local.get $4 + local.get $2 + i32.const 2 + i32.or + i32.store + local.get $3 + i32.const -4 + i32.and + local.tee $2 + i32.const 12 + i32.lt_u + if + i32.const 0 + i32.const 1456 + i32.const 233 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $1 + i32.const 4 + i32.add + local.get $2 + i32.add + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 234 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + i32.const 4 + i32.sub + local.get $1 + i32.store + local.get $2 + i32.const 256 + i32.lt_u + if (result i32) + local.get $2 + i32.const 4 + i32.shr_u + else + i32.const 31 + i32.const 1073741820 + local.get $2 + local.get $2 + i32.const 1073741820 + i32.ge_u + select + local.tee $2 + i32.clz + i32.sub + local.tee $3 + i32.const 7 + i32.sub + local.set $5 + local.get $2 + local.get $3 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + end + local.tee $2 + i32.const 16 + i32.lt_u + local.get $5 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 251 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + local.set $3 + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + local.get $3 + i32.store offset=8 + local.get $3 + if + local.get $3 + local.get $1 + i32.store offset=4 + end + local.get $0 + local.get $5 + i32.const 4 + i32.shl + local.get $2 + i32.add + i32.const 2 + i32.shl + i32.add + local.get $1 + i32.store offset=96 + local.get $0 + local.get $0 + i32.load + i32.const 1 + local.get $5 + i32.shl + i32.or + i32.store + local.get $0 + local.get $5 + i32.const 2 + i32.shl + i32.add + local.tee $0 + local.get $0 + i32.load offset=4 + i32.const 1 + local.get $2 + i32.shl + i32.or + i32.store offset=4 + ) + (func $~lib/rt/tlsf/addMemory (param $0 i32) (param $1 i32) (param $2 i64) + (local $3 i32) + (local $4 i32) + (local $5 i32) + local.get $2 + local.get $1 + i64.extend_i32_u + i64.lt_u + if + i32.const 0 + i32.const 1456 + i32.const 382 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $1 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + local.set $1 + local.get $0 + i32.load offset=1568 + local.tee $3 + if + local.get $3 + i32.const 4 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 1456 + i32.const 389 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + local.get $3 + local.get $1 + i32.const 16 + i32.sub + local.tee $5 + i32.eq + if + local.get $3 + i32.load + local.set $4 + local.get $5 + local.set $1 + end + else + local.get $0 + i32.const 1572 + i32.add + local.get $1 + i32.gt_u + if + i32.const 0 + i32.const 1456 + i32.const 402 + i32.const 5 + call $~lib/builtins/abort + unreachable + end + end + local.get $2 + i32.wrap_i64 + i32.const -16 + i32.and + local.get $1 + i32.sub + local.tee $3 + i32.const 20 + i32.lt_u + if + return + end + local.get $1 + local.get $4 + i32.const 2 + i32.and + local.get $3 + i32.const 8 + i32.sub + local.tee $3 + i32.const 1 + i32.or + i32.or + i32.store + local.get $1 + i32.const 0 + i32.store offset=4 + local.get $1 + i32.const 0 + i32.store offset=8 + local.get $1 + i32.const 4 + i32.add + local.get $3 + i32.add + local.tee $3 + i32.const 2 + i32.store + local.get $0 + local.get $3 + i32.store offset=1568 + local.get $0 + local.get $1 + call $~lib/rt/tlsf/insertBlock + ) + (func $~lib/rt/tlsf/initialize + (local $0 i32) + (local $1 i32) + memory.size + local.tee $1 + i32.const 0 + i32.le_s + if (result i32) + i32.const 1 + local.get $1 + i32.sub + memory.grow + i32.const 0 + i32.lt_s + else + i32.const 0 + end + if + unreachable + end + i32.const 34304 + i32.const 0 + i32.store + i32.const 35872 + i32.const 0 + i32.store + loop $for-loop|0 + local.get $0 + i32.const 23 + i32.lt_u + if + local.get $0 + i32.const 2 + i32.shl + i32.const 34304 + i32.add + i32.const 0 + i32.store offset=4 + i32.const 0 + local.set $1 + loop $for-loop|1 + local.get $1 + i32.const 16 + i32.lt_u + if + local.get $0 + i32.const 4 + i32.shl + local.get $1 + i32.add + i32.const 2 + i32.shl + i32.const 34304 + i32.add + i32.const 0 + i32.store offset=96 + local.get $1 + i32.const 1 + i32.add + local.set $1 + br $for-loop|1 + end + end + local.get $0 + i32.const 1 + i32.add + local.set $0 + br $for-loop|0 + end + end + i32.const 34304 + i32.const 35876 + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + i32.const 34304 + global.set $~lib/rt/tlsf/ROOT + ) + (func $~lib/rt/itcms/step (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + block $break|0 + block $case2|0 + block $case1|0 + block $case0|0 + global.get $~lib/rt/itcms/state + br_table $case0|0 $case1|0 $case2|0 $break|0 + end + i32.const 1 + global.set $~lib/rt/itcms/state + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/white + i32.eqz + local.set $1 + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|1 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + global.set $~lib/rt/itcms/iter + local.get $1 + local.get $0 + i32.load offset=4 + local.tee $2 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $2 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store offset=4 + i32.const 0 + global.set $~lib/rt/itcms/visitCount + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + global.get $~lib/rt/itcms/visitCount + return + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|1 + end + end + i32.const 0 + global.set $~lib/rt/itcms/visitCount + call $~lib/rt/itcms/visitRoots + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + i32.eq + if + global.get $~lib/memory/__stack_pointer + local.set $0 + loop $while-continue|0 + local.get $0 + i32.const 34300 + i32.lt_u + if + local.get $0 + i32.load + call $~lib/rt/itcms/__visit + local.get $0 + i32.const 4 + i32.add + local.set $0 + br $while-continue|0 + end + end + global.get $~lib/rt/itcms/iter + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + loop $while-continue|2 + local.get $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $1 + local.get $0 + i32.load offset=4 + local.tee $2 + i32.const 3 + i32.and + i32.ne + if + local.get $0 + local.get $2 + i32.const -4 + i32.and + local.get $1 + i32.or + i32.store offset=4 + local.get $0 + i32.const 20 + i32.add + call $~lib/rt/__visit_members + end + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + local.set $0 + br $while-continue|2 + end + end + global.get $~lib/rt/itcms/fromSpace + local.set $0 + global.get $~lib/rt/itcms/toSpace + global.set $~lib/rt/itcms/fromSpace + local.get $0 + global.set $~lib/rt/itcms/toSpace + local.get $1 + global.set $~lib/rt/itcms/white + local.get $0 + i32.load offset=4 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + i32.const 2 + global.set $~lib/rt/itcms/state + end + global.get $~lib/rt/itcms/visitCount + return + end + global.get $~lib/rt/itcms/iter + local.tee $0 + global.get $~lib/rt/itcms/toSpace + i32.ne + if + local.get $0 + i32.load offset=4 + local.tee $1 + i32.const -4 + i32.and + global.set $~lib/rt/itcms/iter + global.get $~lib/rt/itcms/white + i32.eqz + local.get $1 + i32.const 3 + i32.and + i32.ne + if + i32.const 0 + i32.const 1184 + i32.const 229 + i32.const 20 + call $~lib/builtins/abort + unreachable + end + local.get $0 + i32.const 34300 + i32.lt_u + if + local.get $0 + i32.const 0 + i32.store offset=4 + local.get $0 + i32.const 0 + i32.store offset=8 + else + global.get $~lib/rt/itcms/total + local.get $0 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.sub + global.set $~lib/rt/itcms/total + local.get $0 + i32.const 4 + i32.add + local.tee $0 + i32.const 34300 + i32.ge_u + if + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.set $2 + local.get $0 + i32.const 15 + i32.and + i32.const 1 + local.get $0 + select + if (result i32) + i32.const 1 + else + local.get $2 + i32.load + i32.const 1 + i32.and + end + if + i32.const 0 + i32.const 1456 + i32.const 562 + i32.const 3 + call $~lib/builtins/abort + unreachable + end + local.get $2 + local.get $2 + i32.load + i32.const 1 + i32.or + i32.store + local.get $1 + local.get $2 + call $~lib/rt/tlsf/insertBlock + end + end + i32.const 10 + return + end + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=4 + global.get $~lib/rt/itcms/toSpace + global.get $~lib/rt/itcms/toSpace + i32.store offset=8 + i32.const 0 + global.set $~lib/rt/itcms/state + end + i32.const 0 + ) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + local.get $1 + i32.const 4 + i32.shr_u + local.set $1 + else + local.get $1 + i32.const 536870910 + i32.lt_u + if + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + local.set $1 + end + local.get $1 + i32.const 31 + local.get $1 + i32.clz + i32.sub + local.tee $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $1 + local.get $2 + i32.const 7 + i32.sub + local.set $2 + end + local.get $1 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + i32.const -1 + local.get $1 + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.get $2 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + local.get $0 + i32.load + i32.const -1 + local.get $2 + i32.const 1 + i32.add + i32.shl + i32.and + local.tee $1 + if (result i32) + local.get $0 + local.get $1 + i32.ctz + local.tee $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=4 + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 347 + i32.const 18 + call $~lib/builtins/abort + unreachable + end + local.get $0 + local.get $2 + i32.ctz + local.get $1 + i32.const 4 + i32.shl + i32.add + i32.const 2 + i32.shl + i32.add + i32.load offset=96 + else + i32.const 0 + end + end + ) + (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 1120 + i32.const 1184 + 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$70 + i32.const 2048 + local.set $2 + loop $do-loop|0 + local.get $2 + call $~lib/rt/itcms/step + i32.sub + local.set $2 + global.get $~lib/rt/itcms/state + i32.eqz + if + global.get $~lib/rt/itcms/total + i64.extend_i32_u + i64.const 200 + i64.mul + i64.const 100 + i64.div_u + i32.wrap_i64 + i32.const 1024 + i32.add + global.set $~lib/rt/itcms/threshold + br $__inlined_func$~lib/rt/itcms/interrupt$70 + end + local.get $2 + i32.const 0 + i32.gt_s + br_if $do-loop|0 + end + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/total + global.get $~lib/rt/itcms/threshold + i32.sub + i32.const 1024 + i32.lt_u + i32.const 10 + i32.shl + i32.add + global.set $~lib/rt/itcms/threshold + end + end + global.get $~lib/rt/tlsf/ROOT + i32.eqz + if + call $~lib/rt/tlsf/initialize + end + global.get $~lib/rt/tlsf/ROOT + local.set $4 + local.get $0 + i32.const 16 + i32.add + local.tee $2 + i32.const 1073741820 + i32.gt_u + if + i32.const 1120 + i32.const 1456 + i32.const 461 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $2 + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $2 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + end + local.tee $5 + call $~lib/rt/tlsf/searchBlock + local.tee $2 + i32.eqz + if + memory.size + local.tee $2 + local.get $5 + i32.const 256 + i32.ge_u + if (result i32) + local.get $5 + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $5 + i32.const 1 + i32.const 27 + local.get $5 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $5 + end + else + local.get $5 + end + i32.const 4 + local.get $4 + i32.load offset=1568 + local.get $2 + i32.const 16 + i32.shl + i32.const 4 + i32.sub + i32.ne + i32.shl + i32.add + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + local.tee $3 + local.get $2 + local.get $3 + i32.gt_s + select + memory.grow + i32.const 0 + i32.lt_s + if + local.get $3 + memory.grow + i32.const 0 + i32.lt_s + if + unreachable + end + end + local.get $4 + local.get $2 + i32.const 16 + i32.shl + memory.size + i64.extend_i32_s + i64.const 16 + i64.shl + call $~lib/rt/tlsf/addMemory + local.get $4 + local.get $5 + call $~lib/rt/tlsf/searchBlock + local.tee $2 + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 499 + i32.const 16 + call $~lib/builtins/abort + unreachable + end + end + local.get $5 + local.get $2 + i32.load + i32.const -4 + i32.and + i32.gt_u + if + i32.const 0 + i32.const 1456 + i32.const 501 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $2 + call $~lib/rt/tlsf/removeBlock + local.get $2 + i32.load + local.set $6 + local.get $5 + i32.const 4 + i32.add + i32.const 15 + i32.and + if + i32.const 0 + i32.const 1456 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $6 + i32.const -4 + i32.and + local.get $5 + i32.sub + local.tee $3 + i32.const 16 + i32.ge_u + if + local.get $2 + local.get $5 + local.get $6 + i32.const 2 + i32.and + i32.or + i32.store + local.get $2 + i32.const 4 + i32.add + local.get $5 + i32.add + local.tee $5 + local.get $3 + i32.const 4 + i32.sub + i32.const 1 + i32.or + i32.store + local.get $4 + local.get $5 + call $~lib/rt/tlsf/insertBlock + else + local.get $2 + local.get $6 + i32.const -2 + i32.and + i32.store + local.get $2 + i32.const 4 + i32.add + local.get $2 + i32.load + i32.const -4 + i32.and + i32.add + local.tee $3 + local.get $3 + i32.load + i32.const -3 + i32.and + i32.store + end + local.get $2 + local.get $1 + i32.store offset=12 + local.get $2 + local.get $0 + i32.store offset=16 + global.get $~lib/rt/itcms/fromSpace + local.tee $1 + i32.load offset=8 + local.set $3 + local.get $2 + local.get $1 + global.get $~lib/rt/itcms/white + i32.or + i32.store offset=4 + local.get $2 + local.get $3 + i32.store offset=8 + local.get $3 + local.get $2 + local.get $3 + i32.load offset=4 + i32.const 3 + i32.and + i32.or + i32.store offset=4 + local.get $1 + local.get $2 + i32.store offset=8 + global.get $~lib/rt/itcms/total + local.get $2 + i32.load + i32.const -4 + i32.and + i32.const 4 + i32.add + i32.add + global.set $~lib/rt/itcms/total + local.get $2 + i32.const 20 + i32.add + local.tee $1 + i32.const 0 + local.get $0 + memory.fill + local.get $1 + ) + (func $~lib/rt/__visit_members (param $0 i32) + block $invalid + block $call-inferred/Bar + block $call-inferred/Foo + 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 $call-inferred/Foo $call-inferred/Bar $invalid + end + return + end + return + end + return + end + local.get $0 + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return + end + return + end + return + end + unreachable + ) + (func $~start + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 1532 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + memory.size + i32.const 16 + i32.shl + i32.const 34300 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1236 + i32.const 1232 + i32.store + i32.const 1240 + i32.const 1232 + i32.store + i32.const 1232 + global.set $~lib/rt/itcms/pinSpace + i32.const 1268 + i32.const 1264 + i32.store + i32.const 1272 + i32.const 1264 + i32.store + i32.const 1264 + global.set $~lib/rt/itcms/toSpace + i32.const 1412 + i32.const 1408 + i32.store + i32.const 1416 + i32.const 1408 + i32.store + i32.const 1408 + global.set $~lib/rt/itcms/fromSpace + call $call-inferred/Foo#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + i32.const 42 + i32.ne + if + i32.const 0 + i32.const 1056 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + call $call-inferred/Foo#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + i32.const 42 + i32.ne + if + i32.const 0 + i32.const 1056 + i32.const 23 + 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 1532 + 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.const 5 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1532 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 34320 + i32.const 34368 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $call-inferred/Foo#constructor (result i32) + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1532 + i32.lt_s + if + i32.const 34320 + i32.const 34368 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 42 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) ) diff --git a/tests/compiler/call-inferred.ts b/tests/compiler/call-inferred.ts index b0ec7e57b6..7af653db1f 100644 --- a/tests/compiler/call-inferred.ts +++ b/tests/compiler/call-inferred.ts @@ -12,6 +12,24 @@ function bar(a: T = 42.0): T { assert(bar() == 42); +class Foo { + constructor(public value: T) {} + static create(value: T): Foo { + return new Foo(value); + } +} + +assert(new Foo(42).value == 42); +assert(Foo.create(42).value == 42); + +class Bar { + doSomething(a: T): T { + return a; + } +} + +assert(new Bar().doSomething(42) == 42); + // TODO: this'd require return type inference, i.e., omitted return type // function baz(a: i32): T { // return a; From 815721ef1a0ecd3f3949baee59918d32e6c2430c Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Sat, 11 Jan 2025 22:45:25 -0800 Subject: [PATCH 4/6] Fix bootstrap errors --- src/resolver.ts | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index 0aa68afbd9..a42fd2522a 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -752,7 +752,7 @@ export class Resolver extends DiagnosticEmitter { } private inferGenericTypeArguments( - node: CallExpression | NewExpression, + node: Expression, prototype: FunctionPrototype, typeParameterNodes: TypeParameterNode[] | null, ctxFlow: Flow, @@ -776,7 +776,20 @@ export class Resolver extends DiagnosticEmitter { let parameterNodes = prototype.functionTypeNode.parameters; let numParameters = parameterNodes.length; - let argumentNodes = node.args; + + let argumentNodes: Expression[]; + switch (node.kind) { + case NodeKind.Call: + argumentNodes = (node).args; + break; + case NodeKind.New: + argumentNodes = (node).args; + break; + default: + assert(false); + return null; + } + let numArguments = argumentNodes.length; // infer types with generic components while updating contextual types @@ -3681,10 +3694,10 @@ export class Resolver extends DiagnosticEmitter { if (prototype.is(CommonFlags.Generic)) { // if no type arguments are provided, try to infer them from the constructor call - if (!typeArgumentNodes && prototype.constructorPrototype && flow) { + if (!typeArgumentNodes && prototype.constructorPrototype && flow && ctxTypes.size == 0) { resolvedTypeArguments = this.inferGenericTypeArguments( reportNode as NewExpression, - prototype.constructorPrototype, + prototype.constructorPrototype!, prototype.typeParameterNodes, flow, ); From 3b0335154703ebd1bc9a91c6a07a5927a0bf1062 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Sun, 12 Jan 2025 13:17:55 -0800 Subject: [PATCH 5/6] Handle constructor on base class --- src/resolver.ts | 10 +- tests/compiler/call-inferred.debug.wat | 290 +++---------- tests/compiler/call-inferred.release.wat | 498 +++++++---------------- tests/compiler/call-inferred.ts | 39 +- 4 files changed, 235 insertions(+), 602 deletions(-) diff --git a/src/resolver.ts b/src/resolver.ts index a42fd2522a..389d3d8971 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -3693,11 +3693,17 @@ export class Resolver extends DiagnosticEmitter { // Resolve type arguments if generic if (prototype.is(CommonFlags.Generic)) { + // find the constructor prototype, which may be on a base class + let constructorPrototype: FunctionPrototype | null = null; + for (let p: ClassPrototype | null = prototype; p && !constructorPrototype; p = p.basePrototype) { + constructorPrototype = p.constructorPrototype; + } + // if no type arguments are provided, try to infer them from the constructor call - if (!typeArgumentNodes && prototype.constructorPrototype && flow && ctxTypes.size == 0) { + if (!typeArgumentNodes && constructorPrototype && flow && ctxTypes.size == 0) { resolvedTypeArguments = this.inferGenericTypeArguments( reportNode as NewExpression, - prototype.constructorPrototype!, + constructorPrototype, prototype.typeParameterNodes, flow, ); diff --git a/tests/compiler/call-inferred.debug.wat b/tests/compiler/call-inferred.debug.wat index 27172b5f77..e151cb56c5 100644 --- a/tests/compiler/call-inferred.debug.wat +++ b/tests/compiler/call-inferred.debug.wat @@ -4,14 +4,11 @@ (type $2 (func (param i32))) (type $3 (func)) (type $4 (func (param i32 i32) (result i32))) - (type $5 (func (param f32) (result f32))) - (type $6 (func (param i32 i32 i32))) - (type $7 (func (param i32 i32 i32 i32))) - (type $8 (func (param f64) (result f64))) - (type $9 (func (param i32 i32 i64) (result i32))) - (type $10 (func (result i32))) + (type $5 (func (param i32 i32 i32))) + (type $6 (func (param i32 i32 i32 i32))) + (type $7 (func (param i32 i32 i64) (result i32))) + (type $8 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) - (global $~argumentsLength (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)) @@ -31,51 +28,20 @@ (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33276)) (global $~lib/memory/__heap_base i32 (i32.const 33276)) (memory $0 1) - (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $1 (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") - (data $2 (i32.const 140) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $3 (i32.const 208) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $4 (i32.const 240) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $5 (i32.const 268) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") - (data $6 (i32.const 332) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data $7 (i32.const 384) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $8 (i32.const 412) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data $1 (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $2 (i32.const 144) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $3 (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $4 (i32.const 204) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data $5 (i32.const 268) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data $6 (i32.const 320) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $7 (i32.const 348) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $8 (i32.const 412) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") (data $9 (i32.const 480) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) (start $~start) - (func $call-inferred/foo (param $a i32) (result i32) - local.get $a - return - ) - (func $call-inferred/foo (param $a f64) (result f64) - local.get $a - return - ) - (func $call-inferred/foo (param $a f32) (result f32) - local.get $a - return - ) - (func $call-inferred/bar (param $a f32) (result f32) - local.get $a - return - ) - (func $call-inferred/bar@varargs (param $a f32) (result f32) - block $1of1 - block $0of1 - block $outOfRange - global.get $~argumentsLength - br_table $0of1 $1of1 $outOfRange - end - unreachable - end - f32.const 42 - local.set $a - end - local.get $a - call $call-inferred/bar - ) (func $~lib/rt/itcms/Object#set:nextWithColor (param $this i32) (param $nextWithColor i32) local.get $this local.get $nextWithColor @@ -140,7 +106,7 @@ i32.eqz if i32.const 0 - i32.const 160 + i32.const 96 i32.const 160 i32.const 16 call $~lib/builtins/abort @@ -210,7 +176,7 @@ i32.eqz if i32.const 0 - i32.const 160 + i32.const 96 i32.const 128 i32.const 18 call $~lib/builtins/abort @@ -227,7 +193,7 @@ i32.eqz if i32.const 0 - i32.const 160 + i32.const 96 i32.const 132 i32.const 16 call $~lib/builtins/abort @@ -257,8 +223,8 @@ i32.load i32.gt_u if + i32.const 224 i32.const 288 - i32.const 352 i32.const 21 i32.const 28 call $~lib/builtins/abort @@ -326,7 +292,7 @@ i32.eqz if (result i32) i32.const 0 - i32.const 160 + i32.const 96 i32.const 148 i32.const 30 call $~lib/builtins/abort @@ -478,7 +444,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -498,7 +464,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -561,7 +527,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -714,7 +680,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -731,7 +697,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -820,7 +786,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -863,7 +829,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -881,7 +847,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -949,7 +915,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -1066,7 +1032,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 382 i32.const 14 call $~lib/builtins/abort @@ -1112,7 +1078,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 389 i32.const 16 call $~lib/builtins/abort @@ -1144,7 +1110,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 402 i32.const 5 call $~lib/builtins/abort @@ -1388,7 +1354,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 562 i32.const 3 call $~lib/builtins/abort @@ -1608,7 +1574,7 @@ i32.eqz if i32.const 0 - i32.const 160 + i32.const 96 i32.const 229 i32.const 20 call $~lib/builtins/abort @@ -1716,8 +1682,8 @@ i32.const 1073741820 i32.gt_u if - i32.const 96 - i32.const 432 + i32.const 32 + i32.const 368 i32.const 461 i32.const 29 call $~lib/builtins/abort @@ -1819,7 +1785,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 334 i32.const 14 call $~lib/builtins/abort @@ -1890,7 +1856,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 347 i32.const 18 call $~lib/builtins/abort @@ -2047,7 +2013,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 361 i32.const 14 call $~lib/builtins/abort @@ -2162,7 +2128,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 499 i32.const 16 call $~lib/builtins/abort @@ -2182,7 +2148,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 368 i32.const 501 i32.const 14 call $~lib/builtins/abort @@ -2230,8 +2196,8 @@ i32.const 1073741804 i32.ge_u if + i32.const 32 i32.const 96 - i32.const 160 i32.const 261 i32.const 31 call $~lib/builtins/abort @@ -2285,22 +2251,12 @@ local.get $this i32.load ) - (func $call-inferred/Foo.create (param $value i32) (result i32) - i32.const 0 - local.get $value - call $call-inferred/Foo#constructor - return - ) - (func $call-inferred/Bar#doSomething (param $this i32) (param $a i32) (result i32) - local.get $a - return - ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) - i32.const 288 + i32.const 224 local.get $0 call $~lib/rt/itcms/__visit - i32.const 96 + i32.const 32 local.get $0 call $~lib/rt/itcms/__visit ) @@ -2322,8 +2278,8 @@ ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $call-inferred/Bar - block $call-inferred/Foo + block $call-inferred/Foo + block $call-inferred/Baz block $~lib/arraybuffer/ArrayBufferView block $~lib/string/String block $~lib/arraybuffer/ArrayBuffer @@ -2332,7 +2288,7 @@ i32.const 8 i32.sub i32.load - br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $call-inferred/Foo $call-inferred/Bar $invalid + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $call-inferred/Baz $call-inferred/Foo $invalid end return end @@ -2382,7 +2338,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 4 - i32.const 4 + i32.const 5 call $~lib/rt/itcms/__new local.tee $this i32.store @@ -2403,8 +2359,8 @@ global.set $~lib/memory/__stack_pointer local.get $2 ) - (func $call-inferred/Bar#constructor (param $this i32) (result i32) - (local $1 i32) + (func $call-inferred/Baz#constructor (param $this i32) (param $value i32) (result i32) + (local $2 i32) global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub @@ -2417,29 +2373,30 @@ i32.eqz if global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.const 5 + i32.const 4 + i32.const 4 call $~lib/rt/itcms/__new local.tee $this i32.store end global.get $~lib/memory/__stack_pointer local.get $this - local.set $1 + local.set $2 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 - call $~lib/object/Object#constructor + local.get $2 + local.get $value + call $call-inferred/Foo#constructor local.tee $this i32.store local.get $this - local.set $1 + local.set $2 global.get $~lib/memory/__stack_pointer i32.const 8 i32.add global.set $~lib/memory/__stack_pointer - local.get $1 + local.get $2 ) (func $start:call-inferred (local $0 i32) @@ -2451,60 +2408,6 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store - i32.const 42 - call $call-inferred/foo - i32.const 42 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 5 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - f64.const 42 - call $call-inferred/foo - f64.const 42 - f64.eq - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 6 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - f32.const 42 - call $call-inferred/foo - f32.const 42 - f32.eq - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 7 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 0 - global.set $~argumentsLength - f32.const 0 - call $call-inferred/bar@varargs - f32.const 42 - f32.eq - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 13 - i32.const 1 - call $~lib/builtins/abort - unreachable - end memory.size i32.const 16 i32.shl @@ -2513,37 +2416,18 @@ i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 208 + i32.const 144 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/pinSpace - i32.const 240 + i32.const 176 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/toSpace - i32.const 384 + i32.const 320 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/fromSpace i32.const 0 i32.const 42 - call $call-inferred/Foo#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - call $call-inferred/Foo#get:value - i32.const 42 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 22 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 42 - call $call-inferred/Foo.create + call $call-inferred/Baz#constructor local.set $0 global.get $~lib/memory/__stack_pointer local.get $0 @@ -2555,28 +2439,8 @@ i32.eqz if i32.const 0 - i32.const 32 - i32.const 23 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - i32.const 0 - call $call-inferred/Bar#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.const 42 - call $call-inferred/Bar#doSomething - i32.const 42 - i32.eq - i32.eqz - if - i32.const 0 - i32.const 32 - i32.const 31 + i32.const 432 + i32.const 34 i32.const 1 call $~lib/builtins/abort unreachable @@ -2586,32 +2450,4 @@ i32.add global.set $~lib/memory/__stack_pointer ) - (func $~lib/object/Object#constructor (param $this i32) (result i32) - (local $1 i32) - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - call $~stack_check - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store - local.get $this - i32.eqz - if - global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.const 0 - call $~lib/rt/itcms/__new - local.tee $this - i32.store - end - local.get $this - local.set $1 - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $1 - ) ) diff --git a/tests/compiler/call-inferred.release.wat b/tests/compiler/call-inferred.release.wat index afc3e73002..80b0a33f52 100644 --- a/tests/compiler/call-inferred.release.wat +++ b/tests/compiler/call-inferred.release.wat @@ -2,10 +2,10 @@ (type $0 (func)) (type $1 (func (param i32))) (type $2 (func (param i32 i32))) - (type $3 (func (result 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 $3 (func (param i32) (result i32))) + (type $4 (func (param i32 i32 i32 i32))) + (type $5 (func (param i32 i32 i64))) + (type $6 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -20,26 +20,26 @@ (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34300)) (memory $0 1) (data $0 (i32.const 1036) "<") - (data $0.1 (i32.const 1048) "\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s") + (data $0.1 (i32.const 1048) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") (data $1 (i32.const 1100) "<") - (data $1.1 (i32.const 1112) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") - (data $2 (i32.const 1164) "<") - (data $2.1 (i32.const 1176) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") - (data $5 (i32.const 1292) "<") - (data $5.1 (i32.const 1304) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") - (data $6 (i32.const 1356) ",") - (data $6.1 (i32.const 1368) "\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data $1.1 (i32.const 1112) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data $4 (i32.const 1228) "<") + (data $4.1 (i32.const 1240) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data $5 (i32.const 1292) ",") + (data $5.1 (i32.const 1304) "\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") + (data $7 (i32.const 1372) "<") + (data $7.1 (i32.const 1384) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") (data $8 (i32.const 1436) "<") - (data $8.1 (i32.const 1448) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data $8.1 (i32.const 1448) "\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s") (data $9 (i32.const 1504) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 ") (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/visitRoots (local $0 i32) (local $1 i32) - i32.const 1312 + i32.const 1248 call $~lib/rt/itcms/__visit - i32.const 1120 + i32.const 1056 call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace local.tee $1 @@ -60,7 +60,7 @@ i32.ne if i32.const 0 - i32.const 1184 + i32.const 1120 i32.const 160 i32.const 16 call $~lib/builtins/abort @@ -108,7 +108,7 @@ i32.eqz if i32.const 0 - i32.const 1184 + i32.const 1120 i32.const 148 i32.const 30 call $~lib/builtins/abort @@ -117,7 +117,7 @@ local.get $0 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$122 + block $__inlined_func$~lib/rt/itcms/Object#unlink$113 local.get $1 i32.load offset=4 i32.const -4 @@ -135,13 +135,13 @@ i32.eqz if i32.const 0 - i32.const 1184 + i32.const 1120 i32.const 128 i32.const 18 call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$122 + br $__inlined_func$~lib/rt/itcms/Object#unlink$113 end local.get $1 i32.load offset=8 @@ -149,7 +149,7 @@ i32.eqz if i32.const 0 - i32.const 1184 + i32.const 1120 i32.const 132 i32.const 16 call $~lib/builtins/abort @@ -182,8 +182,8 @@ i32.load i32.gt_u if + i32.const 1248 i32.const 1312 - i32.const 1376 i32.const 21 i32.const 28 call $~lib/builtins/abort @@ -244,7 +244,7 @@ i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -258,7 +258,7 @@ i32.lt_u if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -304,7 +304,7 @@ i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -387,7 +387,7 @@ i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -401,7 +401,7 @@ i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -462,7 +462,7 @@ i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -495,7 +495,7 @@ i32.lt_u if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -510,7 +510,7 @@ i32.ne if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -561,7 +561,7 @@ i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -633,7 +633,7 @@ i64.lt_u if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 382 i32.const 14 call $~lib/builtins/abort @@ -658,7 +658,7 @@ i32.gt_u if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 389 i32.const 16 call $~lib/builtins/abort @@ -685,7 +685,7 @@ i32.gt_u if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 402 i32.const 5 call $~lib/builtins/abort @@ -988,7 +988,7 @@ i32.ne if i32.const 0 - i32.const 1184 + i32.const 1120 i32.const 229 i32.const 20 call $~lib/builtins/abort @@ -1048,7 +1048,7 @@ end if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 562 i32.const 3 call $~lib/builtins/abort @@ -1079,85 +1079,18 @@ end i32.const 0 ) - (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) - local.get $1 - i32.const 256 - i32.lt_u - if - local.get $1 - i32.const 4 - i32.shr_u - local.set $1 - else - local.get $1 - i32.const 536870910 - i32.lt_u - if - local.get $1 - i32.const 1 - i32.const 27 - local.get $1 - i32.clz - i32.sub - i32.shl - i32.add - i32.const 1 - i32.sub - local.set $1 - end - local.get $1 - i32.const 31 - local.get $1 - i32.clz - i32.sub - local.tee $2 - i32.const 4 - i32.sub - i32.shr_u - i32.const 16 - i32.xor - local.set $1 - local.get $2 - i32.const 7 - i32.sub - local.set $2 - end - local.get $1 - i32.const 16 - i32.lt_u - local.get $2 - i32.const 23 - i32.lt_u - i32.and - i32.eqz - if - i32.const 0 - i32.const 1456 - i32.const 334 - i32.const 14 - call $~lib/builtins/abort - unreachable - end local.get $0 - local.get $2 - i32.const 2 - i32.shl - i32.add i32.load offset=4 - i32.const -1 - local.get $1 - i32.shl + i32.const -2 i32.and local.tee $1 if (result i32) local.get $0 local.get $1 i32.ctz - local.get $2 - i32.const 4 - i32.shl - i32.add i32.const 2 i32.shl i32.add @@ -1165,36 +1098,32 @@ else local.get $0 i32.load - i32.const -1 - local.get $2 - i32.const 1 - i32.add - i32.shl + i32.const -2 i32.and local.tee $1 if (result i32) local.get $0 local.get $1 i32.ctz - local.tee $1 + local.tee $2 i32.const 2 i32.shl i32.add i32.load offset=4 - local.tee $2 + local.tee $1 i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 347 i32.const 18 call $~lib/builtins/abort unreachable end local.get $0 - local.get $2 - i32.ctz local.get $1 + i32.ctz + local.get $2 i32.const 4 i32.shl i32.add @@ -1207,35 +1136,23 @@ end end ) - (func $~lib/rt/itcms/__new (param $0 i32) (param $1 i32) (result i32) + (func $~lib/rt/itcms/__new (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) - (local $5 i32) - (local $6 i32) - local.get $0 - i32.const 1073741804 - i32.ge_u - if - i32.const 1120 - i32.const 1184 - 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$70 + block $__inlined_func$~lib/rt/itcms/interrupt$69 i32.const 2048 - local.set $2 + local.set $1 loop $do-loop|0 - local.get $2 + local.get $1 call $~lib/rt/itcms/step i32.sub - local.set $2 + local.set $1 global.get $~lib/rt/itcms/state i32.eqz if @@ -1249,9 +1166,9 @@ i32.const 1024 i32.add global.set $~lib/rt/itcms/threshold - br $__inlined_func$~lib/rt/itcms/interrupt$70 + br $__inlined_func$~lib/rt/itcms/interrupt$69 end - local.get $2 + local.get $1 i32.const 0 i32.gt_s br_if $do-loop|0 @@ -1274,86 +1191,31 @@ call $~lib/rt/tlsf/initialize end global.get $~lib/rt/tlsf/ROOT - local.set $4 - local.get $0 - i32.const 16 - i32.add local.tee $2 - i32.const 1073741820 - i32.gt_u - if - i32.const 1120 - i32.const 1456 - i32.const 461 - i32.const 29 - call $~lib/builtins/abort - unreachable - end - local.get $4 - local.get $2 - i32.const 12 - i32.le_u - if (result i32) - i32.const 12 - else - local.get $2 - i32.const 19 - i32.add - i32.const -16 - i32.and - i32.const 4 - i32.sub - end - local.tee $5 call $~lib/rt/tlsf/searchBlock - local.tee $2 + local.tee $1 i32.eqz if memory.size - local.tee $2 - local.get $5 - i32.const 256 - i32.ge_u - if (result i32) - local.get $5 - i32.const 536870910 - i32.lt_u - if (result i32) - local.get $5 - i32.const 1 - i32.const 27 - local.get $5 - i32.clz - i32.sub - i32.shl - i32.add - i32.const 1 - i32.sub - else - local.get $5 - end - else - local.get $5 - end + local.tee $1 i32.const 4 - local.get $4 - i32.load offset=1568 local.get $2 + i32.load offset=1568 + local.get $1 i32.const 16 i32.shl i32.const 4 i32.sub i32.ne i32.shl - i32.add - i32.const 65535 + i32.const 65563 i32.add i32.const -65536 i32.and i32.const 16 i32.shr_u local.tee $3 - local.get $2 + local.get $1 local.get $3 i32.gt_s select @@ -1369,8 +1231,8 @@ unreachable end end - local.get $4 local.get $2 + local.get $1 i32.const 16 i32.shl memory.size @@ -1378,136 +1240,119 @@ i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - local.get $4 - local.get $5 + local.get $2 call $~lib/rt/tlsf/searchBlock - local.tee $2 + local.tee $1 i32.eqz if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 499 i32.const 16 call $~lib/builtins/abort unreachable end end - local.get $5 - local.get $2 + local.get $1 i32.load i32.const -4 i32.and - i32.gt_u + i32.const 28 + i32.lt_u if i32.const 0 - i32.const 1456 + i32.const 1392 i32.const 501 i32.const 14 call $~lib/builtins/abort unreachable end - local.get $4 local.get $2 + local.get $1 call $~lib/rt/tlsf/removeBlock - local.get $2 + local.get $1 i32.load - local.set $6 - local.get $5 - i32.const 4 - i32.add - i32.const 15 - i32.and - if - i32.const 0 - i32.const 1456 - i32.const 361 - i32.const 14 - call $~lib/builtins/abort - unreachable - end - local.get $6 + local.tee $3 i32.const -4 i32.and - local.get $5 + i32.const 28 i32.sub - local.tee $3 + local.tee $4 i32.const 16 i32.ge_u if - local.get $2 - local.get $5 - local.get $6 + local.get $1 + local.get $3 i32.const 2 i32.and + i32.const 28 i32.or i32.store - local.get $2 - i32.const 4 - i32.add - local.get $5 + local.get $1 + i32.const 32 i32.add - local.tee $5 - local.get $3 + local.tee $3 + local.get $4 i32.const 4 i32.sub i32.const 1 i32.or i32.store - local.get $4 - local.get $5 + local.get $2 + local.get $3 call $~lib/rt/tlsf/insertBlock else - local.get $2 - local.get $6 + local.get $1 + local.get $3 i32.const -2 i32.and i32.store - local.get $2 + local.get $1 i32.const 4 i32.add - local.get $2 + local.get $1 i32.load i32.const -4 i32.and i32.add - local.tee $3 - local.get $3 + local.tee $2 + local.get $2 i32.load i32.const -3 i32.and i32.store end - local.get $2 local.get $1 - i32.store offset=12 - local.get $2 local.get $0 + i32.store offset=12 + local.get $1 + i32.const 4 i32.store offset=16 global.get $~lib/rt/itcms/fromSpace - local.tee $1 + local.tee $0 i32.load offset=8 - local.set $3 - local.get $2 + local.set $2 local.get $1 + local.get $0 global.get $~lib/rt/itcms/white i32.or i32.store offset=4 + local.get $1 local.get $2 - local.get $3 i32.store offset=8 - local.get $3 local.get $2 - local.get $3 + local.get $1 + local.get $2 i32.load offset=4 i32.const 3 i32.and i32.or i32.store offset=4 + local.get $0 local.get $1 - local.get $2 i32.store offset=8 global.get $~lib/rt/itcms/total - local.get $2 + local.get $1 i32.load i32.const -4 i32.and @@ -1515,19 +1360,18 @@ i32.add i32.add global.set $~lib/rt/itcms/total - local.get $2 + local.get $1 i32.const 20 i32.add - local.tee $1 + local.tee $0 i32.const 0 + i32.store align=1 local.get $0 - memory.fill - local.get $1 ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid - block $call-inferred/Bar - block $call-inferred/Foo + block $call-inferred/Foo + block $call-inferred/Baz block $~lib/arraybuffer/ArrayBufferView block $~lib/string/String block $~lib/arraybuffer/ArrayBuffer @@ -1536,7 +1380,7 @@ i32.const 8 i32.sub i32.load - br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $call-inferred/Foo $call-inferred/Bar $invalid + br_table $~lib/object/Object $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $call-inferred/Baz $call-inferred/Foo $invalid end return end @@ -1582,64 +1426,30 @@ i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 1236 - i32.const 1232 + i32.const 1172 + i32.const 1168 i32.store - i32.const 1240 - i32.const 1232 + i32.const 1176 + i32.const 1168 i32.store - i32.const 1232 + i32.const 1168 global.set $~lib/rt/itcms/pinSpace - i32.const 1268 - i32.const 1264 + i32.const 1204 + i32.const 1200 i32.store - i32.const 1272 - i32.const 1264 + i32.const 1208 + i32.const 1200 i32.store - i32.const 1264 + i32.const 1200 global.set $~lib/rt/itcms/toSpace - i32.const 1412 - i32.const 1408 + i32.const 1348 + i32.const 1344 i32.store - i32.const 1416 - i32.const 1408 + i32.const 1352 + i32.const 1344 i32.store - i32.const 1408 + i32.const 1344 global.set $~lib/rt/itcms/fromSpace - call $call-inferred/Foo#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.load - i32.const 42 - i32.ne - if - i32.const 0 - i32.const 1056 - i32.const 22 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - call $call-inferred/Foo#constructor - local.set $0 - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store - local.get $0 - i32.load - i32.const 42 - i32.ne - if - i32.const 0 - i32.const 1056 - i32.const 23 - i32.const 1 - call $~lib/builtins/abort - unreachable - end global.get $~lib/memory/__stack_pointer i32.const 8 i32.sub @@ -1652,8 +1462,7 @@ i64.const 0 i64.store global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.const 5 + i32.const 4 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -1663,7 +1472,7 @@ local.get $0 i32.store offset=4 global.get $~lib/memory/__stack_pointer - i32.const 4 + i32.const 8 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer @@ -1671,20 +1480,25 @@ i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.store + i64.const 0 + i64.store local.get $0 i32.eqz if global.get $~lib/memory/__stack_pointer - i32.const 0 - i32.const 0 + i32.const 5 call $~lib/rt/itcms/__new local.tee $0 i32.store end global.get $~lib/memory/__stack_pointer - i32.const 4 + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 42 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 i32.add global.set $~lib/memory/__stack_pointer local.get $1 @@ -1697,6 +1511,18 @@ global.get $~lib/memory/__stack_pointer local.get $0 i32.store + local.get $0 + i32.load + i32.const 42 + i32.ne + if + i32.const 0 + i32.const 1456 + i32.const 34 + i32.const 1 + call $~lib/builtins/abort + unreachable + end global.get $~lib/memory/__stack_pointer i32.const 4 i32.add @@ -1710,42 +1536,4 @@ call $~lib/builtins/abort unreachable ) - (func $call-inferred/Foo#constructor (result i32) - (local $0 i32) - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1532 - i32.lt_s - if - i32.const 34320 - i32.const 34368 - i32.const 1 - i32.const 1 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store - global.get $~lib/memory/__stack_pointer - i32.const 4 - i32.const 4 - call $~lib/rt/itcms/__new - local.tee $0 - i32.store - global.get $~lib/memory/__stack_pointer - local.get $0 - i32.store offset=4 - local.get $0 - i32.const 42 - i32.store - global.get $~lib/memory/__stack_pointer - i32.const 8 - i32.add - global.set $~lib/memory/__stack_pointer - local.get $0 - ) ) diff --git a/tests/compiler/call-inferred.ts b/tests/compiler/call-inferred.ts index 7af653db1f..854ff4362a 100644 --- a/tests/compiler/call-inferred.ts +++ b/tests/compiler/call-inferred.ts @@ -1,16 +1,16 @@ -function foo(a: T): T { - return a; -} +// function foo(a: T): T { +// return a; +// } -assert(foo(42) == 42); -assert(foo(42.0) == 42); -assert(foo(42.0) == 42); +// assert(foo(42) == 42); +// assert(foo(42.0) == 42); +// assert(foo(42.0) == 42); -function bar(a: T = 42.0): T { - return a; -} +// function bar(a: T = 42.0): T { +// return a; +// } -assert(bar() == 42); +// assert(bar() == 42); class Foo { constructor(public value: T) {} @@ -19,16 +19,19 @@ class Foo { } } -assert(new Foo(42).value == 42); -assert(Foo.create(42).value == 42); +// assert(new Foo(42).value == 42); +// assert(Foo.create(42).value == 42); -class Bar { - doSomething(a: T): T { - return a; - } -} +// class Bar { +// doSomething(a: T): T { +// return a; +// } +// } + +// assert(new Bar().doSomething(42) == 42); -assert(new Bar().doSomething(42) == 42); +class Baz extends Foo {} +assert(new Baz(42).value == 42); // TODO: this'd require return type inference, i.e., omitted return type // function baz(a: i32): T { From 48758f5dae1b4493657951e1d85ddb77db9342a3 Mon Sep 17 00:00:00 2001 From: Matt Johnson-Pint Date: Sun, 12 Jan 2025 13:19:28 -0800 Subject: [PATCH 6/6] oops - put tests back --- tests/compiler/call-inferred.debug.wat | 366 ++++++++++++--- tests/compiler/call-inferred.release.wat | 571 +++++++++++++++++------ tests/compiler/call-inferred.ts | 36 +- 3 files changed, 732 insertions(+), 241 deletions(-) diff --git a/tests/compiler/call-inferred.debug.wat b/tests/compiler/call-inferred.debug.wat index e151cb56c5..e080fb3da0 100644 --- a/tests/compiler/call-inferred.debug.wat +++ b/tests/compiler/call-inferred.debug.wat @@ -2,13 +2,16 @@ (type $0 (func (param i32) (result i32))) (type $1 (func (param i32 i32))) (type $2 (func (param i32))) - (type $3 (func)) - (type $4 (func (param i32 i32) (result i32))) - (type $5 (func (param i32 i32 i32))) - (type $6 (func (param i32 i32 i32 i32))) - (type $7 (func (param i32 i32 i64) (result i32))) - (type $8 (func (result i32))) + (type $3 (func (param i32 i32) (result i32))) + (type $4 (func)) + (type $5 (func (param f32) (result f32))) + (type $6 (func (param i32 i32 i32))) + (type $7 (func (param i32 i32 i32 i32))) + (type $8 (func (param f64) (result f64))) + (type $9 (func (param i32 i32 i64) (result i32))) + (type $10 (func (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) + (global $~argumentsLength (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)) @@ -24,24 +27,55 @@ (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) (global $~lib/native/ASC_LOW_MEMORY_LIMIT i32 (i32.const 0)) (global $~lib/rt/__rtti_base i32 (i32.const 480)) - (global $~lib/memory/__data_end i32 (i32.const 508)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33276)) - (global $~lib/memory/__heap_base i32 (i32.const 33276)) + (global $~lib/memory/__data_end i32 (i32.const 512)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33280)) + (global $~lib/memory/__heap_base i32 (i32.const 33280)) (memory $0 1) - (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") - (data $1 (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $2 (i32.const 144) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $3 (i32.const 176) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $4 (i32.const 204) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") - (data $5 (i32.const 268) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") - (data $6 (i32.const 320) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $7 (i32.const 348) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $8 (i32.const 412) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") - (data $9 (i32.const 480) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00") + (data $0 (i32.const 12) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $1 (i32.const 76) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e\00\00\00\00\00") + (data $2 (i32.const 140) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $3 (i32.const 208) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $4 (i32.const 240) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $5 (i32.const 268) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e\00\00\00\00\00\00\00\00\00") + (data $6 (i32.const 332) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s\00\00\00\00\00\00\00\00\00") + (data $7 (i32.const 384) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $8 (i32.const 412) "<\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $9 (i32.const 480) "\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") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "memory" (memory $0)) (start $~start) + (func $call-inferred/foo (param $a i32) (result i32) + local.get $a + return + ) + (func $call-inferred/foo (param $a f64) (result f64) + local.get $a + return + ) + (func $call-inferred/foo (param $a f32) (result f32) + local.get $a + return + ) + (func $call-inferred/bar (param $a f32) (result f32) + local.get $a + return + ) + (func $call-inferred/bar@varargs (param $a f32) (result f32) + block $1of1 + block $0of1 + block $outOfRange + global.get $~argumentsLength + br_table $0of1 $1of1 $outOfRange + end + unreachable + end + f32.const 42 + local.set $a + end + local.get $a + call $call-inferred/bar + ) (func $~lib/rt/itcms/Object#set:nextWithColor (param $this i32) (param $nextWithColor i32) local.get $this local.get $nextWithColor @@ -106,7 +140,7 @@ i32.eqz if i32.const 0 - i32.const 96 + i32.const 160 i32.const 160 i32.const 16 call $~lib/builtins/abort @@ -176,7 +210,7 @@ i32.eqz if i32.const 0 - i32.const 96 + i32.const 160 i32.const 128 i32.const 18 call $~lib/builtins/abort @@ -193,7 +227,7 @@ i32.eqz if i32.const 0 - i32.const 96 + i32.const 160 i32.const 132 i32.const 16 call $~lib/builtins/abort @@ -223,8 +257,8 @@ i32.load i32.gt_u if - i32.const 224 i32.const 288 + i32.const 352 i32.const 21 i32.const 28 call $~lib/builtins/abort @@ -292,7 +326,7 @@ i32.eqz if (result i32) i32.const 0 - i32.const 96 + i32.const 160 i32.const 148 i32.const 30 call $~lib/builtins/abort @@ -444,7 +478,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -464,7 +498,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -527,7 +561,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -680,7 +714,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -697,7 +731,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -786,7 +820,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -829,7 +863,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -847,7 +881,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -915,7 +949,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -1032,7 +1066,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 382 i32.const 14 call $~lib/builtins/abort @@ -1078,7 +1112,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 389 i32.const 16 call $~lib/builtins/abort @@ -1110,7 +1144,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 402 i32.const 5 call $~lib/builtins/abort @@ -1354,7 +1388,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 562 i32.const 3 call $~lib/builtins/abort @@ -1574,7 +1608,7 @@ i32.eqz if i32.const 0 - i32.const 96 + i32.const 160 i32.const 229 i32.const 20 call $~lib/builtins/abort @@ -1682,8 +1716,8 @@ i32.const 1073741820 i32.gt_u if - i32.const 32 - i32.const 368 + i32.const 96 + i32.const 432 i32.const 461 i32.const 29 call $~lib/builtins/abort @@ -1785,7 +1819,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 334 i32.const 14 call $~lib/builtins/abort @@ -1856,7 +1890,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 347 i32.const 18 call $~lib/builtins/abort @@ -2013,7 +2047,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 361 i32.const 14 call $~lib/builtins/abort @@ -2128,7 +2162,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 499 i32.const 16 call $~lib/builtins/abort @@ -2148,7 +2182,7 @@ i32.eqz if i32.const 0 - i32.const 368 + i32.const 432 i32.const 501 i32.const 14 call $~lib/builtins/abort @@ -2196,8 +2230,8 @@ i32.const 1073741804 i32.ge_u if - i32.const 32 i32.const 96 + i32.const 160 i32.const 261 i32.const 31 call $~lib/builtins/abort @@ -2251,12 +2285,22 @@ local.get $this i32.load ) + (func $call-inferred/Foo.create (param $value i32) (result i32) + i32.const 0 + local.get $value + call $call-inferred/Foo#constructor + return + ) + (func $call-inferred/Bar#doSomething (param $this i32) (param $a i32) (result i32) + local.get $a + return + ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) - i32.const 224 + i32.const 288 local.get $0 call $~lib/rt/itcms/__visit - i32.const 32 + i32.const 96 local.get $0 call $~lib/rt/itcms/__visit ) @@ -2278,27 +2322,30 @@ ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $call-inferred/Foo - block $call-inferred/Baz - 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 $call-inferred/Baz $call-inferred/Foo $invalid + block $call-inferred/Baz + block $call-inferred/Bar + block $call-inferred/Foo + 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 $call-inferred/Foo $call-inferred/Bar $call-inferred/Baz $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/arraybuffer/ArrayBufferView~visit return end return @@ -2315,8 +2362,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 33296 - i32.const 33344 + i32.const 33312 + i32.const 33360 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2338,7 +2385,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 4 - i32.const 5 + i32.const 4 call $~lib/rt/itcms/__new local.tee $this i32.store @@ -2359,6 +2406,44 @@ global.set $~lib/memory/__stack_pointer local.get $2 ) + (func $call-inferred/Bar#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + call $~lib/object/Object#constructor + local.tee $this + i32.store + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) (func $call-inferred/Baz#constructor (param $this i32) (param $value i32) (result i32) (local $2 i32) global.get $~lib/memory/__stack_pointer @@ -2374,7 +2459,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 4 - i32.const 4 + i32.const 6 call $~lib/rt/itcms/__new local.tee $this i32.store @@ -2408,6 +2493,60 @@ global.get $~lib/memory/__stack_pointer i32.const 0 i32.store + i32.const 42 + call $call-inferred/foo + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 5 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f64.const 42 + call $call-inferred/foo + f64.const 42 + f64.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 6 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + f32.const 42 + call $call-inferred/foo + f32.const 42 + f32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 7 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + global.set $~argumentsLength + f32.const 0 + call $call-inferred/bar@varargs + f32.const 42 + f32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 13 + i32.const 1 + call $~lib/builtins/abort + unreachable + end memory.size i32.const 16 i32.shl @@ -2416,17 +2555,76 @@ i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 144 + i32.const 208 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/pinSpace - i32.const 176 + i32.const 240 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/toSpace - i32.const 320 + i32.const 384 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/fromSpace i32.const 0 i32.const 42 + call $call-inferred/Foo#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $call-inferred/Foo#get:value + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 42 + call $call-inferred/Foo.create + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + call $call-inferred/Foo#get:value + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 23 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $call-inferred/Bar#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 42 + call $call-inferred/Bar#doSomething + i32.const 42 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 32 + i32.const 31 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + i32.const 42 call $call-inferred/Baz#constructor local.set $0 global.get $~lib/memory/__stack_pointer @@ -2439,7 +2637,7 @@ i32.eqz if i32.const 0 - i32.const 432 + i32.const 32 i32.const 34 i32.const 1 call $~lib/builtins/abort @@ -2450,4 +2648,32 @@ i32.add global.set $~lib/memory/__stack_pointer ) + (func $~lib/object/Object#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $this + i32.store + end + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) ) diff --git a/tests/compiler/call-inferred.release.wat b/tests/compiler/call-inferred.release.wat index 80b0a33f52..e39cd59cc2 100644 --- a/tests/compiler/call-inferred.release.wat +++ b/tests/compiler/call-inferred.release.wat @@ -2,10 +2,11 @@ (type $0 (func)) (type $1 (func (param i32))) (type $2 (func (param i32 i32))) - (type $3 (func (param i32) (result i32))) + (type $3 (func (param i32 i32) (result i32))) (type $4 (func (param i32 i32 i32 i32))) (type $5 (func (param i32 i32 i64))) (type $6 (func (result i32))) + (type $7 (func (param i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $~lib/rt/itcms/total (mut i32) (i32.const 0)) (global $~lib/rt/itcms/threshold (mut i32) (i32.const 0)) @@ -17,29 +18,29 @@ (global $~lib/rt/itcms/white (mut i32) (i32.const 0)) (global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0)) (global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34300)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34304)) (memory $0 1) (data $0 (i32.const 1036) "<") - (data $0.1 (i32.const 1048) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data $0.1 (i32.const 1048) "\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s") (data $1 (i32.const 1100) "<") - (data $1.1 (i32.const 1112) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") - (data $4 (i32.const 1228) "<") - (data $4.1 (i32.const 1240) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") - (data $5 (i32.const 1292) ",") - (data $5.1 (i32.const 1304) "\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") - (data $7 (i32.const 1372) "<") - (data $7.1 (i32.const 1384) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data $1.1 (i32.const 1112) "\02\00\00\00(\00\00\00A\00l\00l\00o\00c\00a\00t\00i\00o\00n\00 \00t\00o\00o\00 \00l\00a\00r\00g\00e") + (data $2 (i32.const 1164) "<") + (data $2.1 (i32.const 1176) "\02\00\00\00 \00\00\00~\00l\00i\00b\00/\00r\00t\00/\00i\00t\00c\00m\00s\00.\00t\00s") + (data $5 (i32.const 1292) "<") + (data $5.1 (i32.const 1304) "\02\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e") + (data $6 (i32.const 1356) ",") + (data $6.1 (i32.const 1368) "\02\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s") (data $8 (i32.const 1436) "<") - (data $8.1 (i32.const 1448) "\02\00\00\00 \00\00\00c\00a\00l\00l\00-\00i\00n\00f\00e\00r\00r\00e\00d\00.\00t\00s") - (data $9 (i32.const 1504) "\06\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 ") + (data $8.1 (i32.const 1448) "\02\00\00\00\1e\00\00\00~\00l\00i\00b\00/\00r\00t\00/\00t\00l\00s\00f\00.\00t\00s") + (data $9 (i32.const 1504) "\07\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00 \00\00\00 ") (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/visitRoots (local $0 i32) (local $1 i32) - i32.const 1248 + i32.const 1312 call $~lib/rt/itcms/__visit - i32.const 1056 + i32.const 1120 call $~lib/rt/itcms/__visit global.get $~lib/rt/itcms/pinSpace local.tee $1 @@ -60,7 +61,7 @@ i32.ne if i32.const 0 - i32.const 1120 + i32.const 1184 i32.const 160 i32.const 16 call $~lib/builtins/abort @@ -108,7 +109,7 @@ i32.eqz if i32.const 0 - i32.const 1120 + i32.const 1184 i32.const 148 i32.const 30 call $~lib/builtins/abort @@ -117,7 +118,7 @@ local.get $0 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$113 + block $__inlined_func$~lib/rt/itcms/Object#unlink$125 local.get $1 i32.load offset=4 i32.const -4 @@ -129,19 +130,19 @@ i32.load offset=8 i32.eqz local.get $1 - i32.const 34300 + i32.const 34304 i32.lt_u i32.and i32.eqz if i32.const 0 - i32.const 1120 + i32.const 1184 i32.const 128 i32.const 18 call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$113 + br $__inlined_func$~lib/rt/itcms/Object#unlink$125 end local.get $1 i32.load offset=8 @@ -149,7 +150,7 @@ i32.eqz if i32.const 0 - i32.const 1120 + i32.const 1184 i32.const 132 i32.const 16 call $~lib/builtins/abort @@ -182,8 +183,8 @@ i32.load i32.gt_u if - i32.const 1248 i32.const 1312 + i32.const 1376 i32.const 21 i32.const 28 call $~lib/builtins/abort @@ -244,7 +245,7 @@ i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 268 i32.const 14 call $~lib/builtins/abort @@ -258,7 +259,7 @@ i32.lt_u if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 270 i32.const 14 call $~lib/builtins/abort @@ -304,7 +305,7 @@ i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 284 i32.const 14 call $~lib/builtins/abort @@ -387,7 +388,7 @@ i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 201 i32.const 14 call $~lib/builtins/abort @@ -401,7 +402,7 @@ i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 203 i32.const 14 call $~lib/builtins/abort @@ -462,7 +463,7 @@ i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 221 i32.const 16 call $~lib/builtins/abort @@ -495,7 +496,7 @@ i32.lt_u if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 233 i32.const 14 call $~lib/builtins/abort @@ -510,7 +511,7 @@ i32.ne if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 234 i32.const 14 call $~lib/builtins/abort @@ -561,7 +562,7 @@ i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 251 i32.const 14 call $~lib/builtins/abort @@ -633,7 +634,7 @@ i64.lt_u if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 382 i32.const 14 call $~lib/builtins/abort @@ -658,7 +659,7 @@ i32.gt_u if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 389 i32.const 16 call $~lib/builtins/abort @@ -685,7 +686,7 @@ i32.gt_u if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 402 i32.const 5 call $~lib/builtins/abort @@ -899,7 +900,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 34300 + i32.const 34304 i32.lt_u if local.get $0 @@ -988,14 +989,14 @@ i32.ne if i32.const 0 - i32.const 1120 + i32.const 1184 i32.const 229 i32.const 20 call $~lib/builtins/abort unreachable end local.get $0 - i32.const 34300 + i32.const 34304 i32.lt_u if local.get $0 @@ -1018,7 +1019,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 34300 + i32.const 34304 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1048,7 +1049,7 @@ end if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 562 i32.const 3 call $~lib/builtins/abort @@ -1079,18 +1080,85 @@ end i32.const 0 ) - (func $~lib/rt/tlsf/searchBlock (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/rt/tlsf/searchBlock (param $0 i32) (param $1 i32) (result i32) (local $2 i32) + local.get $1 + i32.const 256 + i32.lt_u + if + local.get $1 + i32.const 4 + i32.shr_u + local.set $1 + else + local.get $1 + i32.const 536870910 + i32.lt_u + if + local.get $1 + i32.const 1 + i32.const 27 + local.get $1 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + local.set $1 + end + local.get $1 + i32.const 31 + local.get $1 + i32.clz + i32.sub + local.tee $2 + i32.const 4 + i32.sub + i32.shr_u + i32.const 16 + i32.xor + local.set $1 + local.get $2 + i32.const 7 + i32.sub + local.set $2 + end + local.get $1 + i32.const 16 + i32.lt_u + local.get $2 + i32.const 23 + i32.lt_u + i32.and + i32.eqz + if + i32.const 0 + i32.const 1456 + i32.const 334 + i32.const 14 + call $~lib/builtins/abort + unreachable + end local.get $0 + local.get $2 + i32.const 2 + i32.shl + i32.add i32.load offset=4 - i32.const -2 + i32.const -1 + local.get $1 + i32.shl i32.and local.tee $1 if (result i32) local.get $0 local.get $1 i32.ctz + local.get $2 + i32.const 4 + i32.shl + i32.add i32.const 2 i32.shl i32.add @@ -1098,32 +1166,36 @@ else local.get $0 i32.load - i32.const -2 + i32.const -1 + local.get $2 + i32.const 1 + i32.add + i32.shl i32.and local.tee $1 if (result i32) local.get $0 local.get $1 i32.ctz - local.tee $2 + local.tee $1 i32.const 2 i32.shl i32.add i32.load offset=4 - local.tee $1 + local.tee $2 i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 347 i32.const 18 call $~lib/builtins/abort unreachable end local.get $0 - local.get $1 - i32.ctz local.get $2 + i32.ctz + local.get $1 i32.const 4 i32.shl i32.add @@ -1136,23 +1208,35 @@ end end ) - (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 $4 i32) + (local $5 i32) + (local $6 i32) + local.get $0 + i32.const 1073741804 + i32.ge_u + if + i32.const 1120 + i32.const 1184 + 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 + block $__inlined_func$~lib/rt/itcms/interrupt$70 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 @@ -1166,9 +1250,9 @@ i32.const 1024 i32.add global.set $~lib/rt/itcms/threshold - br $__inlined_func$~lib/rt/itcms/interrupt$69 + br $__inlined_func$~lib/rt/itcms/interrupt$70 end - local.get $1 + local.get $2 i32.const 0 i32.gt_s br_if $do-loop|0 @@ -1191,31 +1275,86 @@ call $~lib/rt/tlsf/initialize end global.get $~lib/rt/tlsf/ROOT + local.set $4 + local.get $0 + i32.const 16 + i32.add local.tee $2 + i32.const 1073741820 + i32.gt_u + if + i32.const 1120 + i32.const 1456 + i32.const 461 + i32.const 29 + call $~lib/builtins/abort + unreachable + end + local.get $4 + local.get $2 + i32.const 12 + i32.le_u + if (result i32) + i32.const 12 + else + local.get $2 + i32.const 19 + i32.add + i32.const -16 + i32.and + i32.const 4 + i32.sub + end + local.tee $5 call $~lib/rt/tlsf/searchBlock - local.tee $1 + local.tee $2 i32.eqz if memory.size - local.tee $1 + local.tee $2 + local.get $5 + i32.const 256 + i32.ge_u + if (result i32) + local.get $5 + i32.const 536870910 + i32.lt_u + if (result i32) + local.get $5 + i32.const 1 + i32.const 27 + local.get $5 + i32.clz + i32.sub + i32.shl + i32.add + i32.const 1 + i32.sub + else + local.get $5 + end + else + local.get $5 + end i32.const 4 - local.get $2 + local.get $4 i32.load offset=1568 - local.get $1 + local.get $2 i32.const 16 i32.shl i32.const 4 i32.sub i32.ne i32.shl - i32.const 65563 + i32.add + i32.const 65535 i32.add i32.const -65536 i32.and i32.const 16 i32.shr_u local.tee $3 - local.get $1 + local.get $2 local.get $3 i32.gt_s select @@ -1231,8 +1370,8 @@ unreachable end end + local.get $4 local.get $2 - local.get $1 i32.const 16 i32.shl memory.size @@ -1240,119 +1379,136 @@ i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - local.get $2 + local.get $4 + local.get $5 call $~lib/rt/tlsf/searchBlock - local.tee $1 + local.tee $2 i32.eqz if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 499 i32.const 16 call $~lib/builtins/abort unreachable end end - local.get $1 + local.get $5 + local.get $2 i32.load i32.const -4 i32.and - i32.const 28 - i32.lt_u + i32.gt_u if i32.const 0 - i32.const 1392 + i32.const 1456 i32.const 501 i32.const 14 call $~lib/builtins/abort unreachable end + local.get $4 local.get $2 - local.get $1 call $~lib/rt/tlsf/removeBlock - local.get $1 + local.get $2 i32.load - local.tee $3 + local.set $6 + local.get $5 + i32.const 4 + i32.add + i32.const 15 + i32.and + if + i32.const 0 + i32.const 1456 + i32.const 361 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + local.get $6 i32.const -4 i32.and - i32.const 28 + local.get $5 i32.sub - local.tee $4 + local.tee $3 i32.const 16 i32.ge_u if - local.get $1 - local.get $3 + local.get $2 + local.get $5 + local.get $6 i32.const 2 i32.and - i32.const 28 i32.or i32.store - local.get $1 - i32.const 32 + local.get $2 + i32.const 4 i32.add - local.tee $3 - local.get $4 + local.get $5 + i32.add + local.tee $5 + local.get $3 i32.const 4 i32.sub i32.const 1 i32.or i32.store - local.get $2 - local.get $3 + local.get $4 + local.get $5 call $~lib/rt/tlsf/insertBlock else - local.get $1 - local.get $3 + local.get $2 + local.get $6 i32.const -2 i32.and i32.store - local.get $1 + local.get $2 i32.const 4 i32.add - local.get $1 + local.get $2 i32.load i32.const -4 i32.and i32.add - local.tee $2 - local.get $2 + local.tee $3 + local.get $3 i32.load i32.const -3 i32.and i32.store end + local.get $2 local.get $1 - local.get $0 i32.store offset=12 - local.get $1 - i32.const 4 + local.get $2 + local.get $0 i32.store offset=16 global.get $~lib/rt/itcms/fromSpace - local.tee $0 + local.tee $1 i32.load offset=8 - local.set $2 + local.set $3 + local.get $2 local.get $1 - local.get $0 global.get $~lib/rt/itcms/white i32.or i32.store offset=4 - local.get $1 local.get $2 + local.get $3 i32.store offset=8 + local.get $3 local.get $2 - local.get $1 - local.get $2 + local.get $3 i32.load offset=4 i32.const 3 i32.and i32.or i32.store offset=4 - local.get $0 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 @@ -1360,40 +1516,44 @@ i32.add i32.add global.set $~lib/rt/itcms/total - local.get $1 + local.get $2 i32.const 20 i32.add - local.tee $0 + local.tee $1 i32.const 0 - i32.store align=1 local.get $0 + memory.fill + local.get $1 ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid - block $call-inferred/Foo - block $call-inferred/Baz - 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 $call-inferred/Baz $call-inferred/Foo $invalid + block $call-inferred/Baz + block $call-inferred/Bar + block $call-inferred/Foo + 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 $call-inferred/Foo $call-inferred/Bar $call-inferred/Baz $invalid + end + return end return end return end - return - end - local.get $0 - i32.load - local.tee $0 - if local.get $0 - call $~lib/rt/itcms/__visit + i32.load + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end + return end return end @@ -1412,7 +1572,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1532 + i32.const 1536 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1421,48 +1581,85 @@ memory.size i32.const 16 i32.shl - i32.const 34300 + i32.const 34304 i32.sub i32.const 1 i32.shr_u global.set $~lib/rt/itcms/threshold - i32.const 1172 - i32.const 1168 + i32.const 1236 + i32.const 1232 i32.store - i32.const 1176 - i32.const 1168 + i32.const 1240 + i32.const 1232 i32.store - i32.const 1168 + i32.const 1232 global.set $~lib/rt/itcms/pinSpace - i32.const 1204 - i32.const 1200 + i32.const 1268 + i32.const 1264 i32.store - i32.const 1208 - i32.const 1200 + i32.const 1272 + i32.const 1264 i32.store - i32.const 1200 + i32.const 1264 global.set $~lib/rt/itcms/toSpace - i32.const 1348 - i32.const 1344 + i32.const 1412 + i32.const 1408 i32.store - i32.const 1352 - i32.const 1344 + i32.const 1416 + i32.const 1408 i32.store - i32.const 1344 + i32.const 1408 global.set $~lib/rt/itcms/fromSpace + i32.const 0 + call $call-inferred/Foo#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + i32.const 42 + i32.ne + if + i32.const 0 + i32.const 1056 + i32.const 22 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + i32.const 0 + call $call-inferred/Foo#constructor + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.load + i32.const 42 + i32.ne + if + i32.const 0 + i32.const 1056 + i32.const 23 + 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 1532 + i32.const 1536 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 4 + i32.const 0 + i32.const 5 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -1472,37 +1669,64 @@ local.get $0 i32.store offset=4 global.get $~lib/memory/__stack_pointer - i32.const 8 + i32.const 4 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1532 + i32.const 1536 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer - i64.const 0 - i64.store + i32.const 0 + i32.store local.get $0 i32.eqz if global.get $~lib/memory/__stack_pointer - i32.const 5 + i32.const 0 + i32.const 0 call $~lib/rt/itcms/__new local.tee $0 i32.store end global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 local.get $0 - i32.store offset=4 - local.get $0 - i32.const 42 i32.store global.get $~lib/memory/__stack_pointer i32.const 8 i32.add global.set $~lib/memory/__stack_pointer - local.get $1 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1536 + 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 4 + i32.const 6 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + call $call-inferred/Foo#constructor + local.tee $0 i32.store global.get $~lib/memory/__stack_pointer i32.const 8 @@ -1517,7 +1741,7 @@ i32.ne if i32.const 0 - i32.const 1456 + i32.const 1056 i32.const 34 i32.const 1 call $~lib/builtins/abort @@ -1529,11 +1753,52 @@ global.set $~lib/memory/__stack_pointer return end - i32.const 34320 - i32.const 34368 + i32.const 34336 + i32.const 34384 i32.const 1 i32.const 1 call $~lib/builtins/abort unreachable ) + (func $call-inferred/Foo#constructor (param $0 i32) (result i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1536 + i32.lt_s + if + i32.const 34336 + i32.const 34384 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $0 + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.const 4 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 42 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + ) ) diff --git a/tests/compiler/call-inferred.ts b/tests/compiler/call-inferred.ts index 854ff4362a..4c2dfb21bb 100644 --- a/tests/compiler/call-inferred.ts +++ b/tests/compiler/call-inferred.ts @@ -1,16 +1,16 @@ -// function foo(a: T): T { -// return a; -// } +function foo(a: T): T { + return a; +} -// assert(foo(42) == 42); -// assert(foo(42.0) == 42); -// assert(foo(42.0) == 42); +assert(foo(42) == 42); +assert(foo(42.0) == 42); +assert(foo(42.0) == 42); -// function bar(a: T = 42.0): T { -// return a; -// } +function bar(a: T = 42.0): T { + return a; +} -// assert(bar() == 42); +assert(bar() == 42); class Foo { constructor(public value: T) {} @@ -19,16 +19,16 @@ class Foo { } } -// assert(new Foo(42).value == 42); -// assert(Foo.create(42).value == 42); +assert(new Foo(42).value == 42); +assert(Foo.create(42).value == 42); -// class Bar { -// doSomething(a: T): T { -// return a; -// } -// } +class Bar { + doSomething(a: T): T { + return a; + } +} -// assert(new Bar().doSomething(42) == 42); +assert(new Bar().doSomething(42) == 42); class Baz extends Foo {} assert(new Baz(42).value == 42);