From 313b3057c335da6baa4cd447bac95812992413b9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 30 Mar 2019 19:46:35 -0700 Subject: [PATCH] [serializer] Implement dedup! --- src/hb-serialize.hh | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index d8e1e2fb..4de87d82 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -83,6 +83,12 @@ struct hb_serialize_context_t this->end = this->start + size; reset (); } + ~hb_serialize_context_t () + { + current.fini_deep (); + packed.fini_deep (); + packed_map.fini (); + } bool in_error () const { return !this->successful; } @@ -158,8 +164,15 @@ struct hb_serialize_context_t objidx_t pop_pack () { object_t obj = current.pop (); + obj.tail = head; + unsigned len = obj.tail - obj.head; - unsigned len = head - obj.head; + objidx_t objidx = packed_map.get (&obj); + if (objidx) + { + obj.fini (); + return objidx; + } tail -= len; memmove (tail, obj.head, len); @@ -177,7 +190,7 @@ struct hb_serialize_context_t if (unlikely (packed.in_error ())) return 0; - objidx_t objidx = packed.length - 1; + objidx = packed.length - 1; packed_map.set (key, objidx); @@ -305,7 +318,6 @@ struct hb_serialize_context_t private: /* Stack of currently under construction objects. */ - /* Note. We store the "end - tail" distance in the length member of these. */ hb_vector_t current; /* Stack of packed objects. Object 0 is always nil object. */ -- GitLab