Skip to content

Commit fd99589

Browse files
authored
Fix enum initialization (#545)
1 parent 6de4847 commit fd99589

File tree

7 files changed

+100
-16
lines changed

7 files changed

+100
-16
lines changed

src/compiler.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ export class Compiler extends DiagnosticEmitter {
503503
break;
504504
}
505505
case ElementKind.ENUMVALUE: {
506-
if (!assert(element.parent).is(CommonFlags.CONST) && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {
506+
if (!(<EnumValue>element).isImmutable && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {
507507
this.error(
508508
DiagnosticCode.Cannot_export_a_mutable_global,
509509
(<EnumValue>element).identifierNode.range
@@ -946,16 +946,14 @@ export class Compiler extends DiagnosticEmitter {
946946
WrapMode.NONE
947947
);
948948
if (getExpressionId(initExpr) != ExpressionId.Const) {
949-
if (element.is(CommonFlags.CONST)) {
950-
initExpr = module.precomputeExpression(initExpr);
951-
if (getExpressionId(initExpr) != ExpressionId.Const) {
949+
initExpr = module.precomputeExpression(initExpr);
950+
if (getExpressionId(initExpr) != ExpressionId.Const) {
951+
if (element.is(CommonFlags.CONST)) {
952952
this.error(
953953
DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,
954954
valueNode.range
955955
);
956-
initInStart = true;
957956
}
958-
} else {
959957
initInStart = true;
960958
}
961959
}
@@ -997,8 +995,9 @@ export class Compiler extends DiagnosticEmitter {
997995
module.addGlobal(val.internalName, NativeType.I32, false, initExpr);
998996
}
999997
} else {
1000-
module.addGlobal(val.internalName, NativeType.I32, true, initExpr);
998+
module.addGlobal(val.internalName, NativeType.I32, false, initExpr);
1001999
}
1000+
val.isImmutable = true;
10021001
previousValueIsMut = false;
10031002
}
10041003
previousValue = <EnumValue>val;

src/program.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2266,6 +2266,9 @@ export class EnumValue extends VariableLikeElement {
22662266
this.setType(Type.i32);
22672267
}
22682268

2269+
/** Whether this enum value is immutable. */
2270+
isImmutable: bool = false;
2271+
22692272
/** Gets the associated value node. */
22702273
get valueNode(): Expression | null {
22712274
return (<EnumValueDeclaration>this.declaration).value;

tests/compiler/enum.optimized.wat

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,62 @@
77
(global $enum/Implicit.ONE i32 (i32.const 1))
88
(global $enum/Implicit.TWO i32 (i32.const 2))
99
(global $enum/Implicit.THREE i32 (i32.const 3))
10+
(global $enum/ImplicitConst.ZERO i32 (i32.const 0))
11+
(global $enum/ImplicitConst.ONE i32 (i32.const 1))
12+
(global $enum/ImplicitConst.TWO i32 (i32.const 2))
13+
(global $enum/ImplicitConst.THREE i32 (i32.const 3))
1014
(global $enum/Explicit.ZERO i32 (i32.const 0))
1115
(global $enum/Explicit.ONE i32 (i32.const 1))
1216
(global $enum/Explicit.TWO i32 (i32.const 2))
1317
(global $enum/Explicit.THREE i32 (i32.const 3))
18+
(global $enum/ExplicitConst.ZERO i32 (i32.const 0))
19+
(global $enum/ExplicitConst.ONE i32 (i32.const 1))
20+
(global $enum/ExplicitConst.TWO i32 (i32.const 2))
21+
(global $enum/ExplicitConst.THREE i32 (i32.const 3))
1422
(global $enum/Mixed.ZERO i32 (i32.const 0))
1523
(global $enum/Mixed.ONE i32 (i32.const 1))
1624
(global $enum/Mixed.THREE i32 (i32.const 3))
1725
(global $enum/Mixed.FOUR i32 (i32.const 4))
26+
(global $enum/MixedConst.ZERO i32 (i32.const 0))
27+
(global $enum/MixedConst.ONE i32 (i32.const 1))
28+
(global $enum/MixedConst.THREE i32 (i32.const 3))
29+
(global $enum/MixedConst.FOUR i32 (i32.const 4))
1830
(global $enum/NonConstant.ZERO (mut i32) (i32.const 0))
1931
(global $enum/NonConstant.ONE (mut i32) (i32.const 0))
2032
(global $enum/SelfReference.ZERO i32 (i32.const 0))
2133
(global $enum/SelfReference.ONE i32 (i32.const 1))
34+
(global $enum/SelfReferenceConst.ZERO i32 (i32.const 0))
35+
(global $enum/SelfReferenceConst.ONE i32 (i32.const 1))
2236
(export "memory" (memory $0))
2337
(export "table" (table $0))
2438
(export "Implicit.ZERO" (global $enum/Implicit.ZERO))
2539
(export "Implicit.ONE" (global $enum/Implicit.ONE))
2640
(export "Implicit.TWO" (global $enum/Implicit.TWO))
2741
(export "Implicit.THREE" (global $enum/Implicit.THREE))
42+
(export "ImplicitConst.ZERO" (global $enum/ImplicitConst.ZERO))
43+
(export "ImplicitConst.ONE" (global $enum/ImplicitConst.ONE))
44+
(export "ImplicitConst.TWO" (global $enum/ImplicitConst.TWO))
45+
(export "ImplicitConst.THREE" (global $enum/ImplicitConst.THREE))
2846
(export "Explicit.ZERO" (global $enum/Explicit.ZERO))
2947
(export "Explicit.ONE" (global $enum/Explicit.ONE))
3048
(export "Explicit.TWO" (global $enum/Explicit.TWO))
3149
(export "Explicit.THREE" (global $enum/Explicit.THREE))
50+
(export "ExplicitConst.ZERO" (global $enum/ExplicitConst.ZERO))
51+
(export "ExplicitConst.ONE" (global $enum/ExplicitConst.ONE))
52+
(export "ExplicitConst.TWO" (global $enum/ExplicitConst.TWO))
53+
(export "ExplicitConst.THREE" (global $enum/ExplicitConst.THREE))
3254
(export "Mixed.ZERO" (global $enum/Mixed.ZERO))
3355
(export "Mixed.ONE" (global $enum/Mixed.ONE))
3456
(export "Mixed.THREE" (global $enum/Mixed.THREE))
3557
(export "Mixed.FOUR" (global $enum/Mixed.FOUR))
58+
(export "MixedConst.ZERO" (global $enum/MixedConst.ZERO))
59+
(export "MixedConst.ONE" (global $enum/MixedConst.ONE))
60+
(export "MixedConst.THREE" (global $enum/MixedConst.THREE))
61+
(export "MixedConst.FOUR" (global $enum/MixedConst.FOUR))
3662
(export "SelfReference.ZERO" (global $enum/SelfReference.ZERO))
3763
(export "SelfReference.ONE" (global $enum/SelfReference.ONE))
64+
(export "SelfReferenceConst.ZERO" (global $enum/SelfReferenceConst.ZERO))
65+
(export "SelfReferenceConst.ONE" (global $enum/SelfReferenceConst.ONE))
3866
(start $start)
3967
(func $start (; 0 ;) (type $FUNCSIG$v)
4068
i32.const 0

tests/compiler/enum.ts

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,39 @@
1-
export const enum Implicit {
1+
export enum Implicit {
22
ZERO,
33
ONE,
44
TWO,
55
THREE
66
}
77

8-
export const enum Explicit {
8+
export const enum ImplicitConst {
9+
ZERO,
10+
ONE,
11+
TWO,
12+
THREE
13+
}
14+
15+
export enum Explicit {
16+
ZERO = 0,
17+
ONE = 0 + 1,
18+
TWO = 1 + 1,
19+
THREE = 3
20+
}
21+
22+
export const enum ExplicitConst {
923
ZERO = 0,
1024
ONE = 0 + 1,
1125
TWO = 1 + 1,
1226
THREE = 3
1327
}
1428

15-
export const enum Mixed {
29+
export enum Mixed {
30+
ZERO,
31+
ONE,
32+
THREE = 3,
33+
FOUR
34+
}
35+
36+
export const enum MixedConst {
1637
ZERO,
1738
ONE,
1839
THREE = 3,
@@ -31,9 +52,14 @@ enum NonConstant {
3152
NonConstant.ZERO;
3253
NonConstant.ONE;
3354

34-
export const enum SelfReference {
55+
export enum SelfReference {
56+
ZERO,
57+
ONE = ZERO + 1
58+
}
59+
60+
export const enum SelfReferenceConst {
3561
ZERO,
3662
ONE = ZERO + 1
3763
}
3864

39-
var enumType: SelfReference;
65+
var enumType: SelfReferenceConst;

tests/compiler/enum.untouched.wat

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,32 @@
88
(global $enum/Implicit.ONE i32 (i32.const 1))
99
(global $enum/Implicit.TWO i32 (i32.const 2))
1010
(global $enum/Implicit.THREE i32 (i32.const 3))
11+
(global $enum/ImplicitConst.ZERO i32 (i32.const 0))
12+
(global $enum/ImplicitConst.ONE i32 (i32.const 1))
13+
(global $enum/ImplicitConst.TWO i32 (i32.const 2))
14+
(global $enum/ImplicitConst.THREE i32 (i32.const 3))
1115
(global $enum/Explicit.ZERO i32 (i32.const 0))
1216
(global $enum/Explicit.ONE i32 (i32.const 1))
1317
(global $enum/Explicit.TWO i32 (i32.const 2))
1418
(global $enum/Explicit.THREE i32 (i32.const 3))
19+
(global $enum/ExplicitConst.ZERO i32 (i32.const 0))
20+
(global $enum/ExplicitConst.ONE i32 (i32.const 1))
21+
(global $enum/ExplicitConst.TWO i32 (i32.const 2))
22+
(global $enum/ExplicitConst.THREE i32 (i32.const 3))
1523
(global $enum/Mixed.ZERO i32 (i32.const 0))
1624
(global $enum/Mixed.ONE i32 (i32.const 1))
1725
(global $enum/Mixed.THREE i32 (i32.const 3))
1826
(global $enum/Mixed.FOUR i32 (i32.const 4))
27+
(global $enum/MixedConst.ZERO i32 (i32.const 0))
28+
(global $enum/MixedConst.ONE i32 (i32.const 1))
29+
(global $enum/MixedConst.THREE i32 (i32.const 3))
30+
(global $enum/MixedConst.FOUR i32 (i32.const 4))
1931
(global $enum/NonConstant.ZERO (mut i32) (i32.const 0))
2032
(global $enum/NonConstant.ONE (mut i32) (i32.const 0))
2133
(global $enum/SelfReference.ZERO i32 (i32.const 0))
2234
(global $enum/SelfReference.ONE i32 (i32.const 1))
35+
(global $enum/SelfReferenceConst.ZERO i32 (i32.const 0))
36+
(global $enum/SelfReferenceConst.ONE i32 (i32.const 1))
2337
(global $enum/enumType (mut i32) (i32.const 0))
2438
(global $~lib/memory/HEAP_BASE i32 (i32.const 8))
2539
(export "memory" (memory $0))
@@ -28,16 +42,30 @@
2842
(export "Implicit.ONE" (global $enum/Implicit.ONE))
2943
(export "Implicit.TWO" (global $enum/Implicit.TWO))
3044
(export "Implicit.THREE" (global $enum/Implicit.THREE))
45+
(export "ImplicitConst.ZERO" (global $enum/ImplicitConst.ZERO))
46+
(export "ImplicitConst.ONE" (global $enum/ImplicitConst.ONE))
47+
(export "ImplicitConst.TWO" (global $enum/ImplicitConst.TWO))
48+
(export "ImplicitConst.THREE" (global $enum/ImplicitConst.THREE))
3149
(export "Explicit.ZERO" (global $enum/Explicit.ZERO))
3250
(export "Explicit.ONE" (global $enum/Explicit.ONE))
3351
(export "Explicit.TWO" (global $enum/Explicit.TWO))
3452
(export "Explicit.THREE" (global $enum/Explicit.THREE))
53+
(export "ExplicitConst.ZERO" (global $enum/ExplicitConst.ZERO))
54+
(export "ExplicitConst.ONE" (global $enum/ExplicitConst.ONE))
55+
(export "ExplicitConst.TWO" (global $enum/ExplicitConst.TWO))
56+
(export "ExplicitConst.THREE" (global $enum/ExplicitConst.THREE))
3557
(export "Mixed.ZERO" (global $enum/Mixed.ZERO))
3658
(export "Mixed.ONE" (global $enum/Mixed.ONE))
3759
(export "Mixed.THREE" (global $enum/Mixed.THREE))
3860
(export "Mixed.FOUR" (global $enum/Mixed.FOUR))
61+
(export "MixedConst.ZERO" (global $enum/MixedConst.ZERO))
62+
(export "MixedConst.ONE" (global $enum/MixedConst.ONE))
63+
(export "MixedConst.THREE" (global $enum/MixedConst.THREE))
64+
(export "MixedConst.FOUR" (global $enum/MixedConst.FOUR))
3965
(export "SelfReference.ZERO" (global $enum/SelfReference.ZERO))
4066
(export "SelfReference.ONE" (global $enum/SelfReference.ONE))
67+
(export "SelfReferenceConst.ZERO" (global $enum/SelfReferenceConst.ZERO))
68+
(export "SelfReferenceConst.ONE" (global $enum/SelfReferenceConst.ONE))
4169
(start $start)
4270
(func $enum/getZero (; 0 ;) (type $FUNCSIG$i) (result i32)
4371
i32.const 0

tests/compiler/merge.untouched.wat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
(global $merge/typeNamespace_test (mut i32) (i32.const 0))
1212
(global $merge/functionType_test (mut i32) (i32.const 0))
1313
(global $merge/typeFunction_test (mut i32) (i32.const 0))
14-
(global $merge/enumNamespace.val (mut i32) (i32.const 1))
15-
(global $merge/namespaceEnum.val (mut i32) (i32.const 2))
14+
(global $merge/enumNamespace.val i32 (i32.const 1))
15+
(global $merge/namespaceEnum.val i32 (i32.const 2))
1616
(global $~lib/memory/HEAP_BASE i32 (i32.const 8))
1717
(export "memory" (memory $0))
1818
(export "table" (table $0))

tests/compiler/namespace.untouched.wat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
(table $0 1 funcref)
66
(elem (i32.const 0) $null)
77
(global $namespace/Outer.Inner.aVar (mut i32) (i32.const 0))
8-
(global $namespace/Outer.Inner.anEnum.ONE (mut i32) (i32.const 1))
9-
(global $namespace/Outer.Inner.anEnum.TWO (mut i32) (i32.const 2))
8+
(global $namespace/Outer.Inner.anEnum.ONE i32 (i32.const 1))
9+
(global $namespace/Outer.Inner.anEnum.TWO i32 (i32.const 2))
1010
(global $~lib/memory/HEAP_BASE i32 (i32.const 8))
1111
(export "memory" (memory $0))
1212
(export "table" (table $0))

0 commit comments

Comments
 (0)