@@ -27,9 +27,9 @@ void Block::addPointer(Pointer *P) {
2727 assert (!hasPointer (P));
2828#endif
2929 if (Pointers)
30- Pointers->Prev = P;
31- P->Next = Pointers;
32- P->Prev = nullptr ;
30+ Pointers->PointeeStorage . BS . Prev = P;
31+ P->PointeeStorage . BS . Next = Pointers;
32+ P->PointeeStorage . BS . Prev = nullptr ;
3333 Pointers = P;
3434#ifndef NDEBUG
3535 assert (hasPointer (P));
@@ -48,13 +48,15 @@ void Block::removePointer(Pointer *P) {
4848 assert (hasPointer (P));
4949#endif
5050
51+ BlockPointer &BP = P->PointeeStorage .BS ;
52+
5153 if (Pointers == P)
52- Pointers = P-> Next ;
54+ Pointers = BP. Next ;
5355
54- if (P-> Prev )
55- P-> Prev ->Next = P-> Next ;
56- if (P-> Next )
57- P-> Next ->Prev = P-> Prev ;
56+ if (BP. Prev )
57+ BP. Prev ->PointeeStorage . BS . Next = BP. Next ;
58+ if (BP. Next )
59+ BP. Next ->PointeeStorage . BS . Prev = BP. Prev ;
5860 P->PointeeStorage .BS .Pointee = nullptr ;
5961#ifndef NDEBUG
6062 assert (!hasPointer (P));
@@ -68,7 +70,9 @@ void Block::cleanup() {
6870
6971void Block::replacePointer (Pointer *Old, Pointer *New) {
7072 assert (Old);
73+ assert (Old->isBlockPointer ());
7174 assert (New);
75+ assert (New->isBlockPointer ());
7276 assert (Old != New);
7377 if (IsStatic) {
7478 assert (!Pointers);
@@ -78,17 +82,20 @@ void Block::replacePointer(Pointer *Old, Pointer *New) {
7882 assert (hasPointer (Old));
7983#endif
8084
81- if (Old->Prev )
82- Old->Prev ->Next = New;
83- if (Old->Next )
84- Old->Next ->Prev = New;
85- New->Prev = Old->Prev ;
86- New->Next = Old->Next ;
85+ BlockPointer &OldBP = Old->PointeeStorage .BS ;
86+ BlockPointer &NewBP = New->PointeeStorage .BS ;
87+
88+ if (OldBP.Prev )
89+ OldBP.Prev ->PointeeStorage .BS .Next = New;
90+ if (OldBP.Next )
91+ OldBP.Next ->PointeeStorage .BS .Prev = New;
92+ NewBP.Prev = OldBP.Prev ;
93+ NewBP.Next = OldBP.Next ;
8794 if (Pointers == Old)
8895 Pointers = New;
8996
90- Old-> PointeeStorage . BS .Pointee = nullptr ;
91- New-> PointeeStorage . BS .Pointee = this ;
97+ OldBP .Pointee = nullptr ;
98+ NewBP .Pointee = this ;
9299#ifndef NDEBUG
93100 assert (!hasPointer (Old));
94101 assert (hasPointer (New));
@@ -97,7 +104,7 @@ void Block::replacePointer(Pointer *Old, Pointer *New) {
97104
98105#ifndef NDEBUG
99106bool Block::hasPointer (const Pointer *P) const {
100- for (const Pointer *C = Pointers; C; C = C->Next ) {
107+ for (const Pointer *C = Pointers; C; C = C->asBlockPointer (). Next ) {
101108 if (C == P)
102109 return true ;
103110 }
@@ -120,7 +127,7 @@ DeadBlock::DeadBlock(DeadBlock *&Root, Block *Blk)
120127
121128 // Transfer pointers.
122129 B.Pointers = Blk->Pointers ;
123- for (Pointer *P = Blk->Pointers ; P; P = P->Next )
130+ for (Pointer *P = Blk->Pointers ; P; P = P->asBlockPointer (). Next )
124131 P->PointeeStorage .BS .Pointee = &B;
125132 Blk->Pointers = nullptr ;
126133}
0 commit comments