summaryrefslogtreecommitdiff
path: root/json-glib/json-reader.c
diff options
context:
space:
mode:
authorGarrett Regier <garrettregier@gmail.com>2016-10-20 19:44:09 -0700
committerGarrett Regier <garrettregier@gmail.com>2017-06-16 17:16:32 -0700
commitd78ad648942637fb9212d1d93670509d4c7f687b (patch)
treee1e2fe26f63d2d12446fee7aa291f1363e84ec6d /json-glib/json-reader.c
parent7b3c405df41c0b6f6fe58fdb05c922614f08c4c4 (diff)
downloadjson-glib-d78ad648942637fb9212d1d93670509d4c7f687b.tar.gz
core: Avoid json_object_get_members()
Use JsonObject's private members_ordered GQueue instead. This avoids a g_list_copy(). https://bugzilla.gnome.org/show_bug.cgi?id=773504
Diffstat (limited to 'json-glib/json-reader.c')
-rw-r--r--json-glib/json-reader.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/json-glib/json-reader.c b/json-glib/json-reader.c
index b12734f..f371dd9 100644
--- a/json-glib/json-reader.c
+++ b/json-glib/json-reader.c
@@ -495,7 +495,7 @@ json_reader_read_element (JsonReader *reader,
case JSON_NODE_OBJECT:
{
JsonObject *object = json_node_get_object (priv->current_node);
- GList *members;
+ GQueue *members;
const gchar *name;
if (index_ >= json_object_get_size (object))
@@ -506,13 +506,11 @@ json_reader_read_element (JsonReader *reader,
priv->previous_node = priv->current_node;
- members = json_object_get_members (object);
- name = g_list_nth_data (members, index_);
+ members = json_object_get_members_internal (object);
+ name = g_queue_peek_nth (members, index_);
priv->current_node = json_object_get_member (object, name);
g_ptr_array_add (priv->members, g_strdup (name));
-
- g_list_free (members);
}
break;
@@ -737,7 +735,9 @@ gchar **
json_reader_list_members (JsonReader *reader)
{
JsonReaderPrivate *priv;
- GList *members, *l;
+ JsonObject *object;
+ GQueue *members;
+ GList *l;
gchar **retval;
gint i;
@@ -760,18 +760,15 @@ json_reader_list_members (JsonReader *reader)
return NULL;
}
- members = json_object_get_members (json_node_get_object (priv->current_node));
- if (members == NULL)
- return NULL;
+ object = json_node_get_object (priv->current_node);
+ members = json_object_get_members_internal (object);
- retval = g_new (gchar*, g_list_length (members) + 1);
- for (l = members, i = 0; l != NULL; l = l->next, i += 1)
+ retval = g_new (gchar*, g_queue_get_length (members) + 1);
+ for (l = members->head, i = 0; l != NULL; l = l->next, i += 1)
retval[i] = g_strdup (l->data);
retval[i] = NULL;
- g_list_free (members);
-
return retval;
}