1//===-- SWIG Interface for SBValue ------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9namespace lldb {
10
11%feature("docstring",
12"Represents the value of a variable, a register, or an expression.
13
14SBValue supports iteration through its child, which in turn is represented
15as an SBValue.  For example, we can get the general purpose registers of a
16frame as an SBValue, and iterate through all the registers,::
17
18    registerSet = frame.registers # Returns an SBValueList.
19    for regs in registerSet:
20        if 'general purpose registers' in regs.name.lower():
21            GPRs = regs
22            break
23
24    print('%s (number of children = %d):' % (GPRs.name, GPRs.num_children))
25    for reg in GPRs:
26        print('Name: ', reg.name, ' Value: ', reg.value)
27
28produces the output: ::
29
30    General Purpose Registers (number of children = 21):
31    Name:  rax  Value:  0x0000000100000c5c
32    Name:  rbx  Value:  0x0000000000000000
33    Name:  rcx  Value:  0x00007fff5fbffec0
34    Name:  rdx  Value:  0x00007fff5fbffeb8
35    Name:  rdi  Value:  0x0000000000000001
36    Name:  rsi  Value:  0x00007fff5fbffea8
37    Name:  rbp  Value:  0x00007fff5fbffe80
38    Name:  rsp  Value:  0x00007fff5fbffe60
39    Name:  r8  Value:  0x0000000008668682
40    Name:  r9  Value:  0x0000000000000000
41    Name:  r10  Value:  0x0000000000001200
42    Name:  r11  Value:  0x0000000000000206
43    Name:  r12  Value:  0x0000000000000000
44    Name:  r13  Value:  0x0000000000000000
45    Name:  r14  Value:  0x0000000000000000
46    Name:  r15  Value:  0x0000000000000000
47    Name:  rip  Value:  0x0000000100000dae
48    Name:  rflags  Value:  0x0000000000000206
49    Name:  cs  Value:  0x0000000000000027
50    Name:  fs  Value:  0x0000000000000010
51    Name:  gs  Value:  0x0000000000000048
52
53See also linked_list_iter() for another perspective on how to iterate through an
54SBValue instance which interprets the value object as representing the head of a
55linked list."
56) SBValue;
57class SBValue
58{
59public:
60    SBValue ();
61
62    SBValue (const SBValue &rhs);
63
64    ~SBValue ();
65
66    bool
67    IsValid();
68
69    explicit operator bool() const;
70
71    void
72    Clear();
73
74    SBError
75    GetError();
76
77    lldb::user_id_t
78    GetID ();
79
80    const char *
81    GetName();
82
83    const char *
84    GetTypeName ();
85
86    const char *
87    GetDisplayTypeName ();
88
89    size_t
90    GetByteSize ();
91
92    bool
93    IsInScope ();
94
95    lldb::Format
96    GetFormat ();
97
98    void
99    SetFormat (lldb::Format format);
100
101    const char *
102    GetValue ();
103
104    int64_t
105    GetValueAsSigned(SBError& error, int64_t fail_value=0);
106
107    uint64_t
108    GetValueAsUnsigned(SBError& error, uint64_t fail_value=0);
109
110    int64_t
111    GetValueAsSigned(int64_t fail_value=0);
112
113    uint64_t
114    GetValueAsUnsigned(uint64_t fail_value=0);
115
116    ValueType
117    GetValueType ();
118
119    bool
120    GetValueDidChange ();
121
122    const char *
123    GetSummary ();
124
125    const char *
126    GetSummary (lldb::SBStream& stream,
127                lldb::SBTypeSummaryOptions& options);
128
129    const char *
130    GetObjectDescription ();
131
132    lldb::SBValue
133    GetDynamicValue (lldb::DynamicValueType use_dynamic);
134
135    lldb::SBValue
136    GetStaticValue ();
137
138    lldb::SBValue
139    GetNonSyntheticValue ();
140
141    lldb::DynamicValueType
142    GetPreferDynamicValue ();
143
144    void
145    SetPreferDynamicValue (lldb::DynamicValueType use_dynamic);
146
147    bool
148    GetPreferSyntheticValue ();
149
150    void
151    SetPreferSyntheticValue (bool use_synthetic);
152
153    bool
154    IsDynamic();
155
156    bool
157    IsSynthetic ();
158
159    bool
160    IsSyntheticChildrenGenerated ();
161
162    void
163    SetSyntheticChildrenGenerated (bool);
164
165    const char *
166    GetLocation ();
167
168    bool
169    SetValueFromCString (const char *value_str);
170
171    bool
172    SetValueFromCString (const char *value_str, lldb::SBError& error);
173
174    lldb::SBTypeFormat
175    GetTypeFormat ();
176
177    lldb::SBTypeSummary
178    GetTypeSummary ();
179
180    lldb::SBTypeFilter
181    GetTypeFilter ();
182
183    lldb::SBTypeSynthetic
184    GetTypeSynthetic ();
185
186    lldb::SBValue
187    GetChildAtIndex (uint32_t idx);
188
189    %feature("docstring", "
190    Get a child value by index from a value.
191
192    Structs, unions, classes, arrays and pointers have child
193    values that can be access by index.
194
195    Structs and unions access child members using a zero based index
196    for each child member. For
197
198    Classes reserve the first indexes for base classes that have
199    members (empty base classes are omitted), and all members of the
200    current class will then follow the base classes.
201
202    Pointers differ depending on what they point to. If the pointer
203    points to a simple type, the child at index zero
204    is the only child value available, unless synthetic_allowed
205    is true, in which case the pointer will be used as an array
206    and can create 'synthetic' child values using positive or
207    negative indexes. If the pointer points to an aggregate type
208    (an array, class, union, struct), then the pointee is
209    transparently skipped and any children are going to be the indexes
210    of the child values within the aggregate type. For example if
211    we have a 'Point' type and we have a SBValue that contains a
212    pointer to a 'Point' type, then the child at index zero will be
213    the 'x' member, and the child at index 1 will be the 'y' member
214    (the child at index zero won't be a 'Point' instance).
215
216    If you actually need an SBValue that represents the type pointed
217    to by a SBValue for which GetType().IsPointeeType() returns true,
218    regardless of the pointee type, you can do that with the SBValue.Dereference
219    method (or the equivalent deref property).
220
221    Arrays have a preset number of children that can be accessed by
222    index and will returns invalid child values for indexes that are
223    out of bounds unless the synthetic_allowed is true. In this
224    case the array can create 'synthetic' child values for indexes
225    that aren't in the array bounds using positive or negative
226    indexes.
227
228    @param[in] idx
229        The index of the child value to get
230
231    @param[in] use_dynamic
232        An enumeration that specifies whether to get dynamic values,
233        and also if the target can be run to figure out the dynamic
234        type of the child value.
235
236    @param[in] synthetic_allowed
237        If true, then allow child values to be created by index
238        for pointers and arrays for indexes that normally wouldn't
239        be allowed.
240
241    @return
242        A new SBValue object that represents the child member value.") GetChildAtIndex;
243    lldb::SBValue
244    GetChildAtIndex (uint32_t idx,
245                     lldb::DynamicValueType use_dynamic,
246                     bool can_create_synthetic);
247
248    lldb::SBValue
249    CreateChildAtOffset (const char *name, uint32_t offset, lldb::SBType type);
250
251    lldb::SBValue
252    SBValue::Cast (lldb::SBType type);
253
254    lldb::SBValue
255    CreateValueFromExpression (const char *name, const char* expression);
256
257    lldb::SBValue
258    CreateValueFromExpression (const char *name, const char* expression, SBExpressionOptions &options);
259
260    lldb::SBValue
261    CreateValueFromAddress(const char* name, lldb::addr_t address, lldb::SBType type);
262
263  lldb::SBValue
264  CreateValueFromData (const char* name,
265                       lldb::SBData data,
266                       lldb::SBType type);
267
268    lldb::SBType
269    GetType();
270
271    %feature("docstring", "
272    Returns the child member index.
273
274    Matches children of this object only and will match base classes and
275    member names if this is a clang typed object.
276
277    @param[in] name
278        The name of the child value to get
279
280    @return
281        An index to the child member value.") GetIndexOfChildWithName;
282    uint32_t
283    GetIndexOfChildWithName (const char *name);
284
285    lldb::SBValue
286    GetChildMemberWithName (const char *name);
287
288    %feature("docstring", "
289    Returns the child member value.
290
291    Matches child members of this object and child members of any base
292    classes.
293
294    @param[in] name
295        The name of the child value to get
296
297    @param[in] use_dynamic
298        An enumeration that specifies whether to get dynamic values,
299        and also if the target can be run to figure out the dynamic
300        type of the child value.
301
302    @return
303        A new SBValue object that represents the child member value.") GetChildMemberWithName;
304    lldb::SBValue
305    GetChildMemberWithName (const char *name, lldb::DynamicValueType use_dynamic);
306
307    %feature("docstring", "Expands nested expressions like .a->b[0].c[1]->d."
308    ) GetValueForExpressionPath;
309    lldb::SBValue
310    GetValueForExpressionPath(const char* expr_path);
311
312    lldb::SBDeclaration
313    GetDeclaration ();
314
315    bool
316    MightHaveChildren ();
317
318    bool
319    IsRuntimeSupportValue ();
320
321    uint32_t
322    GetNumChildren ();
323
324    %feature("doctstring", "
325    Returns the number for children.
326
327    @param[in] max
328        If max is less the lldb.UINT32_MAX, then the returned value is
329        capped to max.
330
331    @return
332        An integer value capped to the argument max.") GetNumChildren;
333    uint32_t
334    GetNumChildren (uint32_t max);
335
336    void *
337    GetOpaqueType();
338
339    lldb::SBValue
340    Dereference ();
341
342    lldb::SBValue
343    AddressOf();
344
345    bool
346    TypeIsPointerType ();
347
348    lldb::SBTarget
349    GetTarget();
350
351    lldb::SBProcess
352    GetProcess();
353
354    lldb::SBThread
355    GetThread();
356
357    lldb::SBFrame
358    GetFrame();
359
360    %feature("docstring", "
361    Find and watch a variable.
362    It returns an SBWatchpoint, which may be invalid.") Watch;
363    lldb::SBWatchpoint
364    Watch (bool resolve_location, bool read, bool write, SBError &error);
365
366    %feature("docstring", "
367    Find and watch the location pointed to by a variable.
368    It returns an SBWatchpoint, which may be invalid.") WatchPointee;
369    lldb::SBWatchpoint
370    WatchPointee (bool resolve_location, bool read, bool write, SBError &error);
371
372    bool
373    GetDescription (lldb::SBStream &description);
374
375    bool
376    GetExpressionPath (lldb::SBStream &description);
377
378  %feature("docstring", "
379    Get an SBData wrapping what this SBValue points to.
380
381    This method will dereference the current SBValue, if its
382    data type is a ``T\*`` or ``T[]``, and extract ``item_count`` elements
383    of type ``T`` from it, copying their contents in an :py:class:`SBData`.
384
385    :param item_idx: The index of the first item to retrieve. For an array
386        this is equivalent to array[item_idx], for a pointer
387        to ``\*(pointer + item_idx)``. In either case, the measurement
388        unit for item_idx is the ``sizeof(T)`` rather than the byte
389    :param item_count: How many items should be copied into the output. By default
390        only one item is copied, but more can be asked for.
391    :return: The contents of the copied items on success. An empty :py:class:`SBData` otherwise.
392    :rtype: SBData
393    ") GetPointeeData;
394  lldb::SBData
395  GetPointeeData (uint32_t item_idx = 0,
396          uint32_t item_count = 1);
397
398    %feature("docstring", "
399    Get an SBData wrapping the contents of this SBValue.
400
401    This method will read the contents of this object in memory
402    and copy them into an SBData for future use.
403
404    @return
405        An SBData with the contents of this SBValue, on success.
406        An empty SBData otherwise.") GetData;
407    lldb::SBData
408    GetData ();
409
410    bool
411    SetData (lldb::SBData &data, lldb::SBError& error);
412
413    lldb::SBValue
414    Clone(const char *new_name);
415
416  lldb::addr_t
417  GetLoadAddress();
418
419  lldb::SBAddress
420  GetAddress();
421
422    lldb::SBValue
423    Persist ();
424
425    %feature("docstring", "Returns an expression path for this value."
426    ) GetExpressionPath;
427    bool
428    GetExpressionPath (lldb::SBStream &description, bool qualify_cxx_base_classes);
429
430    lldb::SBValue
431    EvaluateExpression(const char *expr) const;
432
433    lldb::SBValue
434    EvaluateExpression(const char *expr,
435                       const SBExpressionOptions &options) const;
436
437    lldb::SBValue
438    EvaluateExpression(const char *expr,
439                       const SBExpressionOptions &options,
440                       const char *name) const;
441
442    STRING_EXTENSION(SBValue)
443
444#ifdef SWIGPYTHON
445    %pythoncode %{
446        def __get_dynamic__ (self):
447            '''Helper function for the "SBValue.dynamic" property.'''
448            return self.GetDynamicValue (eDynamicCanRunTarget)
449
450        class children_access(object):
451            '''A helper object that will lazily hand out thread for a process when supplied an index.'''
452
453            def __init__(self, sbvalue):
454                self.sbvalue = sbvalue
455
456            def __len__(self):
457                if self.sbvalue:
458                    return int(self.sbvalue.GetNumChildren())
459                return 0
460
461            def __getitem__(self, key):
462                if type(key) is int and key < len(self):
463                    return self.sbvalue.GetChildAtIndex(key)
464                return None
465
466        def get_child_access_object(self):
467            '''An accessor function that returns a children_access() object which allows lazy member variable access from a lldb.SBValue object.'''
468            return self.children_access (self)
469
470        def get_value_child_list(self):
471            '''An accessor function that returns a list() that contains all children in a lldb.SBValue object.'''
472            children = []
473            accessor = self.get_child_access_object()
474            for idx in range(len(accessor)):
475                children.append(accessor[idx])
476            return children
477
478        def __iter__(self):
479            '''Iterate over all child values of a lldb.SBValue object.'''
480            return lldb_iter(self, 'GetNumChildren', 'GetChildAtIndex')
481
482        def __len__(self):
483            '''Return the number of child values of a lldb.SBValue object.'''
484            return self.GetNumChildren()
485
486        children = property(get_value_child_list, None, doc='''A read only property that returns a list() of lldb.SBValue objects for the children of the value.''')
487        child = property(get_child_access_object, None, doc='''A read only property that returns an object that can access children of a variable by index (child_value = value.children[12]).''')
488        name = property(GetName, None, doc='''A read only property that returns the name of this value as a string.''')
489        type = property(GetType, None, doc='''A read only property that returns a lldb.SBType object that represents the type for this value.''')
490        size = property(GetByteSize, None, doc='''A read only property that returns the size in bytes of this value.''')
491        is_in_scope = property(IsInScope, None, doc='''A read only property that returns a boolean value that indicates whether this value is currently lexically in scope.''')
492        format = property(GetName, SetFormat, doc='''A read/write property that gets/sets the format used for lldb.SBValue().GetValue() for this value. See enumerations that start with "lldb.eFormat".''')
493        value = property(GetValue, SetValueFromCString, doc='''A read/write property that gets/sets value from a string.''')
494        value_type = property(GetValueType, None, doc='''A read only property that returns an lldb enumeration value (see enumerations that start with "lldb.eValueType") that represents the type of this value (local, argument, global, register, etc.).''')
495        changed = property(GetValueDidChange, None, doc='''A read only property that returns a boolean value that indicates if this value has changed since it was last updated.''')
496        data = property(GetData, None, doc='''A read only property that returns an lldb object (lldb.SBData) that represents the bytes that make up the value for this object.''')
497        load_addr = property(GetLoadAddress, None, doc='''A read only property that returns the load address of this value as an integer.''')
498        addr = property(GetAddress, None, doc='''A read only property that returns an lldb.SBAddress that represents the address of this value if it is in memory.''')
499        deref = property(Dereference, None, doc='''A read only property that returns an lldb.SBValue that is created by dereferencing this value.''')
500        address_of = property(AddressOf, None, doc='''A read only property that returns an lldb.SBValue that represents the address-of this value.''')
501        error = property(GetError, None, doc='''A read only property that returns the lldb.SBError that represents the error from the last time the variable value was calculated.''')
502        summary = property(GetSummary, None, doc='''A read only property that returns the summary for this value as a string''')
503        description = property(GetObjectDescription, None, doc='''A read only property that returns the language-specific description of this value as a string''')
504        dynamic = property(__get_dynamic__, None, doc='''A read only property that returns an lldb.SBValue that is created by finding the dynamic type of this value.''')
505        location = property(GetLocation, None, doc='''A read only property that returns the location of this value as a string.''')
506        target = property(GetTarget, None, doc='''A read only property that returns the lldb.SBTarget that this value is associated with.''')
507        process = property(GetProcess, None, doc='''A read only property that returns the lldb.SBProcess that this value is associated with, the returned value might be invalid and should be tested.''')
508        thread = property(GetThread, None, doc='''A read only property that returns the lldb.SBThread that this value is associated with, the returned value might be invalid and should be tested.''')
509        frame = property(GetFrame, None, doc='''A read only property that returns the lldb.SBFrame that this value is associated with, the returned value might be invalid and should be tested.''')
510        num_children = property(GetNumChildren, None, doc='''A read only property that returns the number of child lldb.SBValues that this value has.''')
511        unsigned = property(GetValueAsUnsigned, None, doc='''A read only property that returns the value of this SBValue as an usigned integer.''')
512        signed = property(GetValueAsSigned, None, doc='''A read only property that returns the value of this SBValue as a signed integer.''')
513
514        def get_expr_path(self):
515            s = SBStream()
516            self.GetExpressionPath (s)
517            return s.GetData()
518
519        path = property(get_expr_path, None, doc='''A read only property that returns the expression path that one can use to reach this value in an expression.''')
520
521        def synthetic_child_from_expression(self, name, expr, options=None):
522            if options is None: options = lldb.SBExpressionOptions()
523            child = self.CreateValueFromExpression(name, expr, options)
524            child.SetSyntheticChildrenGenerated(True)
525            return child
526
527        def synthetic_child_from_data(self, name, data, type):
528            child = self.CreateValueFromData(name, data, type)
529            child.SetSyntheticChildrenGenerated(True)
530            return child
531
532        def synthetic_child_from_address(self, name, addr, type):
533            child = self.CreateValueFromAddress(name, addr, type)
534            child.SetSyntheticChildrenGenerated(True)
535            return child
536
537        def __eol_test(val):
538            """Default function for end of list test takes an SBValue object.
539
540            Return True if val is invalid or it corresponds to a null pointer.
541            Otherwise, return False.
542            """
543            if not val or val.GetValueAsUnsigned() == 0:
544                return True
545            else:
546                return False
547
548        # ==================================================
549        # Iterator for lldb.SBValue treated as a linked list
550        # ==================================================
551        def linked_list_iter(self, next_item_name, end_of_list_test=__eol_test):
552            """Generator adaptor to support iteration for SBValue as a linked list.
553
554            linked_list_iter() is a special purpose iterator to treat the SBValue as
555            the head of a list data structure, where you specify the child member
556            name which points to the next item on the list and you specify the
557            end-of-list test function which takes an SBValue for an item and returns
558            True if EOL is reached and False if not.
559
560            linked_list_iter() also detects infinite loop and bails out early.
561
562            The end_of_list_test arg, if omitted, defaults to the __eol_test
563            function above.
564
565            For example,
566
567            # Get Frame #0.
568            ...
569
570            # Get variable 'task_head'.
571            task_head = frame0.FindVariable('task_head')
572            ...
573
574            for t in task_head.linked_list_iter('next'):
575                print t
576            """
577            if end_of_list_test(self):
578                return
579            item = self
580            visited = set()
581            try:
582                while not end_of_list_test(item) and not item.GetValueAsUnsigned() in visited:
583                    visited.add(item.GetValueAsUnsigned())
584                    yield item
585                    # Prepare for the next iteration.
586                    item = item.GetChildMemberWithName(next_item_name)
587            except:
588                # Exception occurred.  Stop the generator.
589                pass
590
591            return
592    %}
593#endif
594
595};
596
597} // namespace lldb
598