[HarfBuzz] harfbuzz: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Fri Nov 6 00:09:57 PST 2015


 src/hb-buffer-private.hh |    7 ++-----
 src/hb-buffer.cc         |   31 +++++++++++++++++++++++--------
 2 files changed, 25 insertions(+), 13 deletions(-)

New commits:
commit 68b507a3c3c62c28c38e13fee733702bb703b6ca
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Nov 6 00:09:26 2015 -0800

    Make sure we make progress in OOM situations

diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh
index ecebb3e..0ffb60d 100644
--- a/src/hb-buffer-private.hh
+++ b/src/hb-buffer-private.hh
@@ -175,15 +175,12 @@ struct hb_buffer_t {
     {
       if (unlikely (out_info != info || out_len != idx)) {
 	if (unlikely (!make_room_for (1, 1)))
-	{
-	  idx++; // So we don't hang indefinitely...
-	  return;
-	}
+	  goto done;
 	out_info[out_len] = info[idx];
       }
       out_len++;
     }
-
+  done:
     idx++;
   }
 
diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc
index 5c71734..7e7dcea 100644
--- a/src/hb-buffer.cc
+++ b/src/hb-buffer.cc
@@ -324,7 +324,9 @@ hb_buffer_t::replace_glyphs (unsigned int num_in,
 			     unsigned int num_out,
 			     const uint32_t *glyph_data)
 {
-  if (unlikely (!make_room_for (num_in, num_out))) return;
+  if (unlikely (!make_room_for (num_in, num_out)))
+    goto done;
+  {
 
   merge_clusters (idx, idx + num_in);
 
@@ -337,39 +339,50 @@ hb_buffer_t::replace_glyphs (unsigned int num_in,
     pinfo++;
   }
 
-  idx  += num_in;
   out_len += num_out;
+  }
+done:
+  idx  += num_in;
 }
 
 void
 hb_buffer_t::output_glyph (hb_codepoint_t glyph_index)
 {
-  if (unlikely (!make_room_for (0, 1))) return;
+  if (unlikely (!make_room_for (0, 1)))
+    goto done;
 
   out_info[out_len] = info[idx];
   out_info[out_len].codepoint = glyph_index;
 
   out_len++;
+done:
+  ;
 }
 
 void
 hb_buffer_t::output_info (const hb_glyph_info_t &glyph_info)
 {
-  if (unlikely (!make_room_for (0, 1))) return;
+  if (unlikely (!make_room_for (0, 1)))
+    goto done;
 
   out_info[out_len] = glyph_info;
 
   out_len++;
+done:
+  ;
 }
 
 void
 hb_buffer_t::copy_glyph (void)
 {
-  if (unlikely (!make_room_for (0, 1))) return;
+  if (unlikely (!make_room_for (0, 1)))
+    goto done;
 
   out_info[out_len] = info[idx];
 
   out_len++;
+done:
+  ;
 }
 
 bool
@@ -387,7 +400,7 @@ hb_buffer_t::move_to (unsigned int i)
   if (out_len < i)
   {
     unsigned int count = i - out_len;
-    if (unlikely (!make_room_for (count, count))) return false;
+    if (unlikely (!make_room_for (count, count))) return false; // XXX verify bailout
 
     memmove (out_info + out_len, info + idx, count * sizeof (out_info[0]));
     idx += count;
@@ -414,13 +427,15 @@ void
 hb_buffer_t::replace_glyph (hb_codepoint_t glyph_index)
 {
   if (unlikely (out_info != info || out_len != idx)) {
-    if (unlikely (!make_room_for (1, 1))) return;
+    if (unlikely (!make_room_for (1, 1)))
+      goto out;
     out_info[out_len] = info[idx];
   }
   out_info[out_len].codepoint = glyph_index;
 
-  idx++;
   out_len++;
+out:
+  idx++;
 }
 
 


More information about the HarfBuzz mailing list