@@ -73,18 +73,18 @@ static void swapBytes(std::byte *M, size_t N) {
7373// / All offsets are in bits.
7474struct BitTracker {
7575 llvm::BitVector Initialized;
76- llvm::BitVector Data_ ;
76+ llvm::BitVector Data ;
7777
7878 BitTracker () = default ;
7979
8080 size_t size () const {
81- assert (Initialized.size () == Data_ .size ());
81+ assert (Initialized.size () == Data .size ());
8282 return Initialized.size ();
8383 }
8484
8585 const std::byte *getBytes (size_t BitOffset, int a) {
8686 assert (BitOffset % 8 == 0 );
87- return reinterpret_cast <const std::byte *>(Data_ .getData ().data ()) +
87+ return reinterpret_cast <const std::byte *>(Data .getData ().data ()) +
8888 (BitOffset / 8 );
8989 }
9090
@@ -95,19 +95,22 @@ struct BitTracker {
9595 bool allInitialized () const { return Initialized.all (); }
9696
9797 void pushData (const std::byte *data, size_t BitOffset, size_t BitWidth) {
98- assert (BitOffset >= Data_.size ());
98+ assert (BitOffset >= Data.size ());
99+ Data.reserve (BitOffset + BitWidth);
100+ Initialized.reserve (BitOffset + BitWidth);
101+
99102 // First, fill up the bit vector until BitOffset. The bits are all 0
100103 // but we record them as indeterminate.
101104 {
102- Data_ .resize (BitOffset, false );
105+ Data .resize (BitOffset, false );
103106 Initialized.resize (BitOffset, false );
104107 }
105108
106109 size_t BitsHandled = 0 ;
107110 // Read all full bytes first
108111 for (size_t I = 0 ; I != BitWidth / 8 ; ++I) {
109112 for (unsigned X = 0 ; X != 8 ; ++X) {
110- Data_ .push_back ((data[I] & std::byte (1 << X)) != std::byte{0 });
113+ Data .push_back ((data[I] & std::byte (1 << X)) != std::byte{0 });
111114 Initialized.push_back (true );
112115 ++BitsHandled;
113116 }
@@ -116,21 +119,21 @@ struct BitTracker {
116119 // Rest of the bits.
117120 assert ((BitWidth - BitsHandled) < 8 );
118121 for (size_t I = 0 , E = (BitWidth - BitsHandled); I != E; ++I) {
119- Data_ .push_back ((data[BitWidth / 8 ] & std::byte (1 << I)) != std::byte{0 });
122+ Data .push_back ((data[BitWidth / 8 ] & std::byte (1 << I)) != std::byte{0 });
120123 Initialized.push_back (true );
121124 ++BitsHandled;
122125 }
123126 }
124127
125128 void pushZeroes (size_t Amount) {
126- size_t N = Data_ .size ();
127- Data_ .resize (N + Amount, false );
129+ size_t N = Data .size ();
130+ Data .resize (N + Amount, false );
128131 Initialized.resize (N + Amount, true );
129132 }
130133
131134 void markUninitializedUntil (size_t Offset) {
132- assert (Offset >= Data_ .size ());
133- Data_ .resize (Offset, false );
135+ assert (Offset >= Data .size ());
136+ Data .resize (Offset, false );
134137 Initialized.resize (Offset, false );
135138 }
136139};
@@ -185,7 +188,6 @@ static bool enumerateData(const Pointer &P, const Context &Ctx, size_t Offset,
185188 size_t BitOffset = Offset + Ctx.getASTContext ().toBits (ByteOffset);
186189 Ok = Ok && enumerateData (Elem, Ctx, BitOffset, F);
187190 }
188- // TODO: Virtual bases?
189191
190192 for (unsigned I = 0 ; I != R->getNumFields (); ++I) {
191193 const Record::Field *Fi = R->getField (I);
@@ -344,11 +346,11 @@ bool DoBitCast(InterpState &S, CodePtr OpPC, const Pointer &P, std::byte *Buff,
344346 assert (Bits.size () == BuffSize * 8 );
345347
346348 HasIndeterminateBits = !Bits.allInitialized ();
347- std::memcpy (Buff, Bits.Data_ .getData ().data (), BuffSize);
349+ std::memcpy (Buff, Bits.Data .getData ().data (), BuffSize);
348350
349351 if (BigEndian)
350352 swapBytes (Buff, BuffSize);
351- return Success; // && !HasIndeterminateBits;
353+ return Success;
352354}
353355
354356// / Bitcast from a Pointer to a Pointer.
0 commit comments