diff options
author | Emmanuele Bassi <ebassi@openedhand.com> | 2008-01-27 21:26:51 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@openedhand.com> | 2008-01-27 21:26:51 +0000 |
commit | f2f08d282ac6bc69ba9029d065979b1332abd5a5 (patch) | |
tree | c8042cd49197d06fb6b147deaf683b44f8bcc9f7 /json-glib/json-parser.c | |
parent | 629d4a54913c578d7b612f10d9b04addc8e0c7fb (diff) | |
download | json-glib-f2f08d282ac6bc69ba9029d065979b1332abd5a5.tar.gz |
Extract the parser state clearing into its own function
The JsonParser object clears its state upon starting the parsing sequence
or during the instance destruction process. It's worth moving the free
and unref calls into their own function to be called by the load_from_data()
and dispose methods. As further optimisation, inlining them should be
worth as well.
Diffstat (limited to 'json-glib/json-parser.c')
-rw-r--r-- | json-glib/json-parser.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/json-glib/json-parser.c b/json-glib/json-parser.c index d129774..02524a7 100644 --- a/json-glib/json-parser.c +++ b/json-glib/json-parser.c @@ -140,16 +140,12 @@ static guint json_parse_object (JsonParser *parser, GScanner *scanner, gboolean nested); -static void -json_parser_dispose (GObject *gobject) +static inline void +json_parser_clear (JsonParser *parser) { - JsonParserPrivate *priv = JSON_PARSER_GET_PRIVATE (gobject); + JsonParserPrivate *priv = parser->priv; - if (priv->root) - { - json_node_free (priv->root); - priv->root = NULL; - } + g_free (priv->variable_name); if (priv->last_error) { @@ -157,7 +153,17 @@ json_parser_dispose (GObject *gobject) priv->last_error = NULL; } - g_free (priv->variable_name); + if (priv->root) + { + json_node_free (priv->root); + priv->root = NULL; + } +} + +static void +json_parser_dispose (GObject *gobject) +{ + json_parser_clear (JSON_PARSER (gobject)); G_OBJECT_CLASS (json_parser_parent_class)->dispose (gobject); } @@ -973,19 +979,13 @@ json_parser_load_from_data (JsonParser *parser, g_return_val_if_fail (JSON_IS_PARSER (parser), FALSE); g_return_val_if_fail (data != NULL, FALSE); - priv = parser->priv; - - g_free (priv->variable_name); - - if (priv->root) - { - json_node_free (priv->root); - priv->root = NULL; - } + json_parser_clear (parser); if (length < 0) length = strlen (data); + priv = parser->priv; + scanner = json_scanner_new (parser); g_scanner_input_text (scanner, data, length); @@ -1069,6 +1069,7 @@ json_parser_load_from_data (JsonParser *parser, g_signal_emit (parser, parser_signals[PARSE_END], 0); + /* remove the scanner */ g_scanner_destroy (scanner); priv->scanner = NULL; priv->current_node = NULL; @@ -1121,7 +1122,11 @@ json_parser_get_root (JsonParser *parser) * * Retrieves the line currently parsed, starting from 1. * - * Return value: the currently parsed line. + * This function has defined behaviour only while parsing; calling this + * function from outside the signal handlers emitted by #JsonParser will + * yield 0. + * + * Return value: the currently parsed line, or 0. */ guint json_parser_get_current_line (JsonParser *parser) @@ -1141,7 +1146,11 @@ json_parser_get_current_line (JsonParser *parser) * Retrieves the current position inside the current line, starting * from 0. * - * Return value: the position in the current line + * This function has defined behaviour only while parsing; calling this + * function from outside the signal handlers emitted by #JsonParser will + * yield 0. + * + * Return value: the position in the current line, or 0. */ guint json_parser_get_current_pos (JsonParser *parser) @@ -1162,7 +1171,7 @@ json_parser_get_current_pos (JsonParser *parser) * A JSON data stream might sometimes contain an assignment, even though * it would technically constitute a violation of the RFC. #JsonParser * will ignore the left hand identifier and parse the right hand value - * of the assignment. It will record, though, the existence of the + * of the assignment. #JsonParser will record, though, the existence of the * assignment in the data stream and the variable name used. * * Return value: %TRUE if there was an assignment, %FALSE otherwise. If |