Moved some of the logic in BitstreamReader::ExitBlock into a utility function
BitstreamReader::PopBlockScope. The latter is a private method. It will also
be called by Deserializer to manipulate the current "block scope."
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43972
91177308-0d34-0410-b5e6-
96231b3b80d8
class BitstreamReader {
const unsigned char *NextChar;
const unsigned char *LastChar;
class BitstreamReader {
const unsigned char *NextChar;
const unsigned char *LastChar;
+ friend class Deserializer;
/// CurWord - This is the current data we have pulled from the stream but have
/// not returned to the client.
/// CurWord - This is the current data we have pulled from the stream but have
/// not returned to the client.
- /// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, read and enter
- /// the block, returning the BlockID of the block we just entered.
+ /// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter
+ /// the block, and return true if the block is valid.
bool EnterSubBlock(unsigned BlockID, unsigned *NumWordsP = 0) {
// Save the current block's state on BlockScope.
BlockScope.push_back(Block(CurCodeSize));
bool EnterSubBlock(unsigned BlockID, unsigned *NumWordsP = 0) {
// Save the current block's state on BlockScope.
BlockScope.push_back(Block(CurCodeSize));
// Block tail:
// [END_BLOCK, <align4bytes>]
SkipToWord();
// Block tail:
// [END_BLOCK, <align4bytes>]
SkipToWord();
+
+ PopBlockScope();
+ return false;
+ }
+
+private:
+ void PopBlockScope() {
CurCodeSize = BlockScope.back().PrevCodeSize;
// Delete abbrevs from popped scope.
CurCodeSize = BlockScope.back().PrevCodeSize;
// Delete abbrevs from popped scope.
BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
BlockScope.pop_back();
BlockScope.back().PrevAbbrevs.swap(CurAbbrevs);
BlockScope.pop_back();
//===--------------------------------------------------------------------===//
// Record Processing
//===--------------------------------------------------------------------===//
//===--------------------------------------------------------------------===//
// Record Processing
//===--------------------------------------------------------------------===//