From dde69802cd2bcea34d51565ec51048ebdab545b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= Date: Wed, 24 Apr 2019 18:30:46 +0200 Subject: [PATCH] Add error func to node deserialization --- gsk/gskrendernode.c | 7 +++--- gsk/gskrendernode.h | 10 ++++++-- gsk/gskrendernodeparser.c | 36 +++++++++++++-------------- gsk/gskrendernodeparserprivate.h | 5 ++-- tests/rendernode.c | 17 ++++++++++--- tests/showrendernode.c | 14 ++++++++++- testsuite/gsk/compare-render.c | 14 ++++++++++- testsuite/gsk/node-parser.c | 16 +++++++++++- testsuite/gsk/serialize-deserialize.c | 16 ++++++++++-- 9 files changed, 102 insertions(+), 33 deletions(-) diff --git a/gsk/gskrendernode.c b/gsk/gskrendernode.c index 5f30c70b05..1b1dd2d78f 100644 --- a/gsk/gskrendernode.c +++ b/gsk/gskrendernode.c @@ -387,12 +387,13 @@ gsk_render_node_write_to_file (GskRenderNode *node, * error. **/ GskRenderNode * -gsk_render_node_deserialize (GBytes *bytes, - GError **error) +gsk_render_node_deserialize (GBytes *bytes, + GskParseErrorFunc error_func, + gpointer user_data) { GskRenderNode *node = NULL; - node = gsk_render_node_deserialize_from_bytes (bytes, error); + node = gsk_render_node_deserialize_from_bytes (bytes, error_func, user_data); return node; } diff --git a/gsk/gskrendernode.h b/gsk/gskrendernode.h index 2aa270cb37..b1ae30785e 100644 --- a/gsk/gskrendernode.h +++ b/gsk/gskrendernode.h @@ -25,6 +25,7 @@ #include #include +#include G_BEGIN_DECLS @@ -52,6 +53,10 @@ struct _GskShadow float radius; }; +typedef void (* GskParseErrorFunc) (const GtkCssSection *section, + const GError *error, + gpointer user_data); + GDK_AVAILABLE_IN_ALL GType gsk_render_node_get_type (void) G_GNUC_CONST; @@ -81,8 +86,9 @@ gboolean gsk_render_node_write_to_file (GskRenderNode * const char *filename, GError **error); GDK_AVAILABLE_IN_ALL -GskRenderNode * gsk_render_node_deserialize (GBytes *bytes, - GError **error); +GskRenderNode * gsk_render_node_deserialize (GBytes *bytes, + GskParseErrorFunc error_func, + gpointer user_data); GDK_AVAILABLE_IN_ALL GskRenderNode * gsk_debug_node_new (GskRenderNode *child, diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index 202800b0b4..9ebf4aab24 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -1072,28 +1072,34 @@ gsk_render_node_parser_error (GtkCssParser *parser, const GError *error, gpointer user_data) { - GString **error_string = user_data; + struct { + GskParseErrorFunc error_func; + gpointer user_data; + } *error_func_pair = user_data; - if (!*error_string) - *error_string = g_string_new (NULL); + if (error_func_pair->error_func) + { + GtkCssSection *section = gtk_css_section_new (gtk_css_parser_get_file (parser), start, end); - g_string_append_printf (*error_string, - "ERROR: %zu:%zu: %s\n", - start->lines + 1, - start->line_chars, - error->message); + error_func_pair->error_func (section, error, error_func_pair->user_data); + gtk_css_section_unref (section); + } } GskRenderNode * -gsk_render_node_deserialize_from_bytes (GBytes *bytes, - GError **error) +gsk_render_node_deserialize_from_bytes (GBytes *bytes, + GskParseErrorFunc error_func, + gpointer user_data) { GskRenderNode *root = NULL; GtkCssParser *parser; - GString *error_string = NULL; + struct { + GskParseErrorFunc error_func; + gpointer user_data; + } error_func_pair = { error_func, user_data }; parser = gtk_css_parser_new_for_bytes (bytes, NULL, NULL, gsk_render_node_parser_error, - &error_string, NULL); + &error_func_pair, NULL); root = parse_container_node (parser); if (root && gsk_container_node_get_n_children (root) == 1) @@ -1107,12 +1113,6 @@ gsk_render_node_deserialize_from_bytes (GBytes *bytes, gtk_css_parser_unref (parser); - if (error_string != NULL) - { - *error = g_error_new_literal (GTK_CSS_PARSER_ERROR, 0, error_string->str); - g_string_free (error_string, TRUE); - } - return root; } diff --git a/gsk/gskrendernodeparserprivate.h b/gsk/gskrendernodeparserprivate.h index 9d72643c00..a506244429 100644 --- a/gsk/gskrendernodeparserprivate.h +++ b/gsk/gskrendernodeparserprivate.h @@ -4,8 +4,9 @@ #include "gskrendernode.h" -GskRenderNode * gsk_render_node_deserialize_from_bytes (GBytes *bytes, - GError **error); +GskRenderNode * gsk_render_node_deserialize_from_bytes (GBytes *bytes, + GskParseErrorFunc error_func, + gpointer user_data); char * gsk_render_node_serialize_to_string (GskRenderNode *root); #endif diff --git a/tests/rendernode.c b/tests/rendernode.c index e0f5e1f9ec..4d69693c65 100644 --- a/tests/rendernode.c +++ b/tests/rendernode.c @@ -13,6 +13,19 @@ static GOptionEntry options[] = { { NULL } }; +static void +deserialize_error_func (const GtkCssSection *section, + const GError *error, + gpointer user_data) +{ + char *section_str = gtk_css_section_to_string (section); + + g_warning ("Error at %s: %s", section_str, error->message); + + free (section_str); +} + + int main(int argc, char **argv) { @@ -66,7 +79,7 @@ main(int argc, char **argv) } start = g_get_monotonic_time (); - node = gsk_render_node_deserialize (bytes, &error); + node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); end = g_get_monotonic_time (); if (benchmark) { @@ -78,8 +91,6 @@ main(int argc, char **argv) if (node == NULL) { - g_printerr ("Invalid node file: %s\n", error->message); - g_clear_error (&error); return 1; } diff --git a/tests/showrendernode.c b/tests/showrendernode.c index afb8ac2974..bd1e502cd9 100644 --- a/tests/showrendernode.c +++ b/tests/showrendernode.c @@ -108,6 +108,18 @@ gtk_node_view_class_init (GtkNodeViewClass *klass) widget_class->snapshot = gtk_node_view_snapshot; } +static void +deserialize_error_func (const GtkCssSection *section, + const GError *error, + gpointer user_data) +{ + char *section_str = gtk_css_section_to_string (section); + + g_warning ("Error at %s: %s", section_str, error->message); + + free (section_str); +} + int main (int argc, char **argv) { @@ -152,7 +164,7 @@ main (int argc, char **argv) } bytes = g_bytes_new_take (contents, len); - GTK_NODE_VIEW (nodeview)->node = gsk_render_node_deserialize (bytes, &error); + GTK_NODE_VIEW (nodeview)->node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); g_bytes_unref (bytes); if (GTK_NODE_VIEW (nodeview)->node == NULL) diff --git a/testsuite/gsk/compare-render.c b/testsuite/gsk/compare-render.c index 642252fdd7..6c868849a9 100644 --- a/testsuite/gsk/compare-render.c +++ b/testsuite/gsk/compare-render.c @@ -54,6 +54,18 @@ save_image (cairo_surface_t *surface, g_free (filename); } +static void +deserialize_error_func (const GtkCssSection *section, + const GError *error, + gpointer user_data) +{ + char *section_str = gtk_css_section_to_string (section); + + g_error ("Error at %s: %s", section_str, error->message); + + free (section_str); +} + /* * Arguments: * 1) .node file to compare @@ -101,7 +113,7 @@ main (int argc, char **argv) } bytes = g_bytes_new_take (contents, len); - node = gsk_render_node_deserialize (bytes, &error); + node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); g_bytes_unref (bytes); g_assert_no_error (error); diff --git a/testsuite/gsk/node-parser.c b/testsuite/gsk/node-parser.c index 397b13f69f..9db6df204b 100644 --- a/testsuite/gsk/node-parser.c +++ b/testsuite/gsk/node-parser.c @@ -1,5 +1,19 @@ #include +static void +deserialize_error_func (const GtkCssSection *section, + const GError *error, + gpointer user_data) +{ + char *section_str = gtk_css_section_to_string (section); + + /* We want to parse invalid node files in this test and simply assert that the + * parser doesn't crash. So, just g_message() here instead of a warning or error. */ + g_message ("Error at %s: %s", section_str, error->message); + + free (section_str); +} + int main (int argc, char **argv) { @@ -17,7 +31,7 @@ main (int argc, char **argv) g_assert_no_error (error); g_assert (bytes != NULL); - node = gsk_render_node_deserialize (bytes, &error); + node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); if (error) g_test_message ("Error: %s\n", error->message); diff --git a/testsuite/gsk/serialize-deserialize.c b/testsuite/gsk/serialize-deserialize.c index 3f0941031d..452093c6ec 100644 --- a/testsuite/gsk/serialize-deserialize.c +++ b/testsuite/gsk/serialize-deserialize.c @@ -1,5 +1,17 @@ #include +static void +deserialize_error_func (const GtkCssSection *section, + const GError *error, + gpointer user_data) +{ + char *section_str = gtk_css_section_to_string (section); + + g_error ("Error at %s: %s", section_str, error->message); + + free (section_str); +} + int main (int argc, char **argv) { @@ -18,14 +30,14 @@ main (int argc, char **argv) g_assert_no_error (error); g_assert (bytes != NULL); - node = gsk_render_node_deserialize (bytes, &error); + node = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); g_assert_no_error (error); /* Now serialize */ g_bytes_unref (bytes); bytes = gsk_render_node_serialize (node); /* and deserialize again... */ - deserialized = gsk_render_node_deserialize (bytes, &error); + deserialized = gsk_render_node_deserialize (bytes, deserialize_error_func, NULL); if (error) g_message ("OUTPUT:\n%.*s", (int)g_bytes_get_size (bytes), (char *)g_bytes_get_data (bytes, NULL));