Skip to content

Commit 8f9964a

Browse files
committed
fix
1 parent fe507c5 commit 8f9964a

File tree

7 files changed

+93
-65
lines changed

7 files changed

+93
-65
lines changed

src/compiler.ts

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5273,7 +5273,71 @@ export class Compiler extends DiagnosticEmitter {
52735273
while (expression.kind == NodeKind.Parenthesized) {
52745274
expression = (<ParenthesizedExpression>expression).expression;
52755275
}
5276-
return expression.kind != NodeKind.Identifier;
5276+
switch (expression.kind) {
5277+
case NodeKind.Call:
5278+
case NodeKind.New:
5279+
case NodeKind.UnaryPostfix:
5280+
return true;
5281+
case NodeKind.UnaryPrefix: {
5282+
let unaryPrefix = <UnaryPrefixExpression>expression;
5283+
switch (unaryPrefix.operator) {
5284+
case Token.Plus_Plus:
5285+
case Token.Minus_Minus:
5286+
case Token.Delete:
5287+
case Token.Await:
5288+
case Token.Yield:
5289+
return true;
5290+
default:
5291+
return this.expressionHasSideEffects(unaryPrefix.operand);
5292+
}
5293+
}
5294+
case NodeKind.Assertion:
5295+
return this.expressionHasSideEffects((<AssertionExpression>expression).expression);
5296+
case NodeKind.PropertyAccess:
5297+
return this.expressionHasSideEffects((<PropertyAccessExpression>expression).expression);
5298+
case NodeKind.ElementAccess: {
5299+
let access = <ElementAccessExpression>expression;
5300+
return this.expressionHasSideEffects(access.expression)
5301+
|| this.expressionHasSideEffects(access.elementExpression);
5302+
}
5303+
case NodeKind.Comma: {
5304+
let expressions = (<CommaExpression>expression).expressions;
5305+
for (let i = 0, k = expressions.length; i < k; ++i) {
5306+
if (this.expressionHasSideEffects(unchecked(expressions[i]))) return true;
5307+
}
5308+
return false;
5309+
}
5310+
case NodeKind.Ternary: {
5311+
let ternary = <TernaryExpression>expression;
5312+
return this.expressionHasSideEffects(ternary.condition)
5313+
|| this.expressionHasSideEffects(ternary.ifThen)
5314+
|| this.expressionHasSideEffects(ternary.ifElse);
5315+
}
5316+
case NodeKind.Binary: {
5317+
let binary = <BinaryExpression>expression;
5318+
switch (binary.operator) {
5319+
case Token.Equals:
5320+
case Token.Plus_Equals:
5321+
case Token.Minus_Equals:
5322+
case Token.Asterisk_Equals:
5323+
case Token.Asterisk_Asterisk_Equals:
5324+
case Token.Slash_Equals:
5325+
case Token.Percent_Equals:
5326+
case Token.LessThan_LessThan_Equals:
5327+
case Token.GreaterThan_GreaterThan_Equals:
5328+
case Token.GreaterThan_GreaterThan_GreaterThan_Equals:
5329+
case Token.Ampersand_Equals:
5330+
case Token.Bar_Equals:
5331+
case Token.Caret_Equals:
5332+
return true;
5333+
default:
5334+
return this.expressionHasSideEffects(binary.left)
5335+
|| this.expressionHasSideEffects(binary.right);
5336+
}
5337+
}
5338+
default:
5339+
return false;
5340+
}
52775341
}
52785342

