summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2017-11-12 19:34:46 -0800
committerChristian Hergert <chergert@redhat.com>2017-11-12 20:04:06 -0800
commitb654130bd7d392dec5b4775991e59ac0f0990ff2 (patch)
tree4ee61d38a22e2d58d4441105445632ef22d24450
parentd46c072c4d5469226fef756e77e097b2adbc71bc (diff)
downloadgtk+-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.c13
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)
{