object-introspection/types/folly_iobuf_type.toml
Jake Hillion 5a2ca8b059 tbv2: implement folly::IOBuf
folly::IOBuf does not have TreeBuilder v2 container support. Add it.

The implementation is a direct clone of v1. It still lacks tests.

Test Plan:
- It codegens on a prod type.
- No runtime testing... Bad form, I know.
- Issue created to add integration tests: https://github.com/facebookexperimental/object-introspection/issues/436
2023-12-20 16:13:50 +00:00

73 lines
2.1 KiB
TOML

[info]
type_name = "folly::IOBuf"
ctype = "FOLLY_IOBUF_TYPE"
header = "folly/io/IOBuf.h"
# Old:
typeName = "folly::IOBuf"
matcher = "^folly::IOBuf$"
ns = ["folly::IOBuf"]
numTemplateParams = 0
replaceTemplateParamIndex = []
[codegen]
decl = """
void getSizeType(const %1% &container, size_t& returnArg);
"""
func = """
void getSizeType(const %1% &container, size_t& returnArg)
{
SAVE_SIZE(sizeof(%1%));
// 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();
}
SAVE_DATA(fullCapacity);
SAVE_DATA(fullLength);
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<DB>"
func = """
el.container_stats.emplace(result::Element::ContainerStats{ .capacity = std::get<ParsedData::VarInt>(d.val).value });
el.exclusive_size += el.container_stats->capacity;
"""
[[codegen.processor]]
type = "types::st::VarInt<DB>"
func = """
el.container_stats->length = std::get<ParsedData::VarInt>(d.val).value;
"""