On 7/1/22 13:11, Ilya Maximets wrote:
> When reference counting for json objects was introduced the
> old json_clone() function became json_deep_clone(), but it
> still calls shallow json_clone() while cloning objects and
> arrays not really producing a deep copy.
>
> Fixing that by making other functions to perform a deep copy
> as well. There are no users for this functionality inside
> OVS right now, but OVS exports this functionality externally.
>
> 'ovstest test-json' extended to test both versions of a clone
> on provided inputs.
>
> Fixes: 9854d473adea ("json: Use reference counting in JSON objects")
> Signed-off-by: Ilya Maximets <[email protected]>
> ---
> lib/json.c | 16 +++---
> tests/test-json.c | 125 ++++++++++++++++++++++++++++++++++++++++++++--
> 2 files changed, 129 insertions(+), 12 deletions(-)
>
> diff --git a/lib/json.c b/lib/json.c
> index 3267a6196..aded8bb01 100644
> --- a/lib/json.c
> +++ b/lib/json.c
> @@ -420,8 +420,8 @@ json_destroy_array(struct json_array *array)
> free(array->elems);
> }
>
> -static struct json *json_clone_object(const struct shash *object);
> -static struct json *json_clone_array(const struct json_array *array);
> +static struct json *json_deep_clone_object(const struct shash *object);
> +static struct json *json_deep_clone_array(const struct json_array *array);
>
> /* Returns a deep copy of 'json'. */
> struct json *
> @@ -429,10 +429,10 @@ json_deep_clone(const struct json *json)
> {
> switch (json->type) {
> case JSON_OBJECT:
> - return json_clone_object(json->object);
> + return json_deep_clone_object(json->object);
>
> case JSON_ARRAY:
> - return json_clone_array(&json->array);
> + return json_deep_clone_array(&json->array);
>
> case JSON_STRING:
> return json_string_create(json->string);
> @@ -464,7 +464,7 @@ json_nullable_clone(const struct json *json)
> }
>
> static struct json *
> -json_clone_object(const struct shash *object)
> +json_deep_clone_object(const struct shash *object)
> {
> struct shash_node *node;
> struct json *json;
> @@ -472,20 +472,20 @@ json_clone_object(const struct shash *object)
> json = json_object_create();
> SHASH_FOR_EACH (node, object) {
> struct json *value = node->data;
> - json_object_put(json, node->name, json_clone(value));
> + json_object_put(json, node->name, json_deep_clone(value));
> }
> return json;
> }
>
> static struct json *
> -json_clone_array(const struct json_array *array)
> +json_deep_clone_array(const struct json_array *array)
> {
> struct json **elems;
> size_t i;
>
> elems = xmalloc(array->n * sizeof *elems);
> for (i = 0; i < array->n; i++) {
> - elems[i] = json_clone(array->elems[i]);
> + elems[i] = json_deep_clone(array->elems[i]);
> }
> return json_array_create(elems, array->n);
> }
> diff --git a/tests/test-json.c b/tests/test-json.c
> index a2f4332e7..225badf70 100644
> --- a/tests/test-json.c
> +++ b/tests/test-json.c
> @@ -34,8 +34,124 @@ static int pretty = 0;
> * instead of exactly one object or array. */
> static int multiple = 0;
>
> +
Nit: newline not really needed.
> +static void test_json_equal(const struct json *a, const struct json *b,
> + bool allow_the_same);
> +
Nit: not needed here either I think.
Anyway, these can be fixed at apply time if you agree, the fix itself
makes sense:
Acked-by: Dumitru Ceara <[email protected]>
Thanks,
Dumitru
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev