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; }
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);
if (unlikely (packed.in_error ()))
return 0;
- objidx_t objidx = packed.length - 1;
+ objidx = packed.length - 1;
packed_map.set (key, objidx);
private:
/* Stack of currently under construction objects. */
- /* Note. We store the "end - tail" distance in the length member of these. */
hb_vector_t<object_t> current;
/* Stack of packed objects. Object 0 is always nil object. */