Skip to content

Commit 8c6a554

Browse files
committed
Don't skip property initialization
Don not skip property initialization even if expected to be initialized at the constructor level
1 parent c15a7b0 commit 8c6a554

23 files changed

+1753
-902
lines changed

src/compiler.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10181,8 +10181,9 @@ export class Compiler extends DiagnosticEmitter {
1018110181
let parameterIndex = fieldPrototype.parameterIndex;
1018210182
let typeNode = field.typeNode;
1018310183
if (typeNode) this.checkTypeSupported(fieldType, typeNode);
10184-
let initExpr: ExpressionRef = -1;
10184+
let initExpr: ExpressionRef = 0;
1018510185
const isDefiniteAssigment = field.is(CommonFlags.DEFINITE_ASSIGNMENT);
10186+
let definitelyInitialized = false;
1018610187

1018710188
// if declared as a constructor parameter, use its value
1018810189
if (parameterIndex >= 0) {
@@ -10193,6 +10194,7 @@ export class Compiler extends DiagnosticEmitter {
1019310194
nativeFieldType
1019410195
);
1019510196
if (fieldType.isManaged) initExpr = this.makeRetain(initExpr);
10197+
definitelyInitialized = true;
1019610198

1019710199
// fall back to use initializer if present
1019810200
} else if (initializerNode) {
@@ -10202,20 +10204,25 @@ export class Compiler extends DiagnosticEmitter {
1020210204
if (fieldType.isManaged && !this.skippedAutoreleases.has(initExpr)) {
1020310205
initExpr = this.makeRetain(initExpr);
1020410206
}
10205-
} else if (isDefiniteAssigment) {
10207+
definitelyInitialized = true;
10208+
} else {
1020610209
// otherwise initialize with default if marked as definite assigment
10210+
if (isDefiniteAssigment) {
10211+
definitelyInitialized = true;
10212+
}
1020710213
initExpr = this.makeZero(fieldType);
1020810214
}
1020910215

10210-
if (initExpr >= 0) {
10211-
stmts.push(
10212-
module.store(fieldType.byteSize,
10213-
module.local_get(thisLocalIndex, nativeSizeType),
10214-
initExpr,
10215-
nativeFieldType,
10216-
field.memoryOffset
10217-
)
10218-
);
10216+
stmts.push(
10217+
module.store(fieldType.byteSize,
10218+
module.local_get(thisLocalIndex, nativeSizeType),
10219+
initExpr,
10220+
nativeFieldType,
10221+
field.memoryOffset
10222+
)
10223+
);
10224+
10225+
if (definitelyInitialized) {
1021910226
flow.setFieldFlag(field.internalName, FieldFlags.INITIALIZED);
1022010227
} else {
1022110228
flow.setFieldFlag(field.internalName, FieldFlags.NONE);

tests/compiler/class.optimized.wat

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,18 @@
131131
i32.const 5
132132
call $~lib/rt/stub/__alloc
133133
local.tee $0
134+
i32.const 0
135+
i32.store
136+
local.get $0
137+
i32.const 0
138+
i32.store offset=4
139+
local.get $0
140+
i32.const 0
141+
i32.store offset=8
142+
local.get $0
143+
i32.const 0
144+
i32.store offset=12
145+
local.get $0
134146
i32.load
135147
drop
136148
local.get $0

tests/compiler/class.untouched.wat

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,18 @@
479479
local.set $0
480480
end
481481
local.get $0
482+
i32.const 0
483+
i32.store
484+
local.get $0
485+
i32.const 0
486+
i32.store offset=4
487+
local.get $0
488+
i32.const 0
489+
i32.store offset=8
490+
local.get $0
491+
i32.const 0
492+
i32.store offset=12
493+
local.get $0
482494
local.tee $4
483495
local.get $3
484496
local.tee $5

tests/compiler/inlining.optimized.wat

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,18 @@
122122
i32.const 1
123123
i32.store
124124
local.get $0
125+
i32.const 0
126+
i32.store offset=4
127+
local.get $0
125128
i32.const 2
126129
i32.store offset=4
127130
local.get $0
128131
i32.const 3
129132
i32.store offset=8
130133
local.get $0
134+
i32.const 0
135+
i32.store offset=12
136+
local.get $0
131137
i32.const 4
132138
i32.store offset=12
133139
local.get $0

tests/compiler/inlining.untouched.wat

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,9 @@
422422
i32.const 1
423423
i32.store
424424
local.get $3
425+
i32.const 0
426+
i32.store offset=4
427+
local.get $3
425428
local.get $2
426429
i32.store offset=4
427430
local.get $3
@@ -430,6 +433,9 @@
430433
i32.const 3
431434
i32.store offset=8
432435
local.get $1
436+
i32.const 0
437+
i32.store offset=12
438+
local.get $1
433439
local.get $0
434440
i32.store offset=12
435441
local.get $1

tests/compiler/resolve-elementaccess.optimized.wat

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,15 @@
321321
local.set $0
322322
end
323323
local.get $0
324+
i32.const 0
325+
i32.store
326+
local.get $0
327+
i32.const 0
328+
i32.store offset=4
329+
local.get $0
330+
i32.const 0
331+
i32.store offset=8
332+
local.get $0
324333
i32.load
325334
drop
326335
local.get $0

tests/compiler/resolve-elementaccess.untouched.wat

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,15 @@
413413
local.set $0
414414
end
415415
local.get $0
416+
i32.const 0
417+
i32.store
418+
local.get $0
419+
i32.const 0
420+
i32.store offset=4
421+
local.get $0
422+
i32.const 0
423+
i32.store offset=8
424+
local.get $0
416425
local.tee $4
417426
local.get $3
418427
local.tee $5

0 commit comments

Comments
 (0)