diff --git a/include/rapidjson/reader.h b/include/rapidjson/reader.h index 92fd781..d93c8c2 100644 --- a/include/rapidjson/reader.h +++ b/include/rapidjson/reader.h @@ -473,7 +473,7 @@ private: if (is.Peek() != '"') RAPIDJSON_PARSE_ERROR(kParseErrorObjectMissName, is.Tell()); - ParseKey(is, handler); + ParseString(is, handler, true); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; SkipWhitespace(is); @@ -578,7 +578,7 @@ private: RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, is.Tell() - 1); } - // Helper function to parse four hexidecimal digits in \uXXXX in ParseStringOrKey(). + // Helper function to parse four hexidecimal digits in \uXXXX in ParseString(). template unsigned ParseHex4(InputStream& is) { unsigned codepoint = 0; @@ -618,47 +618,33 @@ private: }; // Parse string and generate String event. Different code paths for kParseInsituFlag. - template - void ParseStringOrKey(InputStream& is, Handler& handler) { + template + void ParseString(InputStream& is, Handler& handler, bool isKey = false) { internal::StreamLocalCopy copy(is); InputStream& s(copy.s); + const typename TargetEncoding::Ch* str = NULL; + SizeType len = 0; + if (parseFlags & kParseInsituFlag) { typename InputStream::Ch *head = s.PutBegin(); ParseStringToStream(s, s); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; size_t length = s.PutEnd(head) - 1; RAPIDJSON_ASSERT(length <= 0xFFFFFFFF); - if (isKey) { - if (!handler.Key((typename TargetEncoding::Ch*)head, SizeType(length), false)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } else { - if (!handler.String((typename TargetEncoding::Ch*)head, SizeType(length), false)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } + str = (const typename TargetEncoding::Ch*)head; + len = SizeType(length); } else { StackStream stackStream(stack_); ParseStringToStream(s, stackStream); RAPIDJSON_PARSE_ERROR_EARLY_RETURN_VOID; - if (isKey) { - if (!handler.Key(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, true)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } else { - if (!handler.String(stack_.template Pop(stackStream.length_), stackStream.length_ - 1, true)) - RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); - } + str = stack_.template Pop(stackStream.length_); + len = stackStream.length_ - 1; } - } - template - void ParseKey(InputStream& is, Handler& handler) { - return ParseStringOrKey(is, handler); - } - - template - void ParseString(InputStream& is, Handler& handler) { - return ParseStringOrKey(is, handler); + if(!(isKey ? handler.Key(str, len, false) : handler.String(str, len, false))) + RAPIDJSON_PARSE_ERROR(kParseErrorTermination, s.Tell()); } // Parse string to an output is @@ -1216,7 +1202,7 @@ private: } case IterativeParsingMemberKeyState: - ParseKey(is, handler); + ParseString(is, handler, true); if (HasParseError()) return IterativeParsingErrorState; else