mirror of
https://github.com/JakeHillion/object-introspection.git
synced 2024-09-19 19:19:05 +01:00
b117150f83
Summary: tbv2: add dynamic context passed through all functions Previously for we had some shared state between all requests, noticeably the pointers set. This change adds a by reference value to all requests which can hold additional mutable state. The pointers set is moved into this mutable state for OIL, which means each concurrent request will have its own pointer set. Doing things this way allows more features to be added in the future without such a big code modification. Closes https://github.com/facebookexperimental/object-introspection/issues/404 Pull Request resolved: https://github.com/facebookexperimental/object-introspection/pull/410 Test Plan: - CI Differential Revision: D51394035 Pulled By: JakeHillion fbshipit-source-id: 55d2ba9b5e056148a29dc821020cfc3d94e5175a
132 lines
4.1 KiB
TOML
132 lines
4.1 KiB
TOML
[info]
|
|
type_name = "std::multimap"
|
|
stub_template_params = [2,3]
|
|
ctype = "MULTI_MAP_TYPE"
|
|
header = "map"
|
|
|
|
# Old:
|
|
typeName = "std::multimap"
|
|
ns = ["namespace std"]
|
|
numTemplateParams = 2
|
|
replaceTemplateParamIndex = [2]
|
|
allocatorIndex = 3
|
|
|
|
[codegen]
|
|
decl = """
|
|
template<class Key, class T, class Compare, class Allocator>
|
|
void getSizeType(const %1%<Key,T,Compare,Allocator> &container, size_t& returnArg);
|
|
"""
|
|
|
|
func = """
|
|
template<class Key, class T, class Compare, class Allocator>
|
|
void getSizeType(const %1%<Key,T,Compare,Allocator> &container, size_t& returnArg)
|
|
{
|
|
SAVE_SIZE(sizeof(%1%<Key,T,Compare,Allocator>));
|
|
|
|
SAVE_DATA((uintptr_t)container.size());
|
|
|
|
for (auto const& it : container)
|
|
{
|
|
getSizeType(it.first, returnArg);
|
|
getSizeType(it.second, returnArg);
|
|
}
|
|
}
|
|
"""
|
|
|
|
traversal_func = """
|
|
auto tail = returnArg
|
|
.write((uintptr_t)&container)
|
|
.write(container.size());
|
|
|
|
for (const auto &entry: container) {
|
|
tail = tail.delegate([&ctx, &key = entry.first, &value = entry.second](auto ret) {
|
|
auto next = ret.delegate([&ctx, &key](typename TypeHandler<Ctx, T0>::type ret) {
|
|
return OIInternal::getSizeType<Ctx>(ctx, key, ret);
|
|
});
|
|
return OIInternal::getSizeType<Ctx>(ctx, value, next);
|
|
});
|
|
}
|
|
|
|
return tail.finish();
|
|
"""
|
|
|
|
[[codegen.processor]]
|
|
type = "types::st::VarInt<DB>"
|
|
func = "el.pointer = std::get<ParsedData::VarInt>(d.val).value;"
|
|
|
|
[[codegen.processor]]
|
|
type = """
|
|
types::st::List<DB, types::st::Pair<DB,
|
|
typename TypeHandler<Ctx, T0>::type,
|
|
typename TypeHandler<Ctx, T1>::type>>
|
|
"""
|
|
func = """
|
|
#ifdef __GLIBCXX__
|
|
/* We don't have access to the _Rb_tree_node struct, so we manually re-create it
|
|
* to get the effective size of a multimap entry. Is there a better way to do this?
|
|
*
|
|
* https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00716_source.html#l00216
|
|
* From the source of <bits/stl_tree.h>, an _Rb_tree_node has the following members:
|
|
*/
|
|
struct OI_Rb_tree_node {
|
|
using _Rb_tree_color = int; // enum
|
|
using _Base_ptr = std::nullptr_t; // pointer
|
|
using _value_type = std::pair<const T0, T1>; // from https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00695_source.html#l00104
|
|
|
|
_Rb_tree_color _M_color; // from parent _Rb_tree_node_base
|
|
_Base_ptr _M_parent; // from parent _Rb_tree_node_base
|
|
_Base_ptr _M_left; // from parent _Rb_tree_node_base
|
|
_Base_ptr _M_right; // from parent _Rb_tree_node_base
|
|
_value_type _M_value;
|
|
};
|
|
|
|
static constexpr size_t element_size = sizeof(OI_Rb_tree_node);
|
|
#elif _LIBCPP_VERSION
|
|
static_assert(false && "libc++ is currently not supported");
|
|
|
|
/* We don't have access to the __tree_node struct, so we manually re-create it
|
|
* to get the effective size of a multimap entry. Is there a better way to do this?
|
|
*
|
|
* https://github.com/llvm/llvm-project/blob/1b10920164695a487669405223f8bbe93799430c/libcxx/include/__tree#L729-L781
|
|
* From the source of <__tree>, a __tree_node has the following members:
|
|
*/
|
|
struct OI__tree_node {
|
|
using pointer = std::nullptr_t; // pointer
|
|
using __parent_pointer = std::nullptr_t; // pointer
|
|
using _value_pair = std::pair<const T0, T1>; // from https://github.com/llvm/llvm-project/blob/main/libcxx/include/map#L1864
|
|
|
|
pointer __left_; // from parent __tree_end_node
|
|
pointer __right_; // from parent __tree_node_base
|
|
__parent_pointer __parent_; // from parent __tree_node_base
|
|
bool __is_black_; // from parent __tree_node_base
|
|
_value_type __value_;
|
|
};
|
|
|
|
static constexpr size_t element_size = sizeof(OI__tree_node);
|
|
#else
|
|
static_assert(false && "No known element_size for sets. See types/multi_map_type.toml");
|
|
#endif
|
|
|
|
static constexpr std::array<inst::Field, 2> elementFields{
|
|
make_field<Ctx, T0>("key"),
|
|
make_field<Ctx, T1>("value"),
|
|
};
|
|
static constexpr auto element = inst::Field {
|
|
element_size,
|
|
element_size - sizeof(T0) - sizeof(T1),
|
|
"[]",
|
|
std::array<std::string_view, 0>{},
|
|
elementFields,
|
|
std::array<inst::ProcessorInst, 0>{},
|
|
};
|
|
|
|
auto list = std::get<ParsedData::List>(d.val);
|
|
el.container_stats.emplace(result::Element::ContainerStats {
|
|
.capacity = list.length,
|
|
.length = list.length,
|
|
});
|
|
|
|
for (size_t i = 0; i < list.length; i++)
|
|
stack_ins(element);
|
|
"""
|