File indexing completed on 2025-09-17 08:34:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef BOOST_JSON_DETAIL_GDB_PRINTERS_HPP
0013 #define BOOST_JSON_DETAIL_GDB_PRINTERS_HPP
0014
0015 #if defined(__ELF__)
0016
0017 #if defined(__clang__)
0018 # pragma clang diagnostic push
0019 # pragma clang diagnostic ignored "-Woverlength-strings"
0020 #elif defined(__GNUC__)
0021 # pragma GCC diagnostic push
0022 # pragma GCC diagnostic ignored "-Woverlength-strings"
0023 #endif
0024
0025 __asm__(
0026 ".pushsection \".debug_gdb_scripts\", \"MS\",%progbits,1\n"
0027 ".ascii \"\\4gdb.inlined-script.BOOST_JSON_DETAIL_GDB_PRINTERS_HPP\\n\"\n"
0028 ".ascii \"import gdb\\n\"\n"
0029 ".ascii \"import gdb.printing\\n\"\n"
0030
0031
0032 ".ascii \"class PrettyPrinterBuilder():\\n\"\n"
0033 ".ascii \" '''decorator that accumulates pretty printers for types'''\\n\"\n"
0034
0035 ".ascii \" def __init__(self, name=None):\\n\"\n"
0036 ".ascii \" self.result = gdb.printing.RegexpCollectionPrettyPrinter(\\n\"\n"
0037 ".ascii \" name or 'Boost.JSON')\\n\"\n"
0038
0039 ".ascii \" def __call__(self, pp=None, ns=None, template=False):\\n\"\n"
0040 ".ascii \" if pp is None:\\n\"\n"
0041 ".ascii \" def decorator(pp):\\n\"\n"
0042 ".ascii \" return self(pp, ns=ns, template=template)\\n\"\n"
0043 ".ascii \" return decorator\\n\"\n"
0044
0045 ".ascii \" typename = getattr(pp, '__name__')\\n\"\n"
0046 ".ascii \" ns = ns or 'boost::json'\\n\"\n"
0047 ".ascii \" self.result.add_printer(\\n\"\n"
0048 ".ascii \" typename,\\n\"\n"
0049 ".ascii \" '^{ns}::{typename}{marker}'.format(\\n\"\n"
0050 ".ascii \" ns=ns,\\n\"\n"
0051 ".ascii \" typename=typename,\\n\"\n"
0052 ".ascii \" marker='<'if template else '$'),\\n\"\n"
0053 ".ascii \" pp)\\n\"\n"
0054 ".ascii \" return pp\\n\"\n"
0055
0056 ".ascii \"pretty_printer = PrettyPrinterBuilder()\\n\"\n"
0057
0058
0059 ".ascii \"class static_property:\\n\"\n"
0060 ".ascii \" '''decorator for lazy evaluation of static members'''\\n\"\n"
0061
0062 ".ascii \" def __init__(self, wrapped):\\n\"\n"
0063 ".ascii \" self.wrapped = wrapped\\n\"\n"
0064 ".ascii \" self.__name__ = wrapped.__name__\\n\"\n"
0065 ".ascii \" self.__doc__ = wrapped.__doc__\\n\"\n"
0066
0067 ".ascii \" def __get__(self, inst, objtype=None):\\n\"\n"
0068 ".ascii \" val = self.wrapped()\\n\"\n"
0069 ".ascii \" if objtype is not None:\\n\"\n"
0070 ".ascii \" setattr(objtype, self.wrapped.__name__, val)\\n\"\n"
0071 ".ascii \" return val\\n\"\n"
0072
0073
0074 ".ascii \"@pretty_printer\\n\"\n"
0075 ".ascii \"class storage_ptr:\\n\"\n"
0076 ".ascii \" '''boost::json::storage_ptr pretty printer'''\\n\"\n"
0077
0078 ".ascii \" @static_property\\n\"\n"
0079 ".ascii \" def _size_t():\\n\"\n"
0080 ".ascii \" return gdb.lookup_type('std::size_t')\\n\"\n"
0081
0082 ".ascii \" @static_property\\n\"\n"
0083 ".ascii \" def _shared_resource_ptr():\\n\"\n"
0084 ".ascii \" return gdb.lookup_type(\\n\"\n"
0085 ".ascii \" 'boost::json::detail::shared_resource').pointer()\\n\"\n"
0086
0087 ".ascii \" @static_property\\n\"\n"
0088 ".ascii \" def _memory_resource_ptr():\\n\"\n"
0089 ".ascii \" return gdb.lookup_type(\\n\"\n"
0090 ".ascii \" 'boost::container::pmr::memory_resource').pointer()\\n\"\n"
0091
0092 ".ascii \" def __init__(self, val):\\n\"\n"
0093 ".ascii \" self.val = val['i_']\\n\"\n"
0094
0095 ".ascii \" def to_string(self):\\n\"\n"
0096 ".ascii \" items = []\\n\"\n"
0097
0098 ".ascii \" if bool(self.val & 2):\\n\"\n"
0099 ".ascii \" items.append('trivial')\\n\"\n"
0100 ".ascii \" shared = bool(self.val & 1)\\n\"\n"
0101 ".ascii \" if shared:\\n\"\n"
0102 ".ascii \" items.append('shared')\\n\"\n"
0103
0104 ".ascii \" pointer = self.val & ~3\\n\"\n"
0105 ".ascii \" if not pointer:\\n\"\n"
0106 ".ascii \" items.append('resource=default')\\n\"\n"
0107 ".ascii \" else:\\n\"\n"
0108 ".ascii \" if shared:\\n\"\n"
0109 ".ascii \" resource = pointer.cast(\\n\"\n"
0110 ".ascii \" self._shared_resource_ptr).dereference()\\n\"\n"
0111 ".ascii \" impl_t = resource.dynamic_type\\n\"\n"
0112 ".ascii \" impl_ptr = impl_t.pointer()\\n\"\n"
0113 ".ascii \" resource = resource.address.cast(impl_ptr).dereference()\\n\"\n"
0114
0115 ".ascii \" items.append(\\n\"\n"
0116 ".ascii \" 'refs=%s' % resource['refs'].cast(self._size_t))\\n\"\n"
0117
0118 ".ascii \" resource = resource['t']\\n\"\n"
0119 ".ascii \" else:\\n\"\n"
0120 ".ascii \" resource = pointer.cast(\\n\"\n"
0121 ".ascii \" self._memory_resource_ptr).dereference()\\n\"\n"
0122
0123
0124 ".ascii \" derived_t = resource.dynamic_type\\n\"\n"
0125 ".ascii \" derived_ptr = derived_t.pointer()\\n\"\n"
0126 ".ascii \" resource = resource.address.cast(derived_ptr).dereference()\\n\"\n"
0127 ".ascii \" items.append('resource=%s' % resource)\\n\"\n"
0128
0129 ".ascii \" return 'storage_ptr [' + ', '.join(items) + ']'\\n\"\n"
0130
0131
0132 ".ascii \"@pretty_printer\\n\"\n"
0133 ".ascii \"class monotonic_resource:\\n\"\n"
0134 ".ascii \" '''boost::json::monotonic_resource pretty printer'''\\n\"\n"
0135
0136 ".ascii \" def __init__(self, val):\\n\"\n"
0137 ".ascii \" self.val = val\\n\"\n"
0138
0139 ".ascii \" def to_string(self):\\n\"\n"
0140 ".ascii \" buffer = self.val['buffer_']\\n\"\n"
0141 ".ascii \" buffer = buffer['p'] - ( int(buffer['size']) - int(buffer['avail']) )\\n\"\n"
0142
0143 ".ascii \" head = self.val['head_'].dereference()\\n\"\n"
0144
0145 ".ascii \" block = head['p'] - ( int(head['size']) - int(head['avail']) )\\n\"\n"
0146
0147 ".ascii \" upstream = self.val['upstream_']\\n\"\n"
0148
0149 ".ascii \" items = []\\n\"\n"
0150 ".ascii \" items.append('buffer=%s' % buffer)\\n\"\n"
0151 ".ascii \" items.append('block=%s' % block)\\n\"\n"
0152 ".ascii \" items.append('head=%s' % head['p'])\\n\"\n"
0153 ".ascii \" items.append('free=%s' % head['avail'])\\n\"\n"
0154 ".ascii \" if upstream['i_'] != 0:\\n\"\n"
0155 ".ascii \" items.append('upstream=%s' % upstream)\\n\"\n"
0156
0157 ".ascii \" return 'monotonic_resource [%s]' % ', '.join(items)\\n\"\n"
0158
0159
0160 ".ascii \"@pretty_printer\\n\"\n"
0161 ".ascii \"class static_resource:\\n\"\n"
0162 ".ascii \" '''boost::json::static_resource pretty printer'''\\n\"\n"
0163
0164 ".ascii \" def __init__(self, val):\\n\"\n"
0165 ".ascii \" self.val = val\\n\"\n"
0166
0167 ".ascii \" def to_string(self):\\n\"\n"
0168 ".ascii \" buf = self.val['p_'] - ( int(self.val['size_']) - int(self.val['n_']) )\\n\"\n"
0169 ".ascii \" return 'static_resource [buffer=%s, head=%s, free=%s]' % (\\n\"\n"
0170 ".ascii \" buf, self.val['p_'], self.val['n_'])\\n\"\n"
0171
0172
0173 ".ascii \"@pretty_printer\\n\"\n"
0174 ".ascii \"class string:\\n\"\n"
0175 ".ascii \" '''boost::json::string pretty printer'''\\n\"\n"
0176
0177 ".ascii \" @static_property\\n\"\n"
0178 ".ascii \" def _char_const_ptr():\\n\"\n"
0179 ".ascii \" return gdb.lookup_type('char').const().pointer()\\n\"\n"
0180
0181 ".ascii \" def __init__(self, val):\\n\"\n"
0182 ".ascii \" self.impl = val['impl_']\\n\"\n"
0183
0184 ".ascii \" def display_hint(self):\\n\"\n"
0185 ".ascii \" return 'string'\\n\"\n"
0186
0187 ".ascii \" def to_string(self):\\n\"\n"
0188 ".ascii \" kind = self.impl['s_']['k']\\n\"\n"
0189 ".ascii \" if kind == self.impl['short_string_']:\\n\"\n"
0190 ".ascii \" sbo_size = self.impl['sbo_chars_']\\n\"\n"
0191 ".ascii \" size = sbo_size - self.impl['s_']['buf'][sbo_size]\\n\"\n"
0192 ".ascii \" pointer = self.impl['s_']['buf']\\n\"\n"
0193 ".ascii \" elif kind == self.impl['key_string_']:\\n\"\n"
0194 ".ascii \" size = self.impl['k_']['n']\\n\"\n"
0195 ".ascii \" pointer = self.impl['k_']['s']\\n\"\n"
0196 ".ascii \" else:\\n\"\n"
0197 ".ascii \" size = self.impl['p_']['t'].dereference()['size']\\n\"\n"
0198 ".ascii \" pointer = self.impl['p_']['t']\\n\"\n"
0199 ".ascii \" pointer += 1\\n\"\n"
0200 ".ascii \" pointer = pointer.cast(self._char_const_ptr)\\n\"\n"
0201 ".ascii \" return pointer.lazy_string(length=size)\\n\"\n"
0202
0203
0204 ".ascii \"@pretty_printer\\n\"\n"
0205 ".ascii \"class array:\\n\"\n"
0206 ".ascii \" '''boost::json::array pretty printer'''\\n\"\n"
0207
0208 ".ascii \" @static_property\\n\"\n"
0209 ".ascii \" def _value_ptr():\\n\"\n"
0210 ".ascii \" return gdb.lookup_type('boost::json::value').pointer()\\n\"\n"
0211
0212 ".ascii \" def __init__(self, val):\\n\"\n"
0213 ".ascii \" self.val = val\\n\"\n"
0214
0215 ".ascii \" def display_hint(self):\\n\"\n"
0216 ".ascii \" return 'array'\\n\"\n"
0217
0218 ".ascii \" def to_string(self):\\n\"\n"
0219 ".ascii \" capacity = int(self.val['t_'].dereference()['capacity'])\\n\"\n"
0220 ".ascii \" return 'array [size={0}, capacity={1}]'.format(\\n\"\n"
0221 ".ascii \" self.num_children(), capacity)\\n\"\n"
0222
0223 ".ascii \" def num_children(self):\\n\"\n"
0224 ".ascii \" return int(self.val['t_'].dereference()['size'])\\n\"\n"
0225
0226 ".ascii \" def children(self):\\n\"\n"
0227 ".ascii \" for i in range(0, self.num_children()):\\n\"\n"
0228 ".ascii \" yield self.child(i)\\n\"\n"
0229
0230 ".ascii \" def child(self, n):\\n\"\n"
0231 ".ascii \" table = (self.val['t_'] + 1).cast(self._value_ptr)\\n\"\n"
0232 ".ascii \" return str(n), table[n]\\n\"\n"
0233
0234
0235 ".ascii \"@pretty_printer\\n\"\n"
0236 ".ascii \"class key_value_pair:\\n\"\n"
0237 ".ascii \" '''boost::json::key_value_pair pretty printer'''\\n\"\n"
0238
0239 ".ascii \" @staticmethod\\n\"\n"
0240 ".ascii \" def _pair(kv):\\n\"\n"
0241 ".ascii \" return kv['key_'].lazy_string(length=kv['len_']), kv['value_']\\n\"\n"
0242
0243 ".ascii \" def __init__(self, val):\\n\"\n"
0244 ".ascii \" self.val = val\\n\"\n"
0245
0246 ".ascii \" def to_string(self):\\n\"\n"
0247 ".ascii \" k, v = self._pair(self.val)\\n\"\n"
0248 ".ascii \" return '[%s] = %s' % (k.value(), v)\\n\"\n"
0249
0250
0251 ".ascii \"@pretty_printer\\n\"\n"
0252 ".ascii \"class object:\\n\"\n"
0253 ".ascii \" '''boost::json::object pretty printer'''\\n\"\n"
0254
0255 ".ascii \" def __init__(self, val):\\n\"\n"
0256 ".ascii \" self.val = val\\n\"\n"
0257 ".ascii \" self.kv_ptr = gdb.lookup_type('boost::json::key_value_pair').pointer()\\n\"\n"
0258
0259 ".ascii \" def display_hint(self):\\n\"\n"
0260 ".ascii \" return 'map'\\n\"\n"
0261
0262 ".ascii \" def to_string(self):\\n\"\n"
0263 ".ascii \" capacity = int(self.val['t_'].dereference()['capacity'])\\n\"\n"
0264 ".ascii \" return 'object [size={}, capacity={}]'.format(\\n\"\n"
0265 ".ascii \" self.num_children(), capacity)\\n\"\n"
0266
0267 ".ascii \" def num_children(self):\\n\"\n"
0268 ".ascii \" return int(self.val['t_'].dereference()['size'])\\n\"\n"
0269
0270 ".ascii \" def children(self):\\n\"\n"
0271 ".ascii \" table = (self.val['t_'] + 1).cast(self.kv_ptr)\\n\"\n"
0272 ".ascii \" for i in range(0, self.num_children()):\\n\"\n"
0273 ".ascii \" k, v = key_value_pair._pair(table[i])\\n\"\n"
0274 ".ascii \" yield str(2 * i), k\\n\"\n"
0275 ".ascii \" yield str(2 * i + 1), v\\n\"\n"
0276
0277
0278 ".ascii \"@pretty_printer\\n\"\n"
0279 ".ascii \"class value:\\n\"\n"
0280 ".ascii \" '''boost::json::value pretty printer'''\\n\"\n"
0281
0282 ".ascii \" @static_property\\n\"\n"
0283 ".ascii \" def _kind_t():\\n\"\n"
0284 ".ascii \" result = gdb.lookup_type('boost::json::kind')\\n\"\n"
0285 ".ascii \" return dict(result.items())\\n\"\n"
0286
0287 ".ascii \" def __init__(self, val):\\n\"\n"
0288 ".ascii \" self.val = val\\n\"\n"
0289
0290 ".ascii \" def to_string(self):\\n\"\n"
0291 ".ascii \" kind = self.val['sca_']['k']\\n\"\n"
0292
0293 ".ascii \" if self._compare_kind(kind, 'null'):\\n\"\n"
0294 ".ascii \" return 'null'\\n\"\n"
0295
0296 ".ascii \" elif self._compare_kind(kind, 'bool_'):\\n\"\n"
0297 ".ascii \" return self.val['sca_']['b']\\n\"\n"
0298
0299 ".ascii \" elif self._compare_kind(kind, 'int64'):\\n\"\n"
0300 ".ascii \" return self.val['sca_']['i']\\n\"\n"
0301
0302 ".ascii \" elif self._compare_kind(kind, 'uint64'):\\n\"\n"
0303 ".ascii \" return self.val['sca_']['u']\\n\"\n"
0304
0305 ".ascii \" elif self._compare_kind(kind, 'double_'):\\n\"\n"
0306 ".ascii \" return self.val['sca_']['d']\\n\"\n"
0307
0308 ".ascii \" elif self._compare_kind(kind, 'array'):\\n\"\n"
0309 ".ascii \" return self.val['arr_']\\n\"\n"
0310
0311 ".ascii \" elif self._compare_kind(kind, 'object'):\\n\"\n"
0312 ".ascii \" return self.val['obj_']\\n\"\n"
0313
0314 ".ascii \" else:\\n\"\n"
0315 ".ascii \" return self.val['str_']\\n\"\n"
0316
0317 ".ascii \" def _compare_kind(self, kind, name):\\n\"\n"
0318 ".ascii \" return kind == self._kind_t['boost::json::kind::' + name].enumval\\n\"\n"
0319
0320
0321 ".ascii \"def register(obj_file):\\n\"\n"
0322 ".ascii \" mod = obj_file or gdb\\n\"\n"
0323 ".ascii \" for printer in getattr(mod, 'pretty_printers', []):\\n\"\n"
0324 ".ascii \" if getattr(printer, 'name') == pretty_printer.result.name:\\n\"\n"
0325 ".ascii \" return\\n\"\n"
0326
0327 ".ascii \" gdb.printing.register_pretty_printer(\\n\"\n"
0328 ".ascii \" obj_file,\\n\"\n"
0329 ".ascii \" pretty_printer.result)\\n\"\n"
0330
0331
0332 ".ascii \"if __name__ == '__main__':\\n\"\n"
0333 ".ascii \" register(gdb.current_objfile())\\n\"\n"
0334 ".byte 0\n"
0335 ".popsection\n");
0336 #if defined(__clang__)
0337 # pragma clang diagnostic pop
0338 #elif defined(__GNUC__)
0339 # pragma GCC diagnostic pop
0340 #endif
0341
0342 #endif
0343
0344 #endif