Writing a data formatter for LLDB

Hi,

I would like to write a data formatter for LLDB, for a class which is very close to std::array. Here it is:

template <typename T, int n>
class StaticArray {
private:
T data_[n];
}

I wrote the following data formatter adapted from my own “std::vector” data formatter but I still have blanks to fill :

class StaticArrayProvider:
def init(self, valobj, internal_dict):
self.valobj = valobj
self.data = self.valobj.GetChildMemberWithName(‘data_’).GetChildAtIndex(0)
self.data_type = self.data.GetType()
self.type_size = self.data_type.GetByteSize()
self.size = #???

def num_children(self):
return self.size

def get_child_index(self, name):
try:
return int(name.lstrip(‘[’).rstrip(‘]’))
except:
return -1

def get_child_at_index(self, index):
if index < 0:
return None
if index >= self.num_children():
return None
try:
return #???
except:
return None

Could you please give me a hand to fill those blanks?

François Fayard
Founder & Consultant - +33 (0)6 01 44 06 93
Inside Loop - Scaling up Computational Science
Paris - 38 rue Desbordes-Valmore, 75116 Paris
Lyon/Grenoble - 34 route de Four, 38090 Vaulx-Milieu

Hi,

I would like to write a data formatter for LLDB, for a class which is very close to std::array. Here it is:

template <typename T, int n>
class StaticArray {
private:
T data_[n];
}

I wrote the following data formatter adapted from my own “std::vector” data formatter but I still have blanks to fill :

class StaticArrayProvider:
def init(self, valobj, internal_dict):
self.valobj = valobj
self.data = self.valobj.GetChildMemberWithName(‘data_’).GetChildAtIndex(0)

This is wrong, just remove the “.GetChildAtIndex(0)” from the above line otherwise “self.data” has a reference to the first value in the data_ array.

self.data_type = self.data.GetType()
self.type_size = self.data_type.GetByteSize()

Don’t need the above two lines.

self.size = #???

Since “data_” is an array, it can already be displayed as is. With this data formatter you are just trying to avoid showing “data_” as an extra level in the variable, so you can just forward all queries to “self.data”.

def num_children(self):
return self.size

Just forward all queries to ‘data_’:
def num_children(self):
return self.data.GetNumChildren()

def get_child_index(self, name):
try:
return int(name.lstrip(‘[’).rstrip(‘]’))
except:
return -1

def get_child_index(self, name):

return self.data.etChildMemberWithName(name)

def get_child_at_index(self, index):
if index < 0:
return None
if index >= self.num_children():
return None
try:
return #???
except:
return None

def get_child_at_index(self, index):
return self.data.etChildMemberAtIndex(index)