|
| 1 | +from enum import Enum |
| 2 | +from sys import stderr |
| 3 | +import sys |
1 | 4 | import lldb |
2 | 5 | import lldb.formatters.Logger |
3 | 6 |
|
@@ -74,6 +77,40 @@ def stdstring_SummaryProvider(valobj, dict): |
74 | 77 | return '"' + strval + '"' |
75 | 78 |
|
76 | 79 |
|
| 80 | +def get_buffer_data(parent): |
| 81 | + map_valobj = parent.valobj.GetChildMemberWithName("__map_") |
| 82 | + map_data = map_valobj.GetChildMemberWithName("__data_") |
| 83 | + if map_data.IsValid(): |
| 84 | + return map_data |
| 85 | + |
| 86 | + return map_valobj |
| 87 | + |
| 88 | + |
| 89 | +def get_buffer_end(buffer, begin): |
| 90 | + map_end = buffer.GetChildMemberWithName("__end_") |
| 91 | + if map_end.IsValid(): |
| 92 | + return map_end.GetValueAsUnsigned(0) |
| 93 | + map_size = buffer.GetChildMemberWithName("__size_").GetValueAsUnsigned(0) |
| 94 | + return begin + map_size |
| 95 | + |
| 96 | + |
| 97 | +def get_buffer_endcap(parent, buffer, begin, has_compressed_pair_layout, is_size_based): |
| 98 | + if has_compressed_pair_layout: |
| 99 | + map_endcap = parent._get_value_of_compressed_pair( |
| 100 | + buffer.GetChildMemberWithName("__end_cap_") |
| 101 | + ) |
| 102 | + else: |
| 103 | + map_endcap = buffer.GetChildMemberWithName("__cap_") |
| 104 | + if not map_endcap.IsValid(): |
| 105 | + map_endcap = buffer.GetChildMemberWithName("__end_cap_") |
| 106 | + map_endcap = map_endcap.GetValueAsUnsigned(0) |
| 107 | + |
| 108 | + if is_size_based: |
| 109 | + return begin + map_endcap |
| 110 | + |
| 111 | + return map_endcap |
| 112 | + |
| 113 | + |
77 | 114 | class stdvector_SynthProvider: |
78 | 115 | def __init__(self, valobj, dict): |
79 | 116 | logger = lldb.formatters.Logger.Logger() |
@@ -755,23 +792,16 @@ def update(self): |
755 | 792 | if self.block_size < 0: |
756 | 793 | logger.write("block_size < 0") |
757 | 794 | return |
758 | | - map_ = self.valobj.GetChildMemberWithName("__map_") |
759 | 795 | start = self.valobj.GetChildMemberWithName("__start_").GetValueAsUnsigned(0) |
| 796 | + |
| 797 | + map_ = get_buffer_data(self) |
| 798 | + is_size_based = map_.GetChildMemberWithName("__size_").IsValid() |
760 | 799 | first = map_.GetChildMemberWithName("__first_") |
761 | 800 | map_first = first.GetValueAsUnsigned(0) |
762 | 801 | self.map_begin = map_.GetChildMemberWithName("__begin_") |
763 | 802 | map_begin = self.map_begin.GetValueAsUnsigned(0) |
764 | | - map_end = map_.GetChildMemberWithName("__end_").GetValueAsUnsigned(0) |
765 | | - |
766 | | - if has_compressed_pair_layout: |
767 | | - map_endcap = self._get_value_of_compressed_pair( |
768 | | - map_.GetChildMemberWithName("__end_cap_") |
769 | | - ) |
770 | | - else: |
771 | | - map_endcap = map_.GetChildMemberWithName("__cap_") |
772 | | - if not map_endcap.IsValid(): |
773 | | - map_endcap = map_.GetChildMemberWithName("__end_cap_") |
774 | | - map_endcap = map_endcap.GetValueAsUnsigned(0) |
| 803 | + map_end = get_buffer_end(map_, map_begin) |
| 804 | + map_endcap = get_buffer_endcap(self, map_, map_begin, has_compressed_pair_layout, is_size_based) |
775 | 805 |
|
776 | 806 | # check consistency |
777 | 807 | if not map_first <= map_begin <= map_end <= map_endcap: |
|
0 commit comments