Files
clang-p2996/lldb/test/API/functionalities/data-formatter/synthcapping/fooSynthProvider.py
Pavel Labath 763b96c86d [lldb] Avoid (unlimited) GetNumChildren calls when printing values (#93946)
For some data formatters, even getting the number of children can be an
expensive operations (e.g., needing to walk a linked list to determine
the number of elements). This is then wasted work when we know we will
be printing only small number of them.

This patch replaces the calls to GetNumChildren (at least those on the
"frame var" path) with the calls to the capped version, passing the
value of `max-children-count` setting (plus one)
2024-06-03 10:34:44 +02:00

40 lines
1.2 KiB
Python

import lldb
class fooSynthProvider:
# For testing purposes, we'll keep track of the maximum value of
# max_num_children we've been called with.
MAX_NUM_CHILDREN_MAX = 0
@classmethod
def reset_max_num_children_max(cls):
old_value = fooSynthProvider.MAX_NUM_CHILDREN_MAX
fooSynthProvider.MAX_NUM_CHILDREN_MAX = 0
return old_value
def __init__(self, valobj, dict):
self.valobj = valobj
self.int_type = valobj.GetType().GetBasicType(lldb.eBasicTypeInt)
def num_children(self, max_num_children):
fooSynthProvider.MAX_NUM_CHILDREN_MAX = max(
fooSynthProvider.MAX_NUM_CHILDREN_MAX, max_num_children
)
return 3
def get_child_at_index(self, index):
if index == 0:
child = self.valobj.GetChildMemberWithName("a")
if index == 1:
child = self.valobj.CreateChildAtOffset("fake_a", 1, self.int_type)
if index == 2:
child = self.valobj.GetChildMemberWithName("r")
return child
def get_child_index(self, name):
if name == "a":
return 0
if name == "fake_a":
return 1
return 2