struct link_t
{
- bool wide: 1;
+ bool is_wide: 1;
unsigned position : 31;
objidx_t objidx;
};
objidx = packed.length - 1;
+ if (0) // XXX
packed_map.set (key, objidx);
return objidx;
}
template <typename T>
- void add_link (T &ofs, objidx_t objidx, const void *base)
+ void add_link (T &ofs, objidx_t objidx, const void *base = nullptr)
{
+ static_assert (sizeof (T) == 2 || sizeof (T) == 4, "");
+
+ if (unlikely (!objidx))
+ return;
+
+ unsigned i = current.length - 1;
+ if (!base)
+ base = current[i].head;
+ else
+ {
+ while (i && base < current[i].head)
+ i--;
+ assert (base == current[i].head);
+ }
+
+ auto& link = *current[i].links.push ();
+ link.is_wide = sizeof (T) == 4;
+ link.position = (const char *) &ofs - (const char *) base;
+ link.objidx = objidx;
}
void link ()
const object_t &child = packed[link.objidx];
unsigned offset = child.head - parent.head;
- if (link.wide)
+ if (link.is_wide)
{
auto &off = * ((BEInt<uint32_t, 4> *) (parent.head + offset));
off = offset;