|
@@ -219,16 +219,19 @@ namespace Google.ProtocolBuffers {
|
|
/// </summary>
|
|
/// </summary>
|
|
public String ReadString() {
|
|
public String ReadString() {
|
|
int size = (int) ReadRawVarint32();
|
|
int size = (int) ReadRawVarint32();
|
|
- if (size < bufferSize - bufferPos && size > 0) {
|
|
|
|
|
|
+ // No need to read any data for an empty string.
|
|
|
|
+ if (size == 0) {
|
|
|
|
+ return "";
|
|
|
|
+ }
|
|
|
|
+ if (size <= bufferSize - bufferPos) {
|
|
// Fast path: We already have the bytes in a contiguous buffer, so
|
|
// Fast path: We already have the bytes in a contiguous buffer, so
|
|
// just copy directly from it.
|
|
// just copy directly from it.
|
|
String result = Encoding.UTF8.GetString(buffer, bufferPos, size);
|
|
String result = Encoding.UTF8.GetString(buffer, bufferPos, size);
|
|
bufferPos += size;
|
|
bufferPos += size;
|
|
return result;
|
|
return result;
|
|
- } else {
|
|
|
|
- // Slow path: Build a byte array first then copy it.
|
|
|
|
- return Encoding.UTF8.GetString(ReadRawBytes(size));
|
|
|
|
}
|
|
}
|
|
|
|
+ // Slow path: Build a byte array first then copy it.
|
|
|
|
+ return Encoding.UTF8.GetString(ReadRawBytes(size));
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// <summary>
|