Merge branch 'develop' into feature/sax2
This commit is contained in:
		
						commit
						35e43df625
					
				
					 6 changed files with 92 additions and 91 deletions
				
			
		|  | @ -974,6 +974,7 @@ I deeply appreciate the help of the following people. | |||
| - [johnfb](https://github.com/johnfb) found a bug in the implementation of CBOR's indefinite length strings. | ||||
| - [Paul Fultz II](https://github.com/pfultz2) added a note on the cget package manager. | ||||
| - [Wilson Lin](https://github.com/wla80) made the integration section of the README more concise. | ||||
| - [RalfBielig](https://github.com/ralfbielig) detected and fixed a memory leak in the parser callback. | ||||
| 
 | ||||
| Thanks a lot for helping out! Please [let me know](mailto:mail@nlohmann.me) if I forgot someone. | ||||
| 
 | ||||
|  |  | |||
|  | @ -434,6 +434,7 @@ class parser | |||
| 
 | ||||
|         if (keep and callback and not callback(depth, parse_event_t::value, result)) | ||||
|         { | ||||
|             result.m_value.destroy(result.m_type); | ||||
|             result.m_type = value_t::discarded; | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -955,7 +955,7 @@ class basic_json | |||
|         /// constructor for rvalue strings
 | ||||
|         json_value(string_t&& value) | ||||
|         { | ||||
|             string = create<string_t>(std::move(value)); | ||||
|             string = create<string_t>(std::forward < string_t&& > (value)); | ||||
|         } | ||||
| 
 | ||||
|         /// constructor for objects
 | ||||
|  | @ -967,7 +967,7 @@ class basic_json | |||
|         /// constructor for rvalue objects
 | ||||
|         json_value(object_t&& value) | ||||
|         { | ||||
|             object = create<object_t>(std::move(value)); | ||||
|             object = create<object_t>(std::forward < object_t&& > (value)); | ||||
|         } | ||||
| 
 | ||||
|         /// constructor for arrays
 | ||||
|  | @ -979,7 +979,7 @@ class basic_json | |||
|         /// constructor for rvalue arrays
 | ||||
|         json_value(array_t&& value) | ||||
|         { | ||||
|             array = create<array_t>(std::move(value)); | ||||
|             array = create<array_t>(std::forward < array_t&& > (value)); | ||||
|         } | ||||
| 
 | ||||
|         void destroy(value_t t) noexcept | ||||
|  |  | |||
|  | @ -3911,6 +3911,7 @@ class parser | |||
| 
 | ||||
|         if (keep and callback and not callback(depth, parse_event_t::value, result)) | ||||
|         { | ||||
|             result.m_value.destroy(result.m_type); | ||||
|             result.m_type = value_t::discarded; | ||||
|         } | ||||
|     } | ||||
|  | @ -11018,7 +11019,7 @@ class basic_json | |||
|         /// constructor for rvalue strings
 | ||||
|         json_value(string_t&& value) | ||||
|         { | ||||
|             string = create<string_t>(std::move(value)); | ||||
|             string = create<string_t>(std::forward < string_t&& > (value)); | ||||
|         } | ||||
| 
 | ||||
|         /// constructor for objects
 | ||||
|  | @ -11030,7 +11031,7 @@ class basic_json | |||
|         /// constructor for rvalue objects
 | ||||
|         json_value(object_t&& value) | ||||
|         { | ||||
|             object = create<object_t>(std::move(value)); | ||||
|             object = create<object_t>(std::forward < object_t&& > (value)); | ||||
|         } | ||||
| 
 | ||||
|         /// constructor for arrays
 | ||||
|  | @ -11042,7 +11043,7 @@ class basic_json | |||
|         /// constructor for rvalue arrays
 | ||||
|         json_value(array_t&& value) | ||||
|         { | ||||
|             array = create<array_t>(std::move(value)); | ||||
|             array = create<array_t>(std::forward < array_t&& > (value)); | ||||
|         } | ||||
| 
 | ||||
|         void destroy(value_t t) noexcept | ||||
|  |  | |||
|  | @ -1527,91 +1527,6 @@ TEST_CASE("parser class") | |||
|             }); | ||||
|             CHECK(j_empty_array == json()); | ||||
|         } | ||||
| 
 | ||||
|         /*
 | ||||
|                 SECTION("skip in GeoJSON") | ||||
|                 { | ||||
|                     auto geojsonExample = R"( | ||||
|                       { "type": "FeatureCollection", | ||||
|                         "features": [ | ||||
|                           { "type": "Feature", | ||||
|                             "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, | ||||
|                             "properties": {"prop0": "value0"} | ||||
|                             }, | ||||
|                           { "type": "Feature", | ||||
|                             "geometry": { | ||||
|                               "type": "LineString", | ||||
|                               "coordinates": [ | ||||
|                                 [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] | ||||
|                                 ] | ||||
|                               }, | ||||
|                             "properties": { | ||||
|                               "prop0": "value0", | ||||
|                               "prop1": 0.0 | ||||
|                               } | ||||
|                             }, | ||||
|                           { "type": "Feature", | ||||
|                              "geometry": { | ||||
|                                "type": "Polygon", | ||||
|                                "coordinates": [ | ||||
|                                  [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], | ||||
|                                    [100.0, 1.0], [100.0, 0.0] ] | ||||
|                                  ] | ||||
|                              }, | ||||
|                              "properties": { | ||||
|                                "prop0": "value0", | ||||
|                                "prop1": {"this": "that"} | ||||
|                                } | ||||
|                              } | ||||
|                            ] | ||||
|                          })"; | ||||
| 
 | ||||
|                     json::parser_callback_t cb = [&](int, json::parse_event_t event, json & parsed) | ||||
|                     { | ||||
|                         // skip uninteresting events
 | ||||
|                         if (event == json::parse_event_t::value and !parsed.is_primitive()) | ||||
|                         { | ||||
|                             return false; | ||||
|                         } | ||||
| 
 | ||||
|                         switch (event) | ||||
|                         { | ||||
|                             case json::parse_event_t::key: | ||||
|                             { | ||||
|                                 return true; | ||||
|                             } | ||||
|                             case json::parse_event_t::value: | ||||
|                             { | ||||
|                                 return false; | ||||
|                             } | ||||
|                             case json::parse_event_t::object_start: | ||||
|                             { | ||||
|                                 return true; | ||||
|                             } | ||||
|                             case json::parse_event_t::object_end: | ||||
|                             { | ||||
|                                 return false; | ||||
|                             } | ||||
|                             case json::parse_event_t::array_start: | ||||
|                             { | ||||
|                                 return true; | ||||
|                             } | ||||
|                             case json::parse_event_t::array_end: | ||||
|                             { | ||||
|                                 return false; | ||||
|                             } | ||||
| 
 | ||||
|                             default: | ||||
|                             { | ||||
|                                 return true; | ||||
|                             } | ||||
|                         } | ||||
|                     }; | ||||
| 
 | ||||
|                     auto j = json::parse(geojsonExample, cb, true); | ||||
|                     CHECK(j == json()); | ||||
|                 } | ||||
|         */ | ||||
|     } | ||||
| 
 | ||||
