From f740844c8f9d7131c1b3674c29f94e4a7a2a7885 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 30 Nov 2021 14:23:48 -0500 Subject: serializer: Move all error handling to the parser Just let the parser carry the error. --- pango/serializer.c | 330 ++++++++++++++++++----------------------------------- 1 file changed, 108 insertions(+), 222 deletions(-) diff --git a/pango/serializer.c b/pango/serializer.c index c52820e9..202e65de 100644 --- a/pango/serializer.c +++ b/pango/serializer.c @@ -627,12 +627,10 @@ gstring_write (GtkJsonPrinter *printer, /* }}} */ /* {{{ Deserialization */ -static gboolean +static int parser_get_enum_value (GtkJsonParser *parser, GType type, - gboolean allow_extra, - int *value, - GError **error) + gboolean allow_extra) { GEnumClass *enum_class; GEnumValue *enum_value; @@ -644,8 +642,7 @@ parser_get_enum_value (GtkJsonParser *parser, if (enum_value) { g_free (str); - *value = enum_value->value; - return TRUE; + return enum_value->value; } if (allow_extra) @@ -657,53 +654,64 @@ parser_get_enum_value (GtkJsonParser *parser, if (*endp == '\0') { g_free (str); - *value = (int)v; - return TRUE; + return (int)v; } } - g_set_error (error, - PANGO_LAYOUT_DESERIALIZE_ERROR, - PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE, - "Could not parse enum value of type %s: %s", - g_type_name (type), - str); + gtk_json_parser_set_error (parser, + g_error_new (PANGO_LAYOUT_DESERIALIZE_ERROR, + PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE, + "Could not parse enum value of type %s: %s", + g_type_name (type), + str)); g_free (str); - return FALSE; + return 0; } -static gboolean -parser_get_font_description (GtkJsonParser *parser, - PangoFontDescription **desc, - GError **error) +static PangoFontDescription * +parser_get_font_description (GtkJsonParser *parser) { char *str = gtk_json_parser_get_string (parser); - *desc = pango_font_description_from_string (str); - - if (!*desc) - g_set_error (error, - PANGO_LAYOUT_DESERIALIZE_ERROR, - PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE, - "Failed to parse font: %s", str); + PangoFontDescription *desc = pango_font_description_from_string (str); + if (!desc) + gtk_json_parser_set_error (parser, + g_error_new (PANGO_LAYOUT_DESERIALIZE_ERROR, + PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE, + "Failed to parse font: %s", str)); g_free (str); - return *desc != NULL; + return desc; +} + +static void +parser_get_color (GtkJsonParser *parser, + PangoColor *color) +{ + char *str = gtk_json_parser_get_string (parser); + if (!pango_color_parse (color, str)) + { + gtk_json_parser_set_error (parser, + g_error_new (PANGO_LAYOUT_DESERIALIZE_ERROR, + PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE, + "Failed to parse color: %s", str)); + color->red = color->green = color->blue = 0; + } + + g_free (str); } static PangoAttribute * -attr_for_type (GtkJsonParser *parser, - PangoAttrType type, - int start, - int end, - GError **error) +attr_for_type (GtkJsonParser *parser, + PangoAttrType type, + int start, + int end) { PangoAttribute *attr; PangoFontDescription *desc; PangoColor color; - int value; char *str; switch (type) @@ -712,10 +720,10 @@ attr_for_type (GtkJsonParser *parser, g_assert_not_reached (); case PANGO_ATTR_INVALID: - g_set_error (error, - PANGO_LAYOUT_DESERIALIZE_ERROR, - PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE, - "Missing attribute type"); + gtk_json_parser_set_error (parser, + g_error_new (PANGO_LAYOUT_DESERIALIZE_ERROR, + PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE, + "Missing attribute type")); return NULL; case PANGO_ATTR_LANGUAGE: @@ -731,27 +739,19 @@ attr_for_type (GtkJsonParser *parser, break; case PANGO_ATTR_STYLE: - if (!parser_get_enum_value (parser, PANGO_TYPE_STYLE, FALSE, &value, error)) - return NULL; - attr = pango_attr_style_new ((PangoStyle)value); + attr = pango_attr_style_new ((PangoStyle)parser_get_enum_value (parser, PANGO_TYPE_STYLE, FALSE)); break; case PANGO_ATTR_WEIGHT: - if (!parser_get_enum_value (parser, PANGO_TYPE_WEIGHT, FALSE, &value, error)) - return NULL; - attr = pango_attr_weight_new (value); + attr = pango_attr_weight_new (parser_get_enum_value (parser, PANGO_TYPE_WEIGHT, TRUE)); break; case PANGO_ATTR_VARIANT: - if (!parser_get_enum_value (parser, PANGO_TYPE_VARIANT, FALSE, &value, error)) - return NULL; - attr = pango_attr_variant_new ((PangoVariant)value); + attr = pango_attr_variant_new ((PangoVariant)parser_get_enum_value (parser, PANGO_TYPE_VARIANT, FALSE)); break; case PANGO_ATTR_STRETCH: - if (!parser_get_enum_value (parser, PANGO_TYPE_STRETCH, FALSE, &value, error)) - return NULL; - attr = pango_attr_stretch_new ((PangoStretch)value); + attr = pango_attr_stretch_new ((PangoStretch)parser_get_enum_value (parser, PANGO_TYPE_STRETCH, FALSE)); break; case PANGO_ATTR_SIZE: @@ -759,31 +759,23 @@ attr_for_type (GtkJsonParser *parser, break; case PANGO_ATTR_FONT_DESC: - str = gtk_json_parser_get_string (parser); - desc = pango_font_description_from_string (str); + desc = parser_get_font_description (parser); attr = pango_attr_font_desc_new (desc); pango_font_description_free (desc); - g_free (str); break; case PANGO_ATTR_FOREGROUND: - str = gtk_json_parser_get_string (parser); - pango_color_parse (&color, str); + parser_get_color (parser, &color); attr = pango_attr_foreground_new (color.red, color.green, color.blue); - g_free (str); break; case PANGO_ATTR_BACKGROUND: - str = gtk_json_parser_get_string (parser); - pango_color_parse (&color, str); + parser_get_color (parser, &color); attr = pango_attr_background_new (color.red, color.green, color.blue); - g_free (str); break; case PANGO_ATTR_UNDERLINE: - if (!parser_get_enum_value (parser, PANGO_TYPE_UNDERLINE, FALSE, &value, error)) - return NULL; - attr = pango_attr_underline_new ((PangoUnderline)value); + attr = pango_attr_underline_new ((PangoUnderline)parser_get_enum_value (parser, PANGO_TYPE_UNDERLINE, FALSE)); break; case PANGO_ATTR_STRIKETHROUGH: @@ -812,17 +804,13 @@ attr_for_type (GtkJsonParser *parser, break; case PANGO_ATTR_UNDERLINE_COLOR: - str = gtk_json_parser_get_string (parser); - pango_color_parse (&color, str); + parser_get_color (parser, &color); attr = pango_attr_underline_color_new (color.red, color.green, color.blue); - g_free (str); break; case PANGO_ATTR_STRIKETHROUGH_COLOR: - str = gtk_json_parser_get_string (parser); - pango_color_parse (&color, str); + parser_get_color (parser, &color); attr = pango_attr_strikethrough_color_new (color.red, color.green, color.blue); - g_free (str); break; case PANGO_ATTR_ABSOLUTE_SIZE: @@ -830,15 +818,11 @@ attr_for_type (GtkJsonParser *parser, break; case PANGO_ATTR_GRAVITY: - if (!parser_get_enum_value (parser, PANGO_TYPE_GRAVITY, FALSE, &value, error)) - return NULL; - attr = pango_attr_gravity_new ((PangoGravity)value); + attr = pango_attr_gravity_new ((PangoGravity)parser_get_enum_value (parser, PANGO_TYPE_GRAVITY, FALSE)); break; case PANGO_ATTR_GRAVITY_HINT: - if (!parser_get_enum_value (parser, PANGO_TYPE_GRAVITY_HINT, FALSE, &value, error)) - return NULL; - attr = pango_attr_gravity_hint_new ((PangoGravityHint)value); + attr = pango_attr_gravity_hint_new ((PangoGravityHint)parser_get_enum_value (parser, PANGO_TYPE_GRAVITY_HINT, FALSE)); break; case PANGO_ATTR_FONT_FEATURES: @@ -868,16 +852,12 @@ attr_for_type (GtkJsonParser *parser, break; case PANGO_ATTR_OVERLINE: - if (!parser_get_enum_value (parser, PANGO_TYPE_OVERLINE, FALSE, &value, error)) - return NULL; - attr = pango_attr_overline_new ((PangoOverline)value); + attr = pango_attr_overline_new ((PangoOverline)parser_get_enum_value (parser, PANGO_TYPE_OVERLINE, FALSE)); break; case PANGO_ATTR_OVERLINE_COLOR: - str = gtk_json_parser_get_string (parser); - pango_color_parse (&color, str); + parser_get_color (parser, &color); attr = pango_attr_overline_color_new (color.red, color.green, color.blue); - g_free (str); break; case PANGO_ATTR_LINE_HEIGHT: @@ -889,9 +869,7 @@ attr_for_type (GtkJsonParser *parser, break; case PANGO_ATTR_TEXT_TRANSFORM: - if (!parser_get_enum_value (parser, PANGO_TYPE_TEXT_TRANSFORM, FALSE, &value, error)) - return NULL; - attr = pango_attr_text_transform_new ((PangoTextTransform)value); + attr = pango_attr_text_transform_new ((PangoTextTransform)parser_get_enum_value (parser, PANGO_TYPE_TEXT_TRANSFORM, FALSE)); break; case PANGO_ATTR_WORD: @@ -903,15 +881,11 @@ attr_for_type (GtkJsonParser *parser, break; case PANGO_ATTR_BASELINE_SHIFT: - if (!parser_get_enum_value (parser, PANGO_TYPE_BASELINE_SHIFT, FALSE, &value, error)) - return NULL; - attr = pango_attr_baseline_shift_new (value); + attr = pango_attr_baseline_shift_new (parser_get_enum_value (parser, PANGO_TYPE_BASELINE_SHIFT, FALSE)); break; case PANGO_ATTR_FONT_SCALE: - if (!parser_get_enum_value (parser, PANGO_TYPE_FONT_SCALE, FALSE, &value, error)) - return NULL; - attr = pango_attr_font_scale_new ((PangoFontScale)value); + attr = pango_attr_font_scale_new ((PangoFontScale)parser_get_enum_value (parser, PANGO_TYPE_FONT_SCALE, FALSE)); break; } @@ -939,24 +913,17 @@ static const char *attr_members[] = { }; static PangoAttribute * -json_to_attribute (GtkJsonParser *parser, - GError **error) +json_to_attribute (GtkJsonParser *parser) { PangoAttribute *attr = NULL; PangoAttrType type = PANGO_ATTR_INVALID; guint start = PANGO_ATTR_INDEX_FROM_TEXT_BEGINNING; guint end = PANGO_ATTR_INDEX_TO_TEXT_END; - if (!gtk_json_parser_start_object (parser)) - { - g_propagate_error (error, g_error_copy (gtk_json_parser_get_error (parser))); - return NULL; - } + gtk_json_parser_start_object (parser); do { - int value; - switch (gtk_json_parser_select_member (parser, attr_members)) { case ATTR_START: @@ -968,13 +935,11 @@ json_to_attribute (GtkJsonParser *parser, break; case ATTR_TYPE: - if (!parser_get_enum_value (parser, PANGO_TYPE_ATTR_TYPE, FALSE, &value, error)) - return NULL; - type = value; + type = parser_get_enum_value (parser, PANGO_TYPE_ATTR_TYPE, FALSE); break; case ATTR_VALUE: - attr = attr_for_type (parser, type, start, end, error); + attr = attr_for_type (parser, type, start, end); break; default: @@ -988,31 +953,21 @@ json_to_attribute (GtkJsonParser *parser, return attr; } -static gboolean -json_parser_fill_attr_list (GtkJsonParser *parser, - PangoAttrList *attributes, - GError **error) +static void +json_parser_fill_attr_list (GtkJsonParser *parser, + PangoAttrList *attributes) { - if (!gtk_json_parser_start_array (parser)) - { - g_propagate_error (error, g_error_copy (gtk_json_parser_get_error (parser))); - return FALSE; - } + gtk_json_parser_start_array (parser); do { - PangoAttribute *attr = json_to_attribute (parser, error); - - if (!attr) - return FALSE; - - pango_attr_list_insert (attributes, attr); + PangoAttribute *attr = json_to_attribute (parser); + if (attr) + pango_attr_list_insert (attributes, attr); } while (gtk_json_parser_next (parser)); gtk_json_parser_end (parser); - - return TRUE; } enum { @@ -1028,18 +983,13 @@ static const char *tab_members[] = { NULL, }; -static gboolean -json_parser_fill_tabs (GtkJsonParser *parser, - PangoTabArray *tabs, - GError **error) +static void +json_parser_fill_tabs (GtkJsonParser *parser, + PangoTabArray *tabs) { int index; - if (!gtk_json_parser_start_array (parser)) - { - g_propagate_error (error, g_error_copy (gtk_json_parser_get_error (parser))); - return FALSE; - } + gtk_json_parser_start_array (parser); index = 0; do @@ -1053,17 +1003,13 @@ json_parser_fill_tabs (GtkJsonParser *parser, gtk_json_parser_start_object (parser); do { - int value; - switch (gtk_json_parser_select_member (parser, tab_members)) { case TAB_POSITION: pos = gtk_json_parser_get_int (parser); break; case TAB_ALIGNMENT: - if (!parser_get_enum_value (parser, PANGO_TYPE_TAB_ALIGN, FALSE, &value, error)) - return FALSE; - align = value; + align = parser_get_enum_value (parser, PANGO_TYPE_TAB_ALIGN, FALSE); break; case TAB_DECIMAL_POINT: ch = gtk_json_parser_get_int (parser); @@ -1088,8 +1034,6 @@ json_parser_fill_tabs (GtkJsonParser *parser, while (gtk_json_parser_next (parser)); gtk_json_parser_end (parser); - - return TRUE; } enum { @@ -1103,16 +1047,11 @@ static const char *tabs_members[] = { NULL }; -static gboolean -json_parser_fill_tab_array (GtkJsonParser *parser, - PangoTabArray *tabs, - GError **error) +static void +json_parser_fill_tab_array (GtkJsonParser *parser, + PangoTabArray *tabs) { - if (!gtk_json_parser_start_object (parser)) - { - g_propagate_error (error, g_error_copy (gtk_json_parser_get_error (parser))); - return FALSE; - } + gtk_json_parser_start_object (parser); do { @@ -1122,8 +1061,7 @@ json_parser_fill_tab_array (GtkJsonParser *parser, pango_tab_array_set_positions_in_pixels (tabs, gtk_json_parser_get_boolean (parser)); break; case TABS_POSITIONS: - if (!json_parser_fill_tabs (parser, tabs, error)) - return FALSE; + json_parser_fill_tabs (parser, tabs); break; default: g_assert_not_reached (); @@ -1132,8 +1070,6 @@ json_parser_fill_tab_array (GtkJsonParser *parser, while (gtk_json_parser_next (parser)); gtk_json_parser_end (parser); - - return TRUE; } enum { @@ -1157,21 +1093,15 @@ static const char *context_members[] = { NULL, }; -static gboolean -json_parser_fill_context (GtkJsonParser *parser, - PangoContext *context, - GError **error) +static void +json_parser_fill_context (GtkJsonParser *parser, + PangoContext *context) { - if (!gtk_json_parser_start_object (parser)) - { - g_propagate_error (error, g_error_copy (gtk_json_parser_get_error (parser))); - return FALSE; - } + gtk_json_parser_start_object (parser); do { char *str; - int value; switch (gtk_json_parser_select_member (parser, context_members)) { @@ -1184,32 +1114,22 @@ json_parser_fill_context (GtkJsonParser *parser, case CONTEXT_FONT: { - PangoFontDescription *desc; - - if (!parser_get_font_description (parser, &desc, error)) - return FALSE; - + PangoFontDescription *desc = parser_get_font_description (parser); pango_context_set_font_description (context, desc); pango_font_description_free (desc); } break; case CONTEXT_BASE_GRAVITY: - if (!parser_get_enum_value (parser, PANGO_TYPE_GRAVITY, FALSE, &value, error)) - return FALSE; - pango_context_set_base_gravity (context, (PangoGravity)value); + pango_context_set_base_gravity (context, (PangoGravity)parser_get_enum_value (parser, PANGO_TYPE_GRAVITY, FALSE)); break; case CONTEXT_GRAVITY_HINT: - if (!parser_get_enum_value (parser, PANGO_TYPE_GRAVITY_HINT, FALSE, &value, error)) - return FALSE; - pango_context_set_gravity_hint (context, (PangoGravityHint)value); + pango_context_set_gravity_hint (context, (PangoGravityHint)parser_get_enum_value (parser, PANGO_TYPE_GRAVITY_HINT, FALSE)); break; case CONTEXT_BASE_DIR: - if (!parser_get_enum_value (parser, PANGO_TYPE_DIRECTION, FALSE, &value, error)) - return FALSE; - pango_context_set_base_dir (context, (PangoDirection)value); + pango_context_set_base_dir (context, (PangoDirection)parser_get_enum_value (parser, PANGO_TYPE_DIRECTION, FALSE)); break; case CONTEXT_ROUND_GLYPH_POSITIONS: @@ -1245,8 +1165,6 @@ json_parser_fill_context (GtkJsonParser *parser, while (gtk_json_parser_next (parser)); gtk_json_parser_end (parser); - - return TRUE; } enum { @@ -1294,31 +1212,22 @@ static const char *layout_members[] = { NULL }; -static gboolean -json_parser_fill_layout (GtkJsonParser *parser, - PangoLayout *layout, - PangoLayoutDeserializeFlags flags, - GError **error) +static void +json_parser_fill_layout (GtkJsonParser *parser, + PangoLayout *layout, + PangoLayoutDeserializeFlags flags) { - if (!gtk_json_parser_start_object (parser)) - { - g_propagate_error (error, g_error_copy (gtk_json_parser_get_error (parser))); - return FALSE; - } + gtk_json_parser_start_object (parser); do { char *str; - int value; switch (gtk_json_parser_select_member (parser, layout_members)) { case LAYOUT_CONTEXT: if (flags & PANGO_LAYOUT_DESERIALIZE_CONTEXT) - { - if (!json_parser_fill_context (parser, pango_layout_get_context (layout), error)) - return FALSE; - } + json_parser_fill_context (parser, pango_layout_get_context (layout)); break; case LAYOUT_COMMENT: @@ -1336,13 +1245,7 @@ json_parser_fill_layout (GtkJsonParser *parser, case LAYOUT_ATTRIBUTES: { PangoAttrList *attributes = pango_attr_list_new (); - - if (!json_parser_fill_attr_list (parser, attributes, error)) - { - pango_attr_list_unref (attributes); - return FALSE; - } - + json_parser_fill_attr_list (parser, attributes); pango_layout_set_attributes (layout, attributes); pango_attr_list_unref (attributes); } @@ -1350,11 +1253,7 @@ json_parser_fill_layout (GtkJsonParser *parser, case LAYOUT_FONT: { - PangoFontDescription *desc; - - if (!parser_get_font_description (parser, &desc, error)) - return FALSE; - + PangoFontDescription *desc = parser_get_font_description (parser);; pango_layout_set_font_description (layout, desc); pango_font_description_free (desc); } @@ -1363,13 +1262,7 @@ json_parser_fill_layout (GtkJsonParser *parser, case LAYOUT_TABS: { PangoTabArray *tabs = pango_tab_array_new (0, FALSE); - - if (!json_parser_fill_tab_array (parser, tabs, error)) - { - pango_tab_array_free (tabs); - return FALSE; - } - + json_parser_fill_tab_array (parser, tabs); pango_layout_set_tabs (layout, tabs); pango_tab_array_free (tabs); } @@ -1392,21 +1285,15 @@ json_parser_fill_layout (GtkJsonParser *parser, break; case LAYOUT_ALIGNMENT: - if (!parser_get_enum_value (parser, PANGO_TYPE_ALIGNMENT, FALSE, &value, error)) - return FALSE; - pango_layout_set_alignment (layout, (PangoAlignment)value); + pango_layout_set_alignment (layout, (PangoAlignment)parser_get_enum_value (parser, PANGO_TYPE_ALIGNMENT, FALSE)); break; case LAYOUT_WRAP: - if (!parser_get_enum_value (parser, PANGO_TYPE_WRAP_MODE, FALSE, &value, error)) - return FALSE; - pango_layout_set_wrap (layout, (PangoWrapMode)value); + pango_layout_set_wrap (layout, (PangoWrapMode)parser_get_enum_value (parser, PANGO_TYPE_WRAP_MODE, FALSE)); break; case LAYOUT_ELLIPSIZE: - if (!parser_get_enum_value (parser, PANGO_TYPE_ELLIPSIZE_MODE, FALSE, &value, error)) - return FALSE; - pango_layout_set_ellipsize (layout, (PangoEllipsizeMode)value); + pango_layout_set_ellipsize (layout, (PangoEllipsizeMode)parser_get_enum_value (parser, PANGO_TYPE_ELLIPSIZE_MODE, FALSE)); break; case LAYOUT_WIDTH: @@ -1439,8 +1326,6 @@ json_parser_fill_layout (GtkJsonParser *parser, while (gtk_json_parser_next (parser)); gtk_json_parser_end (parser); - - return TRUE; } /* }}} */ @@ -1560,11 +1445,12 @@ pango_layout_deserialize (PangoContext *context, layout = pango_layout_new (context); parser = gtk_json_parser_new_for_bytes (bytes); - if (!json_parser_fill_layout (parser, layout, flags, error)) + json_parser_fill_layout (parser, layout, flags); + + if (gtk_json_parser_get_error (parser)) { - gtk_json_parser_free (parser); - g_object_unref (layout); - return NULL; + g_propagate_error (error, g_error_copy (gtk_json_parser_get_error (parser))); + g_clear_object (&layout); } gtk_json_parser_free (parser); -- cgit v1.2.1