diff --git a/src/ast.ts b/src/ast.ts index da2271ef3d..38c1e5e8e4 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -49,6 +49,7 @@ export const enum NodeKind { Source, // types + ResolvedType, NamedType, FunctionType, TypeName, @@ -168,6 +169,10 @@ export abstract class Node { return new NamedTypeNode(Node.createSimpleTypeName("", range), null, false, range); } + static createResolvedType(type: Type): ResolvedType { + return new ResolvedType(type); + } + static createTypeParameter( name: IdentifierExpression, extendsType: NamedTypeNode | null, @@ -863,6 +868,8 @@ export abstract class TypeNode extends Node { if (functionTypeNode.returnType.hasGenericComponent(typeParameterNodes)) return true; let explicitThisType = functionTypeNode.explicitThisType; if (explicitThisType && explicitThisType.hasGenericComponent(typeParameterNodes)) return true; + } else if (this.kind == NodeKind.ResolvedType) { + return false; } else { assert(false); } @@ -870,6 +877,15 @@ export abstract class TypeNode extends Node { } } +/** Represents a resolved type. Will be generated when */ +export class ResolvedType extends TypeNode { + constructor( + public type: Type + ) { + super(NodeKind.ResolvedType, false, Source.native.range); + } +} + /** Represents a type name. */ export class TypeName extends Node { constructor( diff --git a/src/parser.ts b/src/parser.ts index 58050e837e..56bb4a6571 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2379,11 +2379,6 @@ export class Parser extends DiagnosticEmitter { if (tn.skip(Token.Colon)) { type = this.parseType(tn); if (!type) return null; - } else { - this.error( - DiagnosticCode.Type_expected, - tn.range() - ); // recoverable } let initializer: Expression | null = null; if (tn.skip(Token.Equals)) { diff --git a/src/resolver.ts b/src/resolver.ts index d6177806bd..a5a33af575 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -76,7 +76,8 @@ import { NewExpression, ArrayLiteralExpression, ArrowKind, - ExpressionStatement + ExpressionStatement, + ResolvedType } from "./ast"; import { @@ -159,6 +160,9 @@ export class Resolver extends DiagnosticEmitter { node.currentlyResolving = true; let resolved: Type | null = null; switch (node.kind) { + case NodeKind.ResolvedType: + resolved = (node).type; + break; case NodeKind.NamedType: { resolved = this.resolveNamedType( node, @@ -3658,6 +3662,23 @@ export class Resolver extends DiagnosticEmitter { prototype.parent // same level as prototype ); let getterPrototype = prototype.getterPrototype; + let setterPrototype = prototype.setterPrototype; + + let initializerNode = prototype.initializerNode; + if (initializerNode != null && prototype.typeNode == null) { + let initialzerType = this.resolveExpression(initializerNode, instance.file.startFunction.flow); + if (initialzerType) { + if (getterPrototype) { + assert(isTypeOmitted(getterPrototype.functionTypeNode.returnType)); + getterPrototype.functionTypeNode.returnType = Node.createResolvedType(initialzerType); + } + if (setterPrototype) { + assert(isTypeOmitted(setterPrototype.functionTypeNode.parameters[0].type)); + setterPrototype.functionTypeNode.parameters[0].type = Node.createResolvedType(initialzerType); + } + } + } + if (getterPrototype) { let getterInstance = this.resolveFunction( getterPrototype, @@ -3670,7 +3691,6 @@ export class Resolver extends DiagnosticEmitter { instance.setType(getterInstance.signature.returnType); } } - let setterPrototype = prototype.setterPrototype; if (setterPrototype) { let setterInstance = this.resolveFunction( setterPrototype, diff --git a/tests/compiler/class.debug.wat b/tests/compiler/class.debug.wat index e8f373491e..53324bef57 100644 --- a/tests/compiler/class.debug.wat +++ b/tests/compiler/class.debug.wat @@ -2,17 +2,21 @@ (type $0 (func (param i32 i32))) (type $1 (func (param i32) (result i32))) (type $2 (func (param i32))) - (type $3 (func)) - (type $4 (func (param i32 i32) (result i32))) + (type $3 (func (param i32 i32) (result i32))) + (type $4 (func)) (type $5 (func (param i32 i32 i32))) (type $6 (func (param f32 f32) (result f32))) - (type $7 (func (param i32 i32 i32) (result i32))) - (type $8 (func (param i32 f32 f32) (result f32))) - (type $9 (func (param i32 i32 i32 i32))) - (type $10 (func (param i32 i32 i64) (result i32))) - (type $11 (func (result i32))) + (type $7 (func (param i32 i32 i32 i32))) + (type $8 (func (param i32 i32 i64) (result i32))) + (type $9 (func (result i32))) + (type $10 (func (param i32 f32))) + (type $11 (func (param i32 i32 i32 i32 i32) (result i32))) + (type $12 (func (param i32) (result f32))) + (type $13 (func (param i32 i32 i32) (result i32))) + (type $14 (func (param i32 f32 f32) (result f32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (global $class/Animal.ONE (mut i32) (i32.const 1)) + (global $class/outsideF32 (mut f32) (f32.const 1.2000000476837158)) (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)) @@ -27,11 +31,13 @@ (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 $class/memberTypeInfer (mut i32) (i32.const 0)) + (global $~lib/native/ASC_SHRINK_LEVEL i32 (i32.const 0)) (global $~lib/native/ASC_RUNTIME i32 (i32.const 2)) - (global $~lib/rt/__rtti_base i32 (i32.const 512)) - (global $~lib/memory/__data_end i32 (i32.const 544)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33312)) - (global $~lib/memory/__heap_base i32 (i32.const 33312)) + (global $~lib/rt/__rtti_base i32 (i32.const 688)) + (global $~lib/memory/__data_end i32 (i32.const 724)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 33492)) + (global $~lib/memory/__heap_base i32 (i32.const 33492)) (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") @@ -41,9 +47,14 @@ (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\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h\00") - (data $9 (i32.const 460) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") - (data $10 (i32.const 512) "\07\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\02\t\00\00") + (data $8 (i32.const 412) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00h\00h\00h\00\00\00\00\00\00\00") + (data $9 (i32.const 444) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00i\003\002\00\00\00\00\00\00\00") + (data $10 (i32.const 476) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\10\00\00\00c\00l\00a\00s\00s\00.\00t\00s\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data $11 (i32.const 524) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\06\00\00\00f\003\002\00\00\00\00\00\00\00") + (data $12 (i32.const 556) "\1c\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\0c\00\00\00S\00t\00r\00i\00n\00g\00") + (data $13 (i32.const 588) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h\00") + (data $14 (i32.const 636) ",\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00\00\00") + (data $15 (i32.const 688) "\08\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\02\t\00\00") (table $0 1 1 funcref) (elem $0 (i32.const 1)) (export "testGenericInitializer" (func $class/testGenericInitializer)) @@ -67,66 +78,6 @@ f32.add return ) - (func $start:class - i32.const 4 - i32.const 4 - i32.eq - drop - global.get $class/Animal.ONE - drop - i32.const 1 - i32.const 2 - call $class/Animal.add - drop - f32.const 1 - f32.const 2 - call $class/Animal.sub - drop - ) - (func $class/Animal#instanceAdd (param $this i32) (param $a i32) (param $b i32) (result i32) - local.get $a - local.get $b - i32.add - global.get $class/Animal.ONE - i32.add - return - ) - (func $class/Animal#instanceSub (param $this i32) (param $a f32) (param $b f32) (result f32) - local.get $a - local.get $b - f32.sub - global.get $class/Animal.ONE - f32.convert_i32_s - f32.add - return - ) - (func $class/Animal#get:one (param $this i32) (result i32) - local.get $this - i32.load - ) - (func $class/Animal#get:two (param $this i32) (result i32) - local.get $this - i32.load16_s offset=4 - ) - (func $class/Animal#get:three (param $this i32) (result i32) - local.get $this - i32.load8_s offset=6 - ) - (func $class/Animal#set:one (param $this i32) (param $one i32) - local.get $this - local.get $one - i32.store - ) - (func $class/Animal#set:two (param $this i32) (param $two i32) - local.get $this - local.get $two - i32.store16 offset=4 - ) - (func $class/Animal#set:three (param $this i32) (param $three i32) - local.get $this - local.get $three - i32.store8 offset=6 - ) (func $~lib/rt/itcms/Object#set:nextWithColor (param $this i32) (param $nextWithColor i32) local.get $this local.get $nextWithColor @@ -2327,6 +2278,16 @@ local.get $ptr return ) + (func $class/MemberTypeInfer#set:a (param $this i32) (param $a i32) + local.get $this + local.get $a + i32.store + ) + (func $class/MemberTypeInfer#set:b (param $this i32) (param $b f32) + local.get $this + local.get $b + f32.store offset=4 + ) (func $~lib/rt/itcms/__link (param $parentPtr i32) (param $childPtr i32) (param $expectMultiple i32) (local $child i32) (local $parent i32) @@ -2395,6 +2356,188 @@ end end ) + (func $class/MemberTypeInfer#set:c (param $this i32) (param $c i32) + local.get $this + local.get $c + i32.store offset=8 + local.get $this + local.get $c + i32.const 0 + call $~lib/rt/itcms/__link + ) + (func $class/MemberTypeInfer#get:a (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $~lib/rt/common/OBJECT#get:rtSize (param $this i32) (result i32) + local.get $this + i32.load offset=16 + ) + (func $~lib/string/String#get:length (param $this i32) (result i32) + local.get $this + i32.const 20 + i32.sub + call $~lib/rt/common/OBJECT#get:rtSize + i32.const 1 + i32.shr_u + return + ) + (func $~lib/util/string/compareImpl (param $str1 i32) (param $index1 i32) (param $str2 i32) (param $index2 i32) (param $len i32) (result i32) + (local $ptr1 i32) + (local $ptr2 i32) + (local $7 i32) + (local $a i32) + (local $b i32) + local.get $str1 + local.get $index1 + i32.const 1 + i32.shl + i32.add + local.set $ptr1 + local.get $str2 + local.get $index2 + i32.const 1 + i32.shl + i32.add + local.set $ptr2 + i32.const 0 + i32.const 2 + i32.lt_s + drop + local.get $len + i32.const 4 + i32.ge_u + if (result i32) + local.get $ptr1 + i32.const 7 + i32.and + local.get $ptr2 + i32.const 7 + i32.and + i32.or + i32.eqz + else + i32.const 0 + end + if + block $do-break|0 + loop $do-loop|0 + local.get $ptr1 + i64.load + local.get $ptr2 + i64.load + i64.ne + if + br $do-break|0 + end + local.get $ptr1 + i32.const 8 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 8 + i32.add + local.set $ptr2 + local.get $len + i32.const 4 + i32.sub + local.set $len + local.get $len + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + loop $while-continue|1 + local.get $len + local.tee $7 + i32.const 1 + i32.sub + local.set $len + local.get $7 + if + local.get $ptr1 + i32.load16_u + local.set $a + local.get $ptr2 + i32.load16_u + local.set $b + local.get $a + local.get $b + i32.ne + if + local.get $a + local.get $b + i32.sub + return + end + local.get $ptr1 + i32.const 2 + i32.add + local.set $ptr1 + local.get $ptr2 + i32.const 2 + i32.add + local.set $ptr2 + br $while-continue|1 + end + end + i32.const 0 + return + ) + (func $class/MemberTypeInfer#get:b (param $this i32) (result f32) + local.get $this + f32.load offset=4 + ) + (func $class/MemberTypeInfer#get:c (param $this i32) (result i32) + local.get $this + i32.load offset=8 + ) + (func $class/Animal#instanceAdd (param $this i32) (param $a i32) (param $b i32) (result i32) + local.get $a + local.get $b + i32.add + global.get $class/Animal.ONE + i32.add + return + ) + (func $class/Animal#instanceSub (param $this i32) (param $a f32) (param $b f32) (result f32) + local.get $a + local.get $b + f32.sub + global.get $class/Animal.ONE + f32.convert_i32_s + f32.add + return + ) + (func $class/Animal#get:one (param $this i32) (result i32) + local.get $this + i32.load + ) + (func $class/Animal#get:two (param $this i32) (result i32) + local.get $this + i32.load16_s offset=4 + ) + (func $class/Animal#get:three (param $this i32) (result i32) + local.get $this + i32.load8_s offset=6 + ) + (func $class/Animal#set:one (param $this i32) (param $one i32) + local.get $this + local.get $one + i32.store + ) + (func $class/Animal#set:two (param $this i32) (param $two i32) + local.get $this + local.get $two + i32.store16 offset=4 + ) + (func $class/Animal#set:three (param $this i32) (param $three i32) + local.get $this + local.get $three + i32.store8 offset=6 + ) (func $~lib/array/Array#set:buffer (param $this i32) (param $buffer i32) local.get $this local.get $buffer @@ -2435,10 +2578,17 @@ ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) + global.get $class/memberTypeInfer + local.tee $1 + if + local.get $1 + local.get $0 + call $~lib/rt/itcms/__visit + end i32.const 224 local.get $0 call $~lib/rt/itcms/__visit - i32.const 432 + i32.const 608 local.get $0 call $~lib/rt/itcms/__visit i32.const 32 @@ -2461,6 +2611,20 @@ ) (func $~lib/object/Object~visit (param $0 i32) (param $1 i32) ) + (func $class/MemberTypeInfer~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 offset=8 + local.tee $2 + if + local.get $2 + local.get $1 + call $~lib/rt/itcms/__visit + end + ) (func $class/GenericInitializer~visit (param $0 i32) (param $1 i32) (local $2 i32) local.get $0 @@ -2491,28 +2655,34 @@ block $invalid block $~lib/array/Array block $class/GenericInitializer - block $class/Animal - 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 $class/Animal $class/GenericInitializer $~lib/array/Array $invalid + block $class/MemberTypeInfer + block $class/Animal + 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 $class/Animal $class/MemberTypeInfer $class/GenericInitializer $~lib/array/Array $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 + local.get $0 + local.get $1 + call $class/MemberTypeInfer~visit return end local.get $0 @@ -2529,6 +2699,213 @@ ) (func $~start call $start:class + ) + (func $~stack_check + global.get $~lib/memory/__stack_pointer + global.get $~lib/memory/__data_end + i32.lt_s + if + i32.const 33520 + i32.const 33568 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + ) + (func $class/MemberTypeInfer#constructor (param $this i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + local.get $this + i32.eqz + if + global.get $~lib/memory/__stack_pointer + i32.const 12 + 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 + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 1 + call $class/MemberTypeInfer#set:a + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + global.get $class/outsideF32 + call $class/MemberTypeInfer#set:b + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=4 + local.get $1 + i32.const 432 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store offset=8 + local.get $1 + call $class/MemberTypeInfer#set:c + local.get $this + local.set $1 + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $1 + ) + (func $~lib/string/String.__eq (param $left i32) (param $right i32) (result i32) + (local $leftLength i32) + (local $3 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + local.get $left + local.get $right + i32.eq + if + i32.const 1 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $right + i32.const 0 + i32.eq + end + if + i32.const 0 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/string/String#get:length + local.set $leftLength + local.get $leftLength + local.get $right + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + end + local.get $left + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store + local.get $3 + i32.const 0 + local.get $right + local.set $3 + global.get $~lib/memory/__stack_pointer + local.get $3 + i32.store offset=4 + local.get $3 + i32.const 0 + local.get $leftLength + call $~lib/util/string/compareImpl + i32.eqz + local.set $3 + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + return + ) + (func $start:class + (local $0 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + call $~stack_check + global.get $~lib/memory/__stack_pointer + i64.const 0 + i64.store + global.get $~lib/memory/__stack_pointer + i32.const 0 + i32.store offset=8 + i32.const 4 + i32.const 4 + i32.eq + drop + global.get $class/Animal.ONE + drop + i32.const 1 + i32.const 2 + call $class/Animal.add + drop + f32.const 1 + f32.const 2 + call $class/Animal.sub + drop memory.size i32.const 16 i32.shl @@ -2546,19 +2923,103 @@ i32.const 320 call $~lib/rt/itcms/initLazy global.set $~lib/rt/itcms/fromSpace - ) - (func $~stack_check + i32.const 0 + call $class/MemberTypeInfer#constructor + global.set $class/memberTypeInfer + global.get $class/memberTypeInfer + local.set $0 global.get $~lib/memory/__stack_pointer - global.get $~lib/memory/__data_end - i32.lt_s + local.get $0 + i32.store offset=8 + local.get $0 + call $class/MemberTypeInfer#get:a + drop + i32.const 464 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 464 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 496 + i32.const 53 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $class/memberTypeInfer + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $class/MemberTypeInfer#get:b + drop + i32.const 544 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 544 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz if - i32.const 33344 - i32.const 33392 + i32.const 0 + i32.const 496 + i32.const 54 i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $class/memberTypeInfer + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=8 + local.get $0 + call $class/MemberTypeInfer#get:c + drop + i32.const 576 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store + local.get $0 + i32.const 576 + local.set $0 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 496 + i32.const 55 i32.const 1 call $~lib/builtins/abort unreachable end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer ) (func $class/test (param $animal i32) (result i32) (local $ptr i32) @@ -2685,7 +3146,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 16 - i32.const 6 + i32.const 7 call $~lib/rt/itcms/__new local.tee $this i32.store @@ -2728,8 +3189,8 @@ i32.shr_u i32.gt_u if - i32.const 432 - i32.const 480 + i32.const 608 + i32.const 656 i32.const 70 i32.const 60 call $~lib/builtins/abort @@ -2819,7 +3280,7 @@ if global.get $~lib/memory/__stack_pointer i32.const 4 - i32.const 5 + i32.const 6 call $~lib/rt/itcms/__new local.tee $this i32.store diff --git a/tests/compiler/class.release.wat b/tests/compiler/class.release.wat index 710aef17f0..f68b633010 100644 --- a/tests/compiler/class.release.wat +++ b/tests/compiler/class.release.wat @@ -3,10 +3,10 @@ (type $1 (func (param i32))) (type $2 (func (param i32 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))) + (type $4 (func (param i32) (result i32))) + (type $5 (func (param i32 i32 i32 i32))) + (type $6 (func (param i32 i32 i64))) + (type $7 (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)) @@ -18,7 +18,8 @@ (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 34336)) + (global $class/memberTypeInfer (mut i32) (i32.const 0)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 34516)) (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") @@ -30,11 +31,22 @@ (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\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h") - (data $9 (i32.const 1484) ",") - (data $9.1 (i32.const 1496) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data $10 (i32.const 1536) "\07\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\02\t") + (data $8 (i32.const 1436) "\1c") + (data $8.1 (i32.const 1448) "\02\00\00\00\06\00\00\00h\00h\00h") + (data $9 (i32.const 1468) "\1c") + (data $9.1 (i32.const 1480) "\02\00\00\00\06\00\00\00i\003\002") + (data $10 (i32.const 1500) ",") + (data $10.1 (i32.const 1512) "\02\00\00\00\10\00\00\00c\00l\00a\00s\00s\00.\00t\00s") + (data $11 (i32.const 1548) "\1c") + (data $11.1 (i32.const 1560) "\02\00\00\00\06\00\00\00f\003\002") + (data $12 (i32.const 1580) "\1c") + (data $12.1 (i32.const 1592) "\02\00\00\00\0c\00\00\00S\00t\00r\00i\00n\00g") + (data $13 (i32.const 1612) ",") + (data $13.1 (i32.const 1624) "\02\00\00\00\1c\00\00\00I\00n\00v\00a\00l\00i\00d\00 \00l\00e\00n\00g\00t\00h") + (data $14 (i32.const 1660) ",") + (data $14.1 (i32.const 1672) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data $15 (i32.const 1712) "\08\00\00\00 \00\00\00 \00\00\00 \00\00\00\00\00\00\00 ") + (data $15.1 (i32.const 1744) "\02\t") (export "testGenericInitializer" (func $class/testGenericInitializer)) (export "memory" (memory $0)) (export "test" (func $export:class/test)) @@ -42,9 +54,15 @@ (func $~lib/rt/itcms/visitRoots (local $0 i32) (local $1 i32) + global.get $class/memberTypeInfer + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end i32.const 1248 call $~lib/rt/itcms/__visit - i32.const 1456 + i32.const 1632 call $~lib/rt/itcms/__visit i32.const 1056 call $~lib/rt/itcms/__visit @@ -109,7 +127,7 @@ local.get $1 global.set $~lib/rt/itcms/iter end - block $__inlined_func$~lib/rt/itcms/Object#unlink$137 + block $__inlined_func$~lib/rt/itcms/Object#unlink$153 local.get $0 i32.load offset=4 i32.const -4 @@ -121,7 +139,7 @@ i32.load offset=8 i32.eqz local.get $0 - i32.const 34336 + i32.const 34516 i32.lt_u i32.and i32.eqz @@ -133,7 +151,7 @@ call $~lib/builtins/abort unreachable end - br $__inlined_func$~lib/rt/itcms/Object#unlink$137 + br $__inlined_func$~lib/rt/itcms/Object#unlink$153 end local.get $0 i32.load offset=8 @@ -170,7 +188,7 @@ i32.const 1 else local.get $1 - i32.const 1536 + i32.const 1712 i32.load i32.gt_u if @@ -184,7 +202,7 @@ local.get $1 i32.const 2 i32.shl - i32.const 1540 + i32.const 1716 i32.add i32.load i32.const 32 @@ -768,10 +786,10 @@ if unreachable end - i32.const 34336 + i32.const 34528 i32.const 0 i32.store - i32.const 35904 + i32.const 36096 i32.const 0 i32.store loop $for-loop|0 @@ -782,7 +800,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 34336 + i32.const 34528 i32.add i32.const 0 i32.store offset=4 @@ -800,7 +818,7 @@ i32.add i32.const 2 i32.shl - i32.const 34336 + i32.const 34528 i32.add i32.const 0 i32.store offset=96 @@ -818,14 +836,14 @@ br $for-loop|0 end end - i32.const 34336 - i32.const 35908 + i32.const 34528 + i32.const 36100 memory.size i64.extend_i32_s i64.const 16 i64.shl call $~lib/rt/tlsf/addMemory - i32.const 34336 + i32.const 34528 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -910,7 +928,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 34336 + i32.const 34516 i32.lt_u if local.get $0 @@ -1006,7 +1024,7 @@ unreachable end local.get $0 - i32.const 34336 + i32.const 34516 i32.lt_u if local.get $0 @@ -1029,7 +1047,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 34336 + i32.const 34516 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1240,7 +1258,7 @@ global.get $~lib/rt/itcms/threshold i32.ge_u if - block $__inlined_func$~lib/rt/itcms/interrupt$71 + block $__inlined_func$~lib/rt/itcms/interrupt$69 i32.const 2048 local.set $2 loop $do-loop|0 @@ -1261,7 +1279,7 @@ i32.const 1024 i32.add global.set $~lib/rt/itcms/threshold - br $__inlined_func$~lib/rt/itcms/interrupt$71 + br $__inlined_func$~lib/rt/itcms/interrupt$69 end local.get $2 i32.const 0 @@ -1537,59 +1555,58 @@ memory.fill local.get $1 ) - (func $~lib/array/Array#set:buffer (param $0 i32) (param $1 i32) + (func $~lib/rt/itcms/__link (param $0 i32) (param $1 i32) (local $2 i32) - local.get $0 local.get $1 - i32.store + i32.eqz + if + return + end + local.get $0 + i32.eqz + if + i32.const 0 + i32.const 1120 + i32.const 295 + i32.const 14 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/rt/itcms/white + local.tee $2 local.get $1 + i32.const 20 + i32.sub + local.tee $1 + i32.load offset=4 + i32.const 3 + i32.and + i32.eq if local.get $0 - i32.eqz - if - i32.const 0 - i32.const 1120 - i32.const 295 - i32.const 14 - call $~lib/builtins/abort - unreachable - end - global.get $~lib/rt/itcms/white - local.tee $2 - local.get $1 i32.const 20 i32.sub - local.tee $1 i32.load offset=4 i32.const 3 i32.and + local.tee $0 + local.get $2 + i32.eqz i32.eq if + local.get $1 + call $~lib/rt/itcms/Object#makeGray + else + global.get $~lib/rt/itcms/state + i32.const 1 + i32.eq local.get $0 - i32.const 20 - i32.sub - i32.load offset=4 i32.const 3 - i32.and - local.tee $0 - local.get $2 - i32.eqz i32.eq + i32.and if local.get $1 call $~lib/rt/itcms/Object#makeGray - else - global.get $~lib/rt/itcms/state - i32.const 1 - i32.eq - local.get $0 - i32.const 3 - i32.eq - i32.and - if - local.get $1 - call $~lib/rt/itcms/Object#makeGray - end end end end @@ -1604,7 +1621,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1568 + i32.const 1748 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1616,7 +1633,7 @@ i32.store offset=8 local.get $0 i32.const 4 - i32.const 5 + i32.const 6 call $~lib/rt/itcms/__new local.tee $0 i32.store @@ -1625,113 +1642,95 @@ local.get $0 i32.store offset=4 local.get $1 - i32.const 4 - i32.sub - global.set $~lib/memory/__stack_pointer - global.get $~lib/memory/__stack_pointer - i32.const 1568 - i32.lt_s - br_if $folding-inner0 - global.get $~lib/memory/__stack_pointer - local.tee $2 - i32.const 0 - i32.store - local.get $0 - i32.eqz - if - local.get $2 - 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 + call $~lib/object/Object#constructor + local.tee $1 i32.store global.get $~lib/memory/__stack_pointer - local.get $0 + local.get $1 i32.store offset=4 global.get $~lib/memory/__stack_pointer i32.const 16 i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1568 + i32.const 1748 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer - local.tee $1 + local.tee $0 i64.const 0 i64.store - local.get $1 + local.get $0 i64.const 0 i64.store offset=8 - local.get $1 + local.get $0 i32.const 16 - i32.const 6 + i32.const 7 call $~lib/rt/itcms/__new - local.tee $1 + local.tee $2 i32.store global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 + local.get $2 + i32.const 0 + i32.store + local.get $2 i32.const 0 - call $~lib/array/Array#set:buffer + call $~lib/rt/itcms/__link global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 + local.get $2 i32.const 0 i32.store offset=4 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 + local.get $2 i32.const 0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 + local.get $2 i32.const 0 i32.store offset=12 global.get $~lib/memory/__stack_pointer i32.const 32 i32.const 1 call $~lib/rt/itcms/__new - local.tee $2 + local.tee $0 i32.store offset=8 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 global.get $~lib/memory/__stack_pointer - local.get $2 + local.get $0 i32.store offset=12 - local.get $1 local.get $2 - call $~lib/array/Array#set:buffer + local.get $0 + i32.store + local.get $2 + local.get $0 + call $~lib/rt/itcms/__link global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 local.get $2 + local.get $0 i32.store offset=4 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 + local.get $2 i32.const 32 i32.store offset=8 global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=4 - local.get $1 + local.get $2 i32.const 0 i32.store offset=12 global.get $~lib/memory/__stack_pointer @@ -1739,19 +1738,22 @@ i32.add global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - local.get $1 + local.get $2 i32.store offset=8 - local.get $0 local.get $1 - call $~lib/array/Array#set:buffer + local.get $2 + i32.store + local.get $1 + local.get $2 + call $~lib/rt/itcms/__link global.get $~lib/memory/__stack_pointer i32.const 12 i32.add global.set $~lib/memory/__stack_pointer return end - i32.const 34368 - i32.const 34416 + i32.const 34544 + i32.const 34592 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1762,15 +1764,18 @@ block $folding-inner0 block $invalid block $~lib/array/Array - block $class/Animal - 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 $folding-inner0 $class/Animal $folding-inner0 $~lib/array/Array $invalid + block $class/MemberTypeInfer + block $class/Animal + 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 $folding-inner0 $class/Animal $class/MemberTypeInfer $folding-inner0 $~lib/array/Array $invalid + end + return end return end @@ -1778,6 +1783,13 @@ end return end + local.get $0 + i32.load offset=8 + local.tee $0 + if + local.get $0 + call $~lib/rt/itcms/__visit + end return end global.get $~lib/memory/__stack_pointer @@ -1785,11 +1797,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1568 + i32.const 1748 i32.lt_s if - i32.const 34368 - i32.const 34416 + i32.const 34544 + i32.const 34592 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1822,38 +1834,407 @@ end ) (func $~start - memory.size - i32.const 16 - i32.shl - i32.const 34336 + (local $0 i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 12 i32.sub + global.set $~lib/memory/__stack_pointer + block $folding-inner0 + global.get $~lib/memory/__stack_pointer + i32.const 1748 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i64.const 0 + i64.store + local.get $0 + i32.const 0 + i32.store offset=8 + memory.size + i32.const 16 + i32.shl + i32.const 34516 + i32.sub + i32.const 1 + i32.shr_u + global.set $~lib/rt/itcms/threshold + i32.const 1172 + i32.const 1168 + i32.store + i32.const 1176 + i32.const 1168 + i32.store + i32.const 1168 + global.set $~lib/rt/itcms/pinSpace + i32.const 1204 + i32.const 1200 + i32.store + i32.const 1208 + i32.const 1200 + i32.store + i32.const 1200 + global.set $~lib/rt/itcms/toSpace + i32.const 1348 + i32.const 1344 + i32.store + i32.const 1352 + i32.const 1344 + i32.store + i32.const 1344 + global.set $~lib/rt/itcms/fromSpace + local.get $0 + i32.const 12 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1748 + i32.lt_s + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $0 + i64.const 0 + i64.store + local.get $0 + i32.const 0 + i32.store offset=8 + local.get $0 + i32.const 12 + i32.const 5 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.tee $1 + local.get $0 + i32.store offset=4 + local.get $1 + local.get $0 + call $~lib/object/Object#constructor + local.tee $0 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + i32.const 1 + i32.store + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + local.get $0 + f32.const 1.2000000476837158 + f32.store offset=4 + global.get $~lib/memory/__stack_pointer + local.get $0 + i32.store offset=4 + global.get $~lib/memory/__stack_pointer + i32.const 1456 + i32.store offset=8 + local.get $0 + i32.const 1456 + i32.store offset=8 + local.get $0 + i32.const 1456 + call $~lib/rt/itcms/__link + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 + global.set $class/memberTypeInfer + global.get $~lib/memory/__stack_pointer + global.get $class/memberTypeInfer + local.tee $0 + i32.store offset=8 + local.get $0 + i32.load + drop + global.get $~lib/memory/__stack_pointer + i32.const 1488 + i32.store + global.get $~lib/memory/__stack_pointer + i32.const 1488 + i32.store offset=4 + i32.const 1488 + i32.const 1488 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1520 + i32.const 53 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $class/memberTypeInfer + local.tee $1 + i32.store offset=8 + local.get $1 + f32.load offset=4 + drop + local.get $0 + i32.const 1568 + i32.store + local.get $0 + i32.const 1568 + i32.store offset=4 + i32.const 1568 + i32.const 1568 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1520 + i32.const 54 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $0 + global.get $class/memberTypeInfer + local.tee $1 + i32.store offset=8 + local.get $1 + i32.load offset=8 + drop + local.get $0 + i32.const 1600 + i32.store + local.get $0 + i32.const 1600 + i32.store offset=4 + i32.const 1600 + i32.const 1600 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 1520 + i32.const 55 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + i32.const 12 + i32.add + global.set $~lib/memory/__stack_pointer + return + end + i32.const 34544 + i32.const 34592 i32.const 1 - i32.shr_u - global.set $~lib/rt/itcms/threshold - i32.const 1172 - i32.const 1168 - i32.store - i32.const 1176 - i32.const 1168 - i32.store - i32.const 1168 - global.set $~lib/rt/itcms/pinSpace - i32.const 1204 - i32.const 1200 - i32.store - i32.const 1208 - i32.const 1200 - i32.store - i32.const 1200 - global.set $~lib/rt/itcms/toSpace - i32.const 1348 - i32.const 1344 - i32.store - i32.const 1352 - i32.const 1344 + i32.const 1 + call $~lib/builtins/abort + unreachable + ) + (func $~lib/string/String.__eq (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1748 + i32.lt_s + if + i32.const 34544 + i32.const 34592 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $2 + i64.const 0 + i64.store + local.get $0 + local.get $1 + i32.eq + if + local.get $2 + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 1 + return + end + block $folding-inner0 + local.get $1 + i32.eqz + local.get $0 + i32.eqz + i32.or + br_if $folding-inner0 + global.get $~lib/memory/__stack_pointer + local.tee $4 + local.tee $2 + local.get $0 + i32.store + local.get $0 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + local.set $3 + local.get $2 + local.get $1 + i32.store + local.get $3 + local.get $1 + i32.const 20 + i32.sub + i32.load offset=16 + i32.const 1 + i32.shr_u + i32.ne + br_if $folding-inner0 + local.get $4 + local.get $0 + i32.store + local.get $0 + local.set $2 + local.get $4 + local.get $1 + i32.store offset=4 + local.get $3 + local.tee $0 + i32.const 4 + i32.ge_u + if (result i32) + local.get $2 + i32.const 7 + i32.and + local.get $1 + i32.const 7 + i32.and + i32.or + else + i32.const 1 + end + i32.eqz + if + loop $do-loop|0 + local.get $2 + i64.load + local.get $1 + i64.load + i64.eq + if + local.get $2 + i32.const 8 + i32.add + local.set $2 + local.get $1 + i32.const 8 + i32.add + local.set $1 + local.get $0 + i32.const 4 + i32.sub + local.tee $0 + i32.const 4 + i32.ge_u + br_if $do-loop|0 + end + end + end + block $__inlined_func$~lib/util/string/compareImpl$85 + loop $while-continue|1 + local.get $0 + local.tee $3 + i32.const 1 + i32.sub + local.set $0 + local.get $3 + if + local.get $2 + i32.load16_u + local.tee $5 + local.get $1 + i32.load16_u + local.tee $4 + i32.sub + local.set $3 + local.get $4 + local.get $5 + i32.ne + br_if $__inlined_func$~lib/util/string/compareImpl$85 + local.get $2 + i32.const 2 + i32.add + local.set $2 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $while-continue|1 + end + end + i32.const 0 + local.set $3 + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $3 + i32.eqz + return + end + global.get $~lib/memory/__stack_pointer + i32.const 8 + i32.add + global.set $~lib/memory/__stack_pointer + i32.const 0 + ) + (func $~lib/object/Object#constructor (param $0 i32) (result i32) + (local $1 i32) + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.sub + global.set $~lib/memory/__stack_pointer + global.get $~lib/memory/__stack_pointer + i32.const 1748 + i32.lt_s + if + i32.const 34544 + i32.const 34592 + i32.const 1 + i32.const 1 + call $~lib/builtins/abort + unreachable + end + global.get $~lib/memory/__stack_pointer + local.tee $1 + i32.const 0 i32.store - i32.const 1344 - global.set $~lib/rt/itcms/fromSpace + local.get $0 + i32.eqz + if + local.get $1 + i32.const 0 + i32.const 0 + call $~lib/rt/itcms/__new + local.tee $0 + i32.store + end + global.get $~lib/memory/__stack_pointer + i32.const 4 + i32.add + global.set $~lib/memory/__stack_pointer + local.get $0 ) (func $export:class/test (param $0 i32) (result i32) (local $1 i32) @@ -1863,7 +2244,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 1568 + i32.const 1748 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1875,7 +2256,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 1568 + i32.const 1748 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1938,8 +2319,8 @@ local.get $0 return end - i32.const 34368 - i32.const 34416 + i32.const 34544 + i32.const 34592 i32.const 1 i32.const 1 call $~lib/builtins/abort diff --git a/tests/compiler/class.ts b/tests/compiler/class.ts index 93a95068da..9ceeb304bd 100644 --- a/tests/compiler/class.ts +++ b/tests/compiler/class.ts @@ -40,3 +40,16 @@ class GenericInitializer { export function testGenericInitializer(): void { new GenericInitializer(); } + + +let outsideF32: f32 = 1.2; +class MemberTypeInfer { + a = 1; + b = outsideF32; + c = "hhh"; +} + +let memberTypeInfer = new MemberTypeInfer(); +assert(nameof(memberTypeInfer.a) == nameof()); +assert(nameof(memberTypeInfer.b) == nameof()); +assert(nameof(memberTypeInfer.c) == nameof()); diff --git a/tests/parser/class.ts b/tests/parser/class.ts index 8f9c997e6f..0a9c656916 100644 --- a/tests/parser/class.ts +++ b/tests/parser/class.ts @@ -41,3 +41,9 @@ export class Invalid { // ERROR 1042: "'override' modifier cannot be used here." override overrideMethod(): void {} } + +export class MemberTypeInfer { + a = 1; + b = 1.2; + c = "hhh"; +} diff --git a/tests/parser/class.ts.fixture.ts b/tests/parser/class.ts.fixture.ts index 8d429d4f5c..9fc7658f87 100644 --- a/tests/parser/class.ts.fixture.ts +++ b/tests/parser/class.ts.fixture.ts @@ -19,6 +19,11 @@ export class Invalid { declare declareMethod(): i32 {} overrideMethod(): void {} } +export class MemberTypeInfer { + a = 1; + b = 1.2; + c = "hhh"; +} // ERROR 1092: "Type parameters cannot appear on a constructor declaration." in class.ts(15,14+3) // ERROR 1110: "Type expected." in class.ts(18,21+0) // ERROR 1094: "An accessor cannot have type parameters." in class.ts(23,21+3)