|     SECTION("constructing from contiguous containers") | ||||
|  |  | |||
|  | @ -1514,4 +1514,87 @@ TEST_CASE("regression tests") | |||
|         CHECK(ff.x == 3); | ||||
|         nlohmann::json nj = lj;                // This line works as expected
 | ||||
|     } | ||||
| 
 | ||||
|     SECTION("issue #1001 - Fix memory leak during parser callback") | ||||
|     { | ||||
|         auto geojsonExample = R"( | ||||
|           { "type": "FeatureCollection", | ||||
|             "features": [ | ||||
|               { "type": "Feature", | ||||
|                 "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, | ||||
|                 "properties": {"prop0": "value0"} | ||||
|                 }, | ||||
|               { "type": "Feature", | ||||
|                 "geometry": { | ||||
|                   "type": "LineString", | ||||
|                   "coordinates": [ | ||||
|                     [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0] | ||||
|                     ] | ||||
|                   }, | ||||
|                 "properties": { | ||||
|                   "prop0": "value0", | ||||
|                   "prop1": 0.0 | ||||
|                   } | ||||
|                 }, | ||||
|               { "type": "Feature", | ||||
|                  "geometry": { | ||||
|                    "type": "Polygon", | ||||
|                    "coordinates": [ | ||||
|                      [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], | ||||
|                        [100.0, 1.0], [100.0, 0.0] ] | ||||
|                      ] | ||||
|                  }, | ||||
|                  "properties": { | ||||
|                    "prop0": "value0", | ||||
|                    "prop1": {"this": "that"} | ||||
|                    } | ||||
|                  } | ||||
|                ] | ||||
|              })"; | ||||
| 
 | ||||
|         json::parser_callback_t cb = [&](int, json::parse_event_t event, json & parsed) | ||||
|         { | ||||
|             // skip uninteresting events
 | ||||
|             if (event == json::parse_event_t::value and !parsed.is_primitive()) | ||||
|             { | ||||
|                 return false; | ||||
|             } | ||||
| 
 | ||||
|             switch (event) | ||||
|             { | ||||
|                 case json::parse_event_t::key: | ||||
|                 { | ||||
|                     return true; | ||||
|                 } | ||||
|                 case json::parse_event_t::value: | ||||
|                 { | ||||
|                     return false; | ||||
|                 } | ||||
|                 case json::parse_event_t::object_start: | ||||
|                 { | ||||
|                     return true; | ||||
|                 } | ||||
|                 case json::parse_event_t::object_end: | ||||
|                 { | ||||
|                     return false; | ||||
|                 } | ||||
|                 case json::parse_event_t::array_start: | ||||
|                 { | ||||
|                     return true; | ||||
|                 } | ||||
|                 case json::parse_event_t::array_end: | ||||
|                 { | ||||
|                     return false; | ||||
|                 } | ||||
| 
 | ||||
|                 default: | ||||
|                 { | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         auto j = json::parse(geojsonExample, cb, true); | ||||
|         CHECK(j == json()); | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue