mirror of
				https://github.com/Tencent/rapidjson.git
				synced 2025-10-27 19:10:24 +01:00 
			
		
		
		
	Fix #483 by using the correct value type
This commit is contained in:
		| @@ -390,7 +390,7 @@ public: | |||||||
|         bool exist = true; |         bool exist = true; | ||||||
|         for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { |         for (const Token *t = tokens_; t != tokens_ + tokenCount_; ++t) { | ||||||
|             if (v->IsArray() && t->name[0] == '-' && t->length == 1) { |             if (v->IsArray() && t->name[0] == '-' && t->length == 1) { | ||||||
|                 v->PushBack(Value().Move(), allocator); |                 v->PushBack(ValueType().Move(), allocator); | ||||||
|                 v = &((*v)[v->Size() - 1]); |                 v = &((*v)[v->Size() - 1]); | ||||||
|                 exist = false; |                 exist = false; | ||||||
|             } |             } | ||||||
| @@ -408,7 +408,7 @@ public: | |||||||
|                     if (t->index >= v->Size()) { |                     if (t->index >= v->Size()) { | ||||||
|                         v->Reserve(t->index + 1, allocator); |                         v->Reserve(t->index + 1, allocator); | ||||||
|                         while (t->index >= v->Size()) |                         while (t->index >= v->Size()) | ||||||
|                             v->PushBack(Value().Move(), allocator); |                             v->PushBack(ValueType().Move(), allocator); | ||||||
|                         exist = false; |                         exist = false; | ||||||
|                     } |                     } | ||||||
|                     v = &((*v)[t->index]); |                     v = &((*v)[t->index]); | ||||||
| @@ -416,7 +416,7 @@ public: | |||||||
|                 else { |                 else { | ||||||
|                     typename ValueType::MemberIterator m = v->FindMember(GenericStringRef<Ch>(t->name, t->length)); |                     typename ValueType::MemberIterator m = v->FindMember(GenericStringRef<Ch>(t->name, t->length)); | ||||||
|                     if (m == v->MemberEnd()) { |                     if (m == v->MemberEnd()) { | ||||||
|                         v->AddMember(Value(t->name, t->length, allocator).Move(), Value().Move(), allocator); |                         v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); | ||||||
|                         v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end |                         v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end | ||||||
|                         exist = false; |                         exist = false; | ||||||
|                     } |                     } | ||||||
|   | |||||||
| @@ -1456,3 +1456,38 @@ TEST(Pointer, Ambiguity) { | |||||||
|         EXPECT_EQ(456, Pointer("/0/1").Get(d)->GetInt()); |         EXPECT_EQ(456, Pointer("/0/1").Get(d)->GetInt()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // https://github.com/miloyip/rapidjson/issues/483 | ||||||
|  | namespace myjson { | ||||||
|  |  | ||||||
|  | class MyAllocator | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     static const bool kNeedFree = true; | ||||||
|  |     void * Malloc(size_t _size) { return malloc(_size); } | ||||||
|  |     void * Realloc(void *_org_p, size_t _org_size, size_t _new_size) { (void)_org_size; return realloc(_org_p, _new_size); } | ||||||
|  |     static void Free(void *_p) { return free(_p); } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | typedef rapidjson::GenericDocument< | ||||||
|  |             rapidjson::UTF8<>, | ||||||
|  |             rapidjson::MemoryPoolAllocator< MyAllocator >, | ||||||
|  |             MyAllocator | ||||||
|  |         > Document; | ||||||
|  |  | ||||||
|  | typedef rapidjson::GenericPointer< | ||||||
|  |             ::myjson::Document::ValueType, | ||||||
|  |             MyAllocator | ||||||
|  |         > Pointer; | ||||||
|  |  | ||||||
|  | typedef ::myjson::Document::ValueType Value; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST(Pointer, Issue483) { | ||||||
|  |     std::string mystr, path; | ||||||
|  |     myjson::Document document; | ||||||
|  |     myjson::Value value(rapidjson::kStringType); | ||||||
|  |     value.SetString(mystr.c_str(), mystr.length(), document.GetAllocator()); | ||||||
|  |     myjson::Pointer(path.c_str()).Set(document, value, document.GetAllocator()); | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Milo Yip
					Milo Yip