From 854d34bcd450b9d411dbc1452a98add874ca7949 Mon Sep 17 00:00:00 2001 From: "Congcong Cai (EE-CN-42)" Date: Mon, 27 Jun 2022 16:43:43 +0800 Subject: [PATCH 1/2] fix: reolve `typeof` operator return string --- src/resolver.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/resolver.ts b/src/resolver.ts index 2cdfe69a4f..794937ceac 100644 --- a/src/resolver.ts +++ b/src/resolver.ts @@ -1778,6 +1778,9 @@ export class Resolver extends DiagnosticEmitter { } return null; } + case Token.TYPEOF: { + return this.program.stringInstance.type; + } default: assert(false); } return null; From 07f8b41b8cdcf3ed21beca71f69b99ef39bba2ca Mon Sep 17 00:00:00 2001 From: "Congcong Cai (EE-CN-42)" Date: Mon, 27 Jun 2022 16:51:40 +0800 Subject: [PATCH 2/2] test: add testcase for #2282 --- tests/compiler/resolve-unary.debug.wat | 89 +++++++++++++----- tests/compiler/resolve-unary.release.wat | 110 ++++++++++++++--------- tests/compiler/resolve-unary.ts | 4 + 3 files changed, 139 insertions(+), 64 deletions(-) diff --git a/tests/compiler/resolve-unary.debug.wat b/tests/compiler/resolve-unary.debug.wat index 4868905c2a..84f4f86a2d 100644 --- a/tests/compiler/resolve-unary.debug.wat +++ b/tests/compiler/resolve-unary.debug.wat @@ -32,10 +32,10 @@ (global $resolve-unary/b (mut i32) (i32.const 1)) (global $resolve-unary/foo (mut i32) (i32.const 0)) (global $resolve-unary/bar (mut i32) (i32.const 0)) - (global $~lib/rt/__rtti_base i32 (i32.const 2704)) - (global $~lib/memory/__data_end i32 (i32.const 2748)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19132)) - (global $~lib/memory/__heap_base i32 (i32.const 19132)) + (global $~lib/rt/__rtti_base i32 (i32.const 2816)) + (global $~lib/memory/__data_end i32 (i32.const 2868)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 19252)) + (global $~lib/memory/__heap_base i32 (i32.const 19252)) (memory $0 1) (data (i32.const 12) "|\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006\00\00\00\00\00\00\00\00\00") (data (i32.const 140) "<\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00&\00\00\00~\00l\00i\00b\00/\00u\00t\00i\00l\00/\00n\00u\00m\00b\00e\00r\00.\00t\00s\00\00\00\00\00\00\00") @@ -66,9 +66,12 @@ (data (i32.const 2604) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00-\00-\00i\00\00\00\00\00\00\00") (data (i32.const 2636) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00i\00+\00+\00\00\00\00\00\00\00") (data (i32.const 2668) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\06\00\00\00i\00-\00-\00\00\00\00\00\00\00") - (data (i32.const 2704) "\05\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00") - (table $0 1 1 funcref) - (elem $0 (i32.const 1)) + (data (i32.const 2700) "\1c\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\0c\00\00\00n\00u\00m\00b\00e\00r\00") + (data (i32.const 2732) "\1c\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\08\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2764) ",\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\10\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 2816) "\06\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (table $0 2 2 funcref) + (elem $0 (i32.const 1) $start:resolve-unary~anonymous|0) (export "memory" (memory $0)) (start $~start) (func $~lib/util/number/decimalCount32 (param $0 i32) (result i32) @@ -2765,6 +2768,12 @@ (func $resolve-unary/Bar.postfix_dec (param $0 i32) (result i32) i32.const 2688 ) + (func $start:resolve-unary~anonymous|0 + nop + ) + (func $resolve-unary/generic<~lib/string/String> (param $0 i32) + nop + ) (func $~lib/rt/__visit_globals (param $0 i32) (local $1 i32) global.get $resolve-unary/foo @@ -2805,30 +2814,47 @@ call $~lib/rt/itcms/__visit end ) + (func $~lib/function/Function<%28%29=>void>#__visit (param $0 i32) (param $1 i32) + local.get $0 + i32.load offset=4 + local.get $1 + call $~lib/rt/itcms/__visit + ) + (func $~lib/function/Function<%28%29=>void>~visit (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + call $~lib/function/Function<%28%29=>void>#__visit + ) (func $~lib/rt/__visit_members (param $0 i32) (param $1 i32) block $invalid - block $resolve-unary/Bar - block $resolve-unary/Foo - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $resolve-unary/Foo $resolve-unary/Bar $invalid + block $~lib/function/Function<%28%29=>void> + block $resolve-unary/Bar + block $resolve-unary/Foo + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $resolve-unary/Foo $resolve-unary/Bar $~lib/function/Function<%28%29=>void> $invalid + 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 end + local.get $0 + local.get $1 + call $~lib/function/Function<%28%29=>void>~visit return end unreachable @@ -2841,8 +2867,8 @@ global.get $~lib/memory/__data_end i32.lt_s if - i32.const 19152 - i32.const 19200 + i32.const 19280 + i32.const 19328 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -3501,6 +3527,25 @@ call $~lib/builtins/abort unreachable end + i32.const 1 + drop + i32.const 2720 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + call $~lib/string/String#get:length + drop + i32.const 2752 + drop + i32.const 2784 + local.set $1 + global.get $~lib/memory/__stack_pointer + local.get $1 + i32.store + local.get $1 + call $resolve-unary/generic<~lib/string/String> global.get $~lib/memory/__stack_pointer i32.const 20 i32.add diff --git a/tests/compiler/resolve-unary.release.wat b/tests/compiler/resolve-unary.release.wat index 96f39fbf32..0a439e4858 100644 --- a/tests/compiler/resolve-unary.release.wat +++ b/tests/compiler/resolve-unary.release.wat @@ -22,7 +22,7 @@ (global $resolve-unary/b (mut i32) (i32.const 1)) (global $resolve-unary/foo (mut i32) (i32.const 0)) (global $resolve-unary/bar (mut i32) (i32.const 0)) - (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20156)) + (global $~lib/memory/__stack_pointer (mut i32) (i32.const 20276)) (memory $0 1) (data (i32.const 1036) "|") (data (i32.const 1048) "\01\00\00\00d\00\00\00t\00o\00S\00t\00r\00i\00n\00g\00(\00)\00 \00r\00a\00d\00i\00x\00 \00a\00r\00g\00u\00m\00e\00n\00t\00 \00m\00u\00s\00t\00 \00b\00e\00 \00b\00e\00t\00w\00e\00e\00n\00 \002\00 \00a\00n\00d\00 \003\006") @@ -75,8 +75,14 @@ (data (i32.const 3672) "\01\00\00\00\06\00\00\00i\00+\00+") (data (i32.const 3692) "\1c") (data (i32.const 3704) "\01\00\00\00\06\00\00\00i\00-\00-") - (data (i32.const 3728) "\05\00\00\00 \00\00\00\00\00\00\00 ") - (data (i32.const 3756) " \00\00\00\00\00\00\00 ") + (data (i32.const 3724) "\1c") + (data (i32.const 3736) "\01\00\00\00\0c\00\00\00n\00u\00m\00b\00e\00r") + (data (i32.const 3756) "\1c") + (data (i32.const 3768) "\05\00\00\00\08\00\00\00\01") + (data (i32.const 3788) ",") + (data (i32.const 3800) "\01\00\00\00\10\00\00\00f\00u\00n\00c\00t\00i\00o\00n") + (data (i32.const 3840) "\06\00\00\00 \00\00\00\00\00\00\00 ") + (data (i32.const 3868) " \00\00\00\00\00\00\00 ") (export "memory" (memory $0)) (start $~start) (func $~lib/rt/itcms/visitRoots @@ -671,10 +677,10 @@ if unreachable end - i32.const 20160 + i32.const 20288 i32.const 0 i32.store - i32.const 21728 + i32.const 21856 i32.const 0 i32.store loop $for-loop|0 @@ -685,7 +691,7 @@ local.get $0 i32.const 2 i32.shl - i32.const 20160 + i32.const 20288 i32.add i32.const 0 i32.store offset=4 @@ -703,7 +709,7 @@ i32.add i32.const 2 i32.shl - i32.const 20160 + i32.const 20288 i32.add i32.const 0 i32.store offset=96 @@ -721,13 +727,13 @@ br $for-loop|0 end end - i32.const 20160 - i32.const 21732 + i32.const 20288 + i32.const 21860 memory.size i32.const 16 i32.shl call $~lib/rt/tlsf/addMemory - i32.const 20160 + i32.const 20288 global.set $~lib/rt/tlsf/ROOT ) (func $~lib/rt/itcms/step (result i32) @@ -812,7 +818,7 @@ local.set $0 loop $while-continue|0 local.get $0 - i32.const 20156 + i32.const 20276 i32.lt_u if local.get $0 @@ -912,7 +918,7 @@ unreachable end local.get $0 - i32.const 20156 + i32.const 20276 i32.lt_u if local.get $0 @@ -935,7 +941,7 @@ i32.const 4 i32.add local.tee $0 - i32.const 20156 + i32.const 20276 i32.ge_u if global.get $~lib/rt/tlsf/ROOT @@ -1438,11 +1444,11 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3772 + i32.const 3892 i32.lt_s if - i32.const 20176 - i32.const 20224 + i32.const 20304 + i32.const 20352 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -1767,32 +1773,42 @@ ) (func $~lib/rt/__visit_members (param $0 i32) block $invalid - block $resolve-unary/Bar - block $resolve-unary/Foo - block $~lib/arraybuffer/ArrayBufferView - block $~lib/string/String - block $~lib/arraybuffer/ArrayBuffer - local.get $0 - i32.const 8 - i32.sub - i32.load - br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $resolve-unary/Foo $resolve-unary/Bar $invalid + block $~lib/function/Function<%28%29=>void> + block $resolve-unary/Bar + block $resolve-unary/Foo + block $~lib/arraybuffer/ArrayBufferView + block $~lib/string/String + block $~lib/arraybuffer/ArrayBuffer + local.get $0 + i32.const 8 + i32.sub + i32.load + br_table $~lib/arraybuffer/ArrayBuffer $~lib/string/String $~lib/arraybuffer/ArrayBufferView $resolve-unary/Foo $resolve-unary/Bar $~lib/function/Function<%28%29=>void> $invalid + end + return end return end - return - end - local.get $0 - i32.load - local.tee $0 - if local.get $0 - call $byn-split-outlined-A$~lib/rt/itcms/__visit + i32.load + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end + return end return end return end + local.get $0 + i32.load offset=4 + local.tee $0 + if + local.get $0 + call $byn-split-outlined-A$~lib/rt/itcms/__visit + end return end unreachable @@ -1809,7 +1825,7 @@ global.set $~lib/memory/__stack_pointer block $folding-inner0 global.get $~lib/memory/__stack_pointer - i32.const 3772 + i32.const 3892 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -1819,7 +1835,7 @@ memory.size i32.const 16 i32.shl - i32.const 20156 + i32.const 20276 i32.sub i32.const 1 i32.shr_u @@ -2072,7 +2088,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3772 + i32.const 3892 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2281,7 +2297,7 @@ i32.sub global.set $~lib/memory/__stack_pointer global.get $~lib/memory/__stack_pointer - i32.const 3772 + i32.const 3892 i32.lt_s br_if $folding-inner0 global.get $~lib/memory/__stack_pointer @@ -2408,13 +2424,23 @@ unreachable end global.get $~lib/memory/__stack_pointer + local.tee $0 + i32.const 3744 + i32.store + i32.const 3740 + i32.load + drop + local.get $0 + i32.const 3808 + i32.store + local.get $0 i32.const 20 i32.add global.set $~lib/memory/__stack_pointer return end - i32.const 20176 - i32.const 20224 + i32.const 20304 + i32.const 20352 i32.const 1 i32.const 1 call $~lib/builtins/abort @@ -2463,7 +2489,7 @@ if i32.const 0 local.get $1 - i32.const 20156 + i32.const 20276 i32.lt_u local.get $1 i32.load offset=8 @@ -2514,7 +2540,7 @@ i32.const 1 else local.get $0 - i32.const 3728 + i32.const 3840 i32.load i32.gt_u if @@ -2528,7 +2554,7 @@ local.get $0 i32.const 3 i32.shl - i32.const 3732 + i32.const 3844 i32.add i32.load i32.const 32 diff --git a/tests/compiler/resolve-unary.ts b/tests/compiler/resolve-unary.ts index ff598b7f60..20a3196b72 100644 --- a/tests/compiler/resolve-unary.ts +++ b/tests/compiler/resolve-unary.ts @@ -168,3 +168,7 @@ assert( == "i--" ); + +(typeof 1).length; +function generic(v: T): void {} +generic(typeof ((): void => {}));