diff --git a/types/folly_iobuf_type.toml b/types/folly_iobuf_type.toml index c7e1043..6b88d5c 100644 --- a/types/folly_iobuf_type.toml +++ b/types/folly_iobuf_type.toml @@ -39,3 +39,34 @@ void getSizeType(const %1% &container, size_t& returnArg) SAVE_SIZE(fullCapacity); } """ + +traversal_func = """ +// We calculate the length of all IOBufs in the chain manually. +// IOBuf has built-in computeChainCapacity()/computeChainLength() +// functions which do this for us. But dead code optimization in TAO +// caused these functions to be removed which causes relocation +// errors. + +std::size_t fullLength = container.length(); +std::size_t fullCapacity = container.capacity(); +for (const folly::IOBuf* current = container.next(); current != &container; + current = current->next()) { + fullLength += current->length(); + fullCapacity += current->capacity(); +} + +return returnArg.write(fullCapacity).write(fullLength); +""" + +[[codegen.processor]] +type = "types::st::VarInt" +func = """ +el.container_stats.emplace(result::Element::ContainerStats{ .capacity = std::get(d.val).value }); +el.exclusive_size += el.container_stats->capacity; +""" + +[[codegen.processor]] +type = "types::st::VarInt" +func = """ +el.container_stats->length = std::get(d.val).value; +"""