add share option to pop_pack() (#2176)

as a solution for #2164
This commit is contained in:
Michiharu Ariza 2020-02-16 08:38:41 -08:00 committed by GitHub
parent 9c6499d9f4
commit 39fb57c0e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 6 deletions

View File

@ -195,7 +195,12 @@ struct hb_serialize_context_t
obj->fini ();
object_pool.free (obj);
}
objidx_t pop_pack ()
/* Set share to false when an object is unlikely sharable with others
* so not worth an attempt, or a contiguous table is serialized as
* multiple consecutive objects in the reverse order so can't be shared.
*/
objidx_t pop_pack (bool share=true)
{
object_t *obj = current;
if (unlikely (!obj)) return 0;
@ -211,12 +216,16 @@ struct hb_serialize_context_t
return 0;
}
objidx_t objidx = packed_map.get (obj);
objidx_t objidx;
if (share)
{
objidx = packed_map.get (obj);
if (objidx)
{
obj->fini ();
return objidx;
}
}
tail -= len;
memmove (tail, obj->head, len);
@ -231,7 +240,7 @@ struct hb_serialize_context_t
objidx = packed.length - 1;
packed_map.set (obj, objidx);
if (share) packed_map.set (obj, objidx);
return objidx;
}