52795343
makeLt(leftExpr: ExpressionRef, rightExpr: ExpressionRef, type: Type): ExpressionRef {

tests/compiler/assignment-chain.debug.wat

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,7 +2009,7 @@
20092009
(local $remaining i32)
20102010
(local $spare i32)
20112011
(local $block|6 i32)
2012-
(local $block|7 i32)
2012+
(local $7 i32)
20132013
local.get $block
20142014
call $~lib/rt/common/BLOCK#get:mmInfo
20152015
local.set $blockInfo
@@ -2075,21 +2075,6 @@
20752075
i32.xor
20762076
i32.and
20772077
call $~lib/rt/common/BLOCK#set:mmInfo
2078-
block $~lib/rt/tlsf/GETRIGHT|inlined.3 (result i32)
2079-
local.get $block
2080-
local.set $block|7
2081-
local.get $block|7
2082-
i32.const 4
2083-
i32.add
2084-
local.get $block|7
2085-
call $~lib/rt/common/BLOCK#get:mmInfo
2086-
i32.const 3
2087-
i32.const -1
2088-
i32.xor
2089-
i32.and
2090-
i32.add
2091-
br $~lib/rt/tlsf/GETRIGHT|inlined.3
2092-
end
20932078
block $~lib/rt/tlsf/GETRIGHT|inlined.2 (result i32)
20942079
local.get $block
20952080
local.set $block|6
@@ -2105,6 +2090,9 @@
21052090
i32.add
21062091
br $~lib/rt/tlsf/GETRIGHT|inlined.2
21072092
end
2093+
local.set $7
2094+
local.get $7
2095+
local.get $7
21082096
call $~lib/rt/common/BLOCK#get:mmInfo
21092097
i32.const 2
21102098
i32.const -1

tests/compiler/assignment-chain.release.wat

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
local.get $0
123123
global.set $~lib/rt/itcms/iter
124124
end
125-
block $__inlined_func$~lib/rt/itcms/Object#unlink$129
125+
block $__inlined_func$~lib/rt/itcms/Object#unlink$128
126126
local.get $1
127127
i32.load offset=4
128128
i32.const -4
@@ -146,7 +146,7 @@
146146
call $~lib/builtins/abort
147147
unreachable
148148
end
149-
br $__inlined_func$~lib/rt/itcms/Object#unlink$129
149+
br $__inlined_func$~lib/rt/itcms/Object#unlink$128
150150
end
151151
local.get $1
152152
i32.load offset=8
@@ -1231,7 +1231,7 @@
12311231
global.get $~lib/rt/itcms/threshold
12321232
i32.ge_u
12331233
if
1234-
block $__inlined_func$~lib/rt/itcms/interrupt$69
1234+
block $__inlined_func$~lib/rt/itcms/interrupt$68
12351235
i32.const 2048
12361236
local.set $2
12371237
loop $do-loop|0
@@ -1248,7 +1248,7 @@
12481248
i32.const 1024
12491249
i32.add
12501250
global.set $~lib/rt/itcms/threshold
1251-
br $__inlined_func$~lib/rt/itcms/interrupt$69
1251+
br $__inlined_func$~lib/rt/itcms/interrupt$68
12521252
end
12531253
local.get $2
12541254
i32.const 0

tests/compiler/resolve-elementaccess.debug.wat

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2045,7 +2045,7 @@
20452045
(local $remaining i32)
20462046
(local $spare i32)
20472047
(local $block|6 i32)
2048-
(local $block|7 i32)
2048+
(local $7 i32)
20492049
local.get $block
20502050
call $~lib/rt/common/BLOCK#get:mmInfo
20512051
local.set $blockInfo
@@ -2111,21 +2111,6 @@
21112111
i32.xor
21122112
i32.and
21132113
call $~lib/rt/common/BLOCK#set:mmInfo
2114-
block $~lib/rt/tlsf/GETRIGHT|inlined.3 (result i32)
2115-
local.get $block
2116-
local.set $block|7
2117-
local.get $block|7
2118-
i32.const 4
2119-
i32.add
2120-
local.get $block|7
2121-
call $~lib/rt/common/BLOCK#get:mmInfo
2122-
i32.const 3
2123-
i32.const -1
2124-
i32.xor
2125-
i32.and
2126-
i32.add
2127-
br $~lib/rt/tlsf/GETRIGHT|inlined.3
2128-
end
21292114
block $~lib/rt/tlsf/GETRIGHT|inlined.2 (result i32)
21302115
local.get $block
21312116
local.set $block|6
@@ -2141,6 +2126,9 @@
21412126
i32.add
21422127
br $~lib/rt/tlsf/GETRIGHT|inlined.2
21432128
end
2129+
local.set $7
2130+
local.get $7
2131+
local.get $7
21442132
call $~lib/rt/common/BLOCK#get:mmInfo
21452133
i32.const 2
21462134
i32.const -1

tests/compiler/resolve-elementaccess.release.wat

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@
176176
local.get $1
177177
global.set $~lib/rt/itcms/iter
178178
end
179-
block $__inlined_func$~lib/rt/itcms/Object#unlink$153
179+
block $__inlined_func$~lib/rt/itcms/Object#unlink$152
180180
local.get $0
181181
i32.load offset=4
182182
i32.const -4
@@ -200,7 +200,7 @@
200200
call $~lib/builtins/abort
201201
unreachable
202202
end
203-
br $__inlined_func$~lib/rt/itcms/Object#unlink$153
203+
br $__inlined_func$~lib/rt/itcms/Object#unlink$152
204204
end
205205
local.get $0
206206
i32.load offset=8
@@ -1304,7 +1304,7 @@
13041304
global.get $~lib/rt/itcms/threshold
13051305
i32.ge_u
13061306
if
1307-
block $__inlined_func$~lib/rt/itcms/interrupt$69
1307+
block $__inlined_func$~lib/rt/itcms/interrupt$68
13081308
i32.const 2048
13091309
local.set $2
13101310
loop $do-loop|0
@@ -1321,7 +1321,7 @@
13211321
i32.const 1024
13221322
i32.add
13231323
global.set $~lib/rt/itcms/threshold
1324-
br $__inlined_func$~lib/rt/itcms/interrupt$69
1324+
br $__inlined_func$~lib/rt/itcms/interrupt$68
13251325
end
13261326
local.get $2
13271327
i32.const 0
@@ -2880,7 +2880,7 @@
28802880
global.get $~lib/memory/__stack_pointer
28812881
i32.const 0
28822882
i32.store
2883-
block $__inlined_func$~lib/util/number/utoa32$79
2883+
block $__inlined_func$~lib/util/number/utoa32$78
28842884
local.get $0
28852885
i32.const 255
28862886
i32.and
@@ -2893,7 +2893,7 @@
28932893
global.set $~lib/memory/__stack_pointer
28942894
i32.const 3536
28952895
local.set $0
2896-
br $__inlined_func$~lib/util/number/utoa32$79
2896+
br $__inlined_func$~lib/util/number/utoa32$78
28972897
end
28982898
global.get $~lib/memory/__stack_pointer
28992899
i32.const 3
@@ -3268,7 +3268,7 @@
32683268
end
32693269
end
32703270
end
3271-
block $__inlined_func$~lib/util/string/compareImpl$97
3271+
block $__inlined_func$~lib/util/string/compareImpl$96
32723272
loop $while-continue|1
32733273
local.get $0
32743274
local.tee $3
@@ -3288,7 +3288,7 @@
32883288
local.get $4
32893289
local.get $5
32903290
i32.ne
3291-
br_if $__inlined_func$~lib/util/string/compareImpl$97
3291+
br_if $__inlined_func$~lib/util/string/compareImpl$96
32923292
local.get $2
32933293
i32.const 2
32943294
i32.add

tests/compiler/std/new.debug.wat

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2018,7 +2018,7 @@
20182018
(local $remaining i32)
20192019
(local $spare i32)
20202020
(local $block|6 i32)
2021-
(local $block|7 i32)
2021+
(local $7 i32)
20222022
local.get $block
20232023
call $~lib/rt/common/BLOCK#get:mmInfo
20242024
local.set $blockInfo
@@ -2084,21 +2084,6 @@
20842084
i32.xor
20852085
i32.and
20862086
call $~lib/rt/common/BLOCK#set:mmInfo
2087-
block $~lib/rt/tlsf/GETRIGHT|inlined.3 (result i32)
2088-
local.get $block
2089-
local.set $block|7
2090-
local.get $block|7
2091-
i32.const 4
2092-
i32.add
2093-
local.get $block|7
2094-
call $~lib/rt/common/BLOCK#get:mmInfo
2095-
i32.const 3
2096-
i32.const -1
2097-
i32.xor
2098-
i32.and
2099-
i32.add
2100-
br $~lib/rt/tlsf/GETRIGHT|inlined.3
2101-
end
21022087
block $~lib/rt/tlsf/GETRIGHT|inlined.2 (result i32)
21032088
local.get $block
21042089
local.set $block|6
@@ -2114,6 +2099,9 @@
21142099
i32.add
21152100
br $~lib/rt/tlsf/GETRIGHT|inlined.2
21162101
end
2102+
local.set $7
2103+
local.get $7
2104+
local.get $7
21172105
call $~lib/rt/common/BLOCK#get:mmInfo
21182106
i32.const 2
21192107
i32.const -1

tests/compiler/std/new.release.wat

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
local.get $0
123123
global.set $~lib/rt/itcms/iter
124124
end
125-
block $__inlined_func$~lib/rt/itcms/Object#unlink$113
125+
block $__inlined_func$~lib/rt/itcms/Object#unlink$112
126126
local.get $1
127127
i32.load offset=4
128128
i32.const -4
@@ -146,7 +146,7 @@
146146
call $~lib/builtins/abort
147147
unreachable
148148
end
149-
br $__inlined_func$~lib/rt/itcms/Object#unlink$113
149+
br $__inlined_func$~lib/rt/itcms/Object#unlink$112
150150
end
151151
local.get $1
152152
i32.load offset=8
@@ -1148,7 +1148,7 @@
11481148
global.get $~lib/rt/itcms/threshold
11491149
i32.ge_u
11501150
if
1151-
block $__inlined_func$~lib/rt/itcms/interrupt$69
1151+
block $__inlined_func$~lib/rt/itcms/interrupt$68
11521152
i32.const 2048
11531153
local.set $0
11541154
loop $do-loop|0
@@ -1165,7 +1165,7 @@
11651165
i32.const 1024
11661166
i32.add
11671167
global.set $~lib/rt/itcms/threshold
1168-
br $__inlined_func$~lib/rt/itcms/interrupt$69
1168+
br $__inlined_func$~lib/rt/itcms/interrupt$68
11691169
end
11701170
local.get $0
11711171
i32.const 0

0 commit comments

Comments
 (0)