diff options
author | Christian Hergert <chergert@redhat.com> | 2017-11-12 19:34:46 -0800 |
---|---|---|
committer | Christian Hergert <chergert@redhat.com> | 2017-11-12 20:04:06 -0800 |
commit | b654130bd7d392dec5b4775991e59ac0f0990ff2 (patch) | |
tree | 4ee61d38a22e2d58d4441105445632ef22d24450 | |
parent | d46c072c4d5469226fef756e77e097b2adbc71bc (diff) | |
download | gtk+-b654130bd7d392dec5b4775991e59ac0f0990ff2.tar.gz |
css: avoid copying resource data
To avoid copying data from gresources to the heap, we can use
the newly added gtk_file_load_bytes(). That function will check
for resource:// URIs and access their internal data directly.
Other URI schemes will read the contents into memory and return
a GBytes as normal.
https://bugzilla.gnome.org/show_bug.cgi?id=790270
-rw-r--r-- | gtk/gtkcssprovider.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index fecbace374..aedbf1f67c 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -44,6 +44,7 @@ #include "gtkmarshalers.h" #include "gtkprivate.h" #include "gtkintl.h" +#include "gtkutilsprivate.h" #include "gtkversion.h" /** @@ -1722,9 +1723,9 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider, const char *text, GError **error) { + GBytes *free_bytes = NULL; GtkCssScanner *scanner; gulong error_handler; - char *free_data = NULL; if (error) error_handler = g_signal_connect (css_provider, @@ -1738,11 +1739,11 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider, { GError *load_error = NULL; - if (g_file_load_contents (file, NULL, - &free_data, NULL, - NULL, &load_error)) + free_bytes = gtk_file_load_bytes (file, NULL, &load_error); + + if (free_bytes != NULL) { - text = free_data; + text = g_bytes_get_data (free_bytes, NULL); } else { @@ -1791,7 +1792,7 @@ gtk_css_provider_load_internal (GtkCssProvider *css_provider, gtk_css_provider_postprocess (css_provider); } - g_free (free_data); + g_bytes_unref (free_bytes); if (error) { |