Index: third_party/protobuf/src/google/protobuf/io/coded_stream.cc |
=================================================================== |
--- third_party/protobuf/src/google/protobuf/io/coded_stream.cc (revision 216642) |
+++ third_party/protobuf/src/google/protobuf/io/coded_stream.cc (working copy) |
@@ -43,7 +43,7 @@ |
#include <limits.h> |
#include <google/protobuf/io/zero_copy_stream.h> |
#include <google/protobuf/stubs/common.h> |
-#include <google/protobuf/stubs/stl_util-inl.h> |
+#include <google/protobuf/stubs/stl_util.h> |
namespace google { |
@@ -69,7 +69,20 @@ |
// CodedInputStream ================================================== |
+CodedInputStream::~CodedInputStream() { |
+ if (input_ != NULL) { |
+ BackUpInputToCurrentPosition(); |
+ } |
+ if (total_bytes_warning_threshold_ == -2) { |
+ GOOGLE_LOG(WARNING) << "The total number of bytes read was " << total_bytes_read_; |
+ } |
+} |
+ |
+// Static. |
+int CodedInputStream::default_recursion_limit_ = 100; |
+ |
+ |
void CodedInputStream::BackUpInputToCurrentPosition() { |
int backup_bytes = BufferSize() + buffer_size_after_limit_ + overflow_bytes_; |
if (backup_bytes > 0) { |
@@ -98,8 +111,7 @@ |
CodedInputStream::Limit CodedInputStream::PushLimit(int byte_limit) { |
// Current position relative to the beginning of the stream. |
- int current_position = total_bytes_read_ - |
- (BufferSize() + buffer_size_after_limit_); |
+ int current_position = CurrentPosition(); |
Limit old_limit = current_limit_; |
@@ -133,10 +145,9 @@ |
legitimate_message_end_ = false; |
} |
-int CodedInputStream::BytesUntilLimit() { |
+int CodedInputStream::BytesUntilLimit() const { |
if (current_limit_ == INT_MAX) return -1; |
- int current_position = total_bytes_read_ - |
- (BufferSize() + buffer_size_after_limit_); |
+ int current_position = CurrentPosition(); |
return current_limit_ - current_position; |
} |
@@ -145,10 +156,14 @@ |
int total_bytes_limit, int warning_threshold) { |
// Make sure the limit isn't already past, since this could confuse other |
// code. |
- int current_position = total_bytes_read_ - |
- (BufferSize() + buffer_size_after_limit_); |
+ int current_position = CurrentPosition(); |
total_bytes_limit_ = max(current_position, total_bytes_limit); |
- total_bytes_warning_threshold_ = warning_threshold; |
+ if (warning_threshold >= 0) { |
+ total_bytes_warning_threshold_ = warning_threshold; |
+ } else { |
+ // warning_threshold is negative |
+ total_bytes_warning_threshold_ = -1; |
+ } |
RecomputeBufferLimits(); |
} |
@@ -368,16 +383,17 @@ |
// For the slow path, just do a 64-bit read. Try to optimize for one-byte tags |
// again, since we have now refreshed the buffer. |
- uint64 result; |
+ uint64 result = 0; |
if (!ReadVarint64(&result)) return 0; |
return static_cast<uint32>(result); |
} |
uint32 CodedInputStream::ReadTagFallback() { |
- if (BufferSize() >= kMaxVarintBytes || |
+ const int buf_size = BufferSize(); |
+ if (buf_size >= kMaxVarintBytes || |
// Optimization: If the varint ends at exactly the end of the buffer, |
// we can detect that and still use the fast path. |
- (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { |
+ (buf_size > 0 && !(buffer_end_[-1] & 0x80))) { |
uint32 tag; |
const uint8* end = ReadVarint32FromArray(buffer_, &tag); |
if (end == NULL) { |
@@ -388,7 +404,9 @@ |
} else { |
// We are commonly at a limit when attempting to read tags. Try to quickly |
// detect this case without making another function call. |
- if (buffer_ == buffer_end_ && buffer_size_after_limit_ > 0 && |
+ if ((buf_size == 0) && |
+ ((buffer_size_after_limit_ > 0) || |
+ (total_bytes_read_ == current_limit_)) && |
// Make sure that the limit we hit is not total_bytes_limit_, since |
// in that case we still need to call Refresh() so that it prints an |
// error. |
@@ -492,8 +510,8 @@ |
"CodedInputStream::SetTotalBytesLimit() in " |
"google/protobuf/io/coded_stream.h."; |
- // Don't warn again for this stream. |
- total_bytes_warning_threshold_ = -1; |
+ // Don't warn again for this stream, and print total size at the end. |
+ total_bytes_warning_threshold_ = -2; |
} |
const void* void_buffer; |