Skip to content

Commit 306bc56

Browse files
authored
Merge pull request swiftlang#68920 from mikeash/lazy-copy-ivar-list-fix
[Runtime] Fix lazy ivar list copying.
2 parents 0d2f98a + e2b4d2f commit 306bc56

File tree

1 file changed

+11
-8
lines changed

1 file changed

+11
-8
lines changed

stdlib/public/runtime/Metadata.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3455,17 +3455,17 @@ static void initObjCClass(ClassMetadata *self,
34553455
for (unsigned i = 0; i != numFields; ++i) {
34563456
auto *eltLayout = fieldTypes[i];
34573457

3458-
ClassIvarEntry &ivar = ivars->getIvars()[i];
3458+
ClassIvarEntry *ivar = &ivars->getIvars()[i];
34593459

34603460
// Fill in the field offset global, if this ivar has one.
3461-
if (ivar.Offset) {
3462-
if (*ivar.Offset != fieldOffsets[i])
3463-
*ivar.Offset = fieldOffsets[i];
3461+
if (ivar->Offset) {
3462+
if (*ivar->Offset != fieldOffsets[i])
3463+
*ivar->Offset = fieldOffsets[i];
34643464
}
34653465

34663466
// If the ivar's size doesn't match the field layout we
34673467
// computed, overwrite it and give it better type information.
3468-
if (ivar.Size != eltLayout->size) {
3468+
if (ivar->Size != eltLayout->size) {
34693469
// If we're going to modify the ivar list, we need to copy it first.
34703470
if (!copiedIvarList) {
34713471
auto ivarListSize = sizeof(ClassIvarList) +
@@ -3475,10 +3475,13 @@ static void initObjCClass(ClassMetadata *self,
34753475
memcpy(ivars, rodata->IvarList, ivarListSize);
34763476
rodata->IvarList = ivars;
34773477
copiedIvarList = true;
3478+
3479+
// Update ivar to point to the newly copied list.
3480+
ivar = &ivars->getIvars()[i];
34783481
}
3479-
ivar.Size = eltLayout->size;
3480-
ivar.Type = nullptr;
3481-
ivar.Log2Alignment =
3482+
ivar->Size = eltLayout->size;
3483+
ivar->Type = nullptr;
3484+
ivar->Log2Alignment =
34823485
getLog2AlignmentFromMask(eltLayout->flags.getAlignmentMask());
34833486
}
34843487
}

0 commit comments

Comments
 (0)