xref: /freebsd/contrib/llvm-project/lldb/bindings/interface/SBTargetExtensions.i (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 #ifdef SWIGPYTHON
2 %typemap(in) (const char **symbol_name, uint32_t num_names) {
3   using namespace lldb_private;
4   /* Check if is a list  */
5   if (PythonList::Check($input)) {
6     PythonList list(PyRefType::Borrowed, $input);
7     $2 = list.GetSize();
8     int i = 0;
9     $1 = (char**)malloc(($2+1)*sizeof(char*));
10     for (i = 0; i < $2; i++) {
11       PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
12       if (!py_str.IsAllocated()) {
13         PyErr_SetString(PyExc_TypeError,"list must contain strings and blubby");
14         free($1);
15         return nullptr;
16       }
17 
18       $1[i] = const_cast<char*>(py_str.GetString().data());
19     }
20     $1[i] = 0;
21   } else if ($input == Py_None) {
22     $1 =  NULL;
23   } else {
24     PyErr_SetString(PyExc_TypeError,"not a list");
25     return NULL;
26   }
27 }
28 #endif
29 
30 STRING_EXTENSION_LEVEL_OUTSIDE(SBTarget, lldb::eDescriptionLevelBrief)
31 
32 %extend lldb::SBTarget {
33 #ifdef SWIGPYTHON
34     %pythoncode %{
35         # operator== is a free function, which swig does not handle, so we inject
36         # our own equality operator here
37         def __eq__(self, other):
38             return not self.__ne__(other)
39 
40         class modules_access(object):
41             '''A helper object that will lazily hand out lldb.SBModule objects for a target when supplied an index, or by full or partial path.'''
42             def __init__(self, sbtarget):
43                 self.sbtarget = sbtarget
44 
45             def __len__(self):
46                 if self.sbtarget:
47                     return int(self.sbtarget.GetNumModules())
48                 return 0
49 
50             def __getitem__(self, key):
51                 num_modules = self.sbtarget.GetNumModules()
52                 if type(key) is int:
53                     if -num_modules <= key < num_modules:
54                         key %= num_modules
55                         return self.sbtarget.GetModuleAtIndex(key)
56                 elif type(key) is str:
57                     if key.find('/') == -1:
58                         for idx in range(num_modules):
59                             module = self.sbtarget.GetModuleAtIndex(idx)
60                             if module.file.basename == key:
61                                 return module
62                     else:
63                         for idx in range(num_modules):
64                             module = self.sbtarget.GetModuleAtIndex(idx)
65                             if module.file.fullpath == key:
66                                 return module
67                     # See if the string is a UUID
68                     try:
69                         the_uuid = uuid.UUID(key)
70                         if the_uuid:
71                             for idx in range(num_modules):
72                                 module = self.sbtarget.GetModuleAtIndex(idx)
73                                 if module.uuid == the_uuid:
74                                     return module
75                     except:
76                         return None
77                 elif type(key) is uuid.UUID:
78                     for idx in range(num_modules):
79                         module = self.sbtarget.GetModuleAtIndex(idx)
80                         if module.uuid == key:
81                             return module
82                 elif type(key) is re.SRE_Pattern:
83                     matching_modules = []
84                     for idx in range(num_modules):
85                         module = self.sbtarget.GetModuleAtIndex(idx)
86                         re_match = key.search(module.path.fullpath)
87                         if re_match:
88                             matching_modules.append(module)
89                     return matching_modules
90                 else:
91                     print("error: unsupported item type: %s" % type(key))
92                 return None
93 
94         def get_modules_access_object(self):
95             '''An accessor function that returns a modules_access() object which allows lazy module access from a lldb.SBTarget object.'''
96             return self.modules_access(self)
97 
98         def get_modules_array(self):
99             '''An accessor function that returns a list() that contains all modules in a lldb.SBTarget object.'''
100             modules = []
101             for idx in range(self.GetNumModules()):
102                 modules.append(self.GetModuleAtIndex(idx))
103             return modules
104 
105         def module_iter(self):
106             '''Returns an iterator over all modules in a lldb.SBTarget
107             object.'''
108             return lldb_iter(self, 'GetNumModules', 'GetModuleAtIndex')
109 
110         def breakpoint_iter(self):
111             '''Returns an iterator over all breakpoints in a lldb.SBTarget
112             object.'''
113             return lldb_iter(self, 'GetNumBreakpoints', 'GetBreakpointAtIndex')
114 
115         class bkpts_access(object):
116             '''A helper object that will lazily hand out bkpts for a target when supplied an index.'''
117             def __init__(self, sbtarget):
118                 self.sbtarget = sbtarget
119 
120             def __len__(self):
121                 if self.sbtarget:
122                     return int(self.sbtarget.GetNumBreakpoints())
123                 return 0
124 
125             def __getitem__(self, key):
126                 if isinstance(key, int):
127                     count = len(self)
128                     if -count <= key < count:
129                         key %= count
130                         return self.sbtarget.GetBreakpointAtIndex(key)
131                 return None
132 
133         def get_bkpts_access_object(self):
134             '''An accessor function that returns a bkpts_access() object which allows lazy bkpt access from a lldb.SBtarget object.'''
135             return self.bkpts_access(self)
136 
137         def get_target_bkpts(self):
138             '''An accessor function that returns a list() that contains all bkpts in a lldb.SBtarget object.'''
139             bkpts = []
140             for idx in range(self.GetNumBreakpoints()):
141                 bkpts.append(self.GetBreakpointAtIndex(idx))
142             return bkpts
143 
144         def watchpoint_iter(self):
145             '''Returns an iterator over all watchpoints in a lldb.SBTarget
146             object.'''
147             return lldb_iter(self, 'GetNumWatchpoints', 'GetWatchpointAtIndex')
148 
149         class watchpoints_access(object):
150             '''A helper object that will lazily hand out watchpoints for a target when supplied an index.'''
151             def __init__(self, sbtarget):
152                 self.sbtarget = sbtarget
153 
154             def __len__(self):
155                 if self.sbtarget:
156                     return int(self.sbtarget.GetNumWatchpoints())
157                 return 0
158 
159             def __getitem__(self, key):
160                 if isinstance(key, int):
161                     count = len(self)
162                     if -count <= key < count:
163                         key %= count
164                         return self.sbtarget.GetWatchpointAtIndex(key)
165                 return None
166 
167         def get_watchpoints_access_object(self):
168             '''An accessor function that returns a watchpoints_access() object which allows lazy watchpoint access from a lldb.SBtarget object.'''
169             return self.watchpoints_access(self)
170 
171         def get_target_watchpoints(self):
172             '''An accessor function that returns a list() that contains all watchpoints in a lldb.SBtarget object.'''
173             watchpoints = []
174             for idx in range(self.GetNumWatchpoints()):
175                 watchpoints.append(self.GetWatchpointAtIndex(idx))
176             return watchpoints
177 
178         modules = property(get_modules_array, None, doc='''A read only property that returns a list() of lldb.SBModule objects contained in this target. This list is a list all modules that the target currently is tracking (the main executable and all dependent shared libraries).''')
179         module = property(get_modules_access_object, None, doc=r'''A read only property that returns an object that implements python operator overloading with the square brackets().\n    target.module[<int>] allows array access to any modules.\n    target.module[<str>] allows access to modules by basename, full path, or uuid string value.\n    target.module[uuid.UUID()] allows module access by UUID.\n    target.module[re] allows module access using a regular expression that matches the module full path.''')
180         process = property(GetProcess, None, doc='''A read only property that returns an lldb object that represents the process (lldb.SBProcess) that this target owns.''')
181         executable = property(GetExecutable, None, doc='''A read only property that returns an lldb object that represents the main executable module (lldb.SBModule) for this target.''')
182         debugger = property(GetDebugger, None, doc='''A read only property that returns an lldb object that represents the debugger (lldb.SBDebugger) that owns this target.''')
183         num_breakpoints = property(GetNumBreakpoints, None, doc='''A read only property that returns the number of breakpoints that this target has as an integer.''')
184         breakpoints = property(get_target_bkpts, None, doc='''A read only property that returns a list() of lldb.SBBreakpoint objects for all breakpoints in this target.''')
185         breakpoint = property(get_bkpts_access_object, None, doc='''A read only property that returns an object that can be used to access breakpoints as an array ("bkpt_12 = lldb.target.bkpt[12]").''')
186         num_watchpoints = property(GetNumWatchpoints, None, doc='''A read only property that returns the number of watchpoints that this target has as an integer.''')
187         watchpoints = property(get_target_watchpoints, None, doc='''A read only property that returns a list() of lldb.SBwatchpoint objects for all watchpoints in this target.''')
188         watchpoint = property(get_watchpoints_access_object, None, doc='''A read only property that returns an object that can be used to access watchpoints as an array ("watchpoint_12 = lldb.target.watchpoint[12]").''')
189         broadcaster = property(GetBroadcaster, None, doc='''A read only property that an lldb object that represents the broadcaster (lldb.SBBroadcaster) for this target.''')
190         byte_order = property(GetByteOrder, None, doc='''A read only property that returns an lldb enumeration value (lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid) that represents the byte order for this target.''')
191         addr_size = property(GetAddressByteSize, None, doc='''A read only property that returns the size in bytes of an address for this target.''')
192         triple = property(GetTriple, None, doc='''A read only property that returns the target triple (arch-vendor-os) for this target as a string.''')
193         data_byte_size = property(GetDataByteSize, None, doc='''A read only property that returns the size in host bytes of a byte in the data address space for this target.''')
194         code_byte_size = property(GetCodeByteSize, None, doc='''A read only property that returns the size in host bytes of a byte in the code address space for this target.''')
195         platform = property(GetPlatform, None, doc='''A read only property that returns the platform associated with with this target.''')
196     %}
197 #endif
198 }
199