mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 09:55:18 +00:00
virJSONValueCopy: Don't use virJSONValue(Object|Array)Append
We know the exact number of keys or array members for the copied objects so we can pre-allocate the arrays rather than inserting into them in a loop incurring realloc copy penalty. Also virJSONValueCopy now can't fail since all of the functions allocating the different cases use just g_new/g_strdup internally so we can remove the NULL checks from the recursive calls. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
b116e715a8
commit
3e411cbc5f
@ -1530,27 +1530,23 @@ virJSONValueCopy(const virJSONValue *in)
|
|||||||
switch ((virJSONType) in->type) {
|
switch ((virJSONType) in->type) {
|
||||||
case VIR_JSON_TYPE_OBJECT:
|
case VIR_JSON_TYPE_OBJECT:
|
||||||
out = virJSONValueNewObject();
|
out = virJSONValueNewObject();
|
||||||
|
|
||||||
|
out->data.object.pairs = g_new0(virJSONObjectPair, in->data.object.npairs);
|
||||||
|
out->data.object.npairs = in->data.object.npairs;
|
||||||
|
|
||||||
for (i = 0; i < in->data.object.npairs; i++) {
|
for (i = 0; i < in->data.object.npairs; i++) {
|
||||||
virJSONValuePtr val = NULL;
|
out->data.object.pairs[i].key = g_strdup(in->data.object.pairs[i].key);
|
||||||
if (!(val = virJSONValueCopy(in->data.object.pairs[i].value)))
|
out->data.object.pairs[i].value = virJSONValueCopy(in->data.object.pairs[i].value);
|
||||||
goto error;
|
|
||||||
if (virJSONValueObjectAppend(out, in->data.object.pairs[i].key,
|
|
||||||
val) < 0) {
|
|
||||||
virJSONValueFree(val);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VIR_JSON_TYPE_ARRAY:
|
case VIR_JSON_TYPE_ARRAY:
|
||||||
out = virJSONValueNewArray();
|
out = virJSONValueNewArray();
|
||||||
|
|
||||||
|
out->data.array.values = g_new0(virJSONValuePtr, in->data.array.nvalues);
|
||||||
|
out->data.array.nvalues = in->data.array.nvalues;
|
||||||
|
|
||||||
for (i = 0; i < in->data.array.nvalues; i++) {
|
for (i = 0; i < in->data.array.nvalues; i++) {
|
||||||
virJSONValuePtr val = NULL;
|
out->data.array.values[i] = virJSONValueCopy(in->data.array.values[i]);
|
||||||
if (!(val = virJSONValueCopy(in->data.array.values[i])))
|
|
||||||
goto error;
|
|
||||||
if (virJSONValueArrayAppend(out, val) < 0) {
|
|
||||||
virJSONValueFree(val);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1570,10 +1566,6 @@ virJSONValueCopy(const virJSONValue *in)
|
|||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
|
|
||||||
error:
|
|
||||||
virJSONValueFree(out);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user