Make sure we make progress in OOM situations
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 @@
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 @@
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 @@
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 @@
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++;
}