Commit b4b0e304 authored by Feng Xiao's avatar Feng Xiao Committed by GitHub

Merge pull request #2355 from xfxyjwf/fixjson

Speed up JSON parsing.
parents 8387b88c bd158fc2
......@@ -49,22 +49,25 @@ namespace protobuf {
namespace util {
namespace internal {
ZeroCopyStreamByteSink::~ZeroCopyStreamByteSink() {
stream_->BackUp(buffer_size_);
}
void ZeroCopyStreamByteSink::Append(const char* bytes, size_t len) {
while (len > 0) {
void* buffer;
int length;
if (!stream_->Next(&buffer, &length)) {
// There isn't a way for ByteSink to report errors.
while (true) {
if (len <= buffer_size_) {
memcpy(buffer_, bytes, len);
buffer_ = static_cast<char*>(buffer_) + len;
buffer_size_ -= len;
return;
}
if (len < length) {
memcpy(buffer, bytes, len);
stream_->BackUp(length - len);
break;
} else {
memcpy(buffer, bytes, length);
bytes += length;
len -= length;
memcpy(buffer_, bytes, buffer_size_);
bytes += buffer_size_;
len -= buffer_size_;
if (!stream_->Next(&buffer_, &buffer_size_)) {
// There isn't a way for ByteSink to report errors.
buffer_size_ = 0;
return;
}
}
}
......
......@@ -176,12 +176,15 @@ namespace internal {
class LIBPROTOBUF_EXPORT ZeroCopyStreamByteSink : public strings::ByteSink {
public:
explicit ZeroCopyStreamByteSink(io::ZeroCopyOutputStream* stream)
: stream_(stream) {}
: stream_(stream), buffer_size_(0) {}
~ZeroCopyStreamByteSink();
virtual void Append(const char* bytes, size_t len);
private:
io::ZeroCopyOutputStream* stream_;
void* buffer_;
int buffer_size_;
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyStreamByteSink);
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment