From 344fc23d23c969043f8f146b17cb7d2f47a98384 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 19 Jan 2013 23:31:15 +0000 Subject: [PATCH] add some optional flags to affect the way advance works. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172928 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Bitcode/BitstreamReader.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/include/llvm/Bitcode/BitstreamReader.h b/include/llvm/Bitcode/BitstreamReader.h index 2ca92081e318..ae3d472c6b01 100644 --- a/include/llvm/Bitcode/BitstreamReader.h +++ b/include/llvm/Bitcode/BitstreamReader.h @@ -269,14 +269,19 @@ class BitstreamCursor { return BitStream; } + /// Flags that modify the behavior of advance(). + enum { + AF_DontPopBlockAtEnd = 1 + }; /// advance - Advance the current bitstream, returning the next entry in the /// stream. - BitstreamEntry advance() { + BitstreamEntry advance(unsigned Flags = 0) { while (1) { unsigned Code = ReadCode(); if (Code == bitc::END_BLOCK) { - if (ReadBlockEnd()) + // Pop the end of the block unless Flags tells us not to. + if (!(Flags & AF_DontPopBlockAtEnd) && ReadBlockEnd()) return BitstreamEntry::getError(); return BitstreamEntry::getEndBlock(); } @@ -297,10 +302,10 @@ class BitstreamCursor { /// advanceSkippingSubblocks - This is a convenience function for clients that /// don't expect any subblocks. This just skips over them automatically. - BitstreamEntry advanceSkippingSubblocks() { + BitstreamEntry advanceSkippingSubblocks(unsigned Flags = 0) { while (1) { // If we found a normal entry, return it. - BitstreamEntry Entry = advance(); + BitstreamEntry Entry = advance(Flags); if (Entry.Kind != BitstreamEntry::SubBlock) return Entry;