8
8
//===----------------------------------------------------------------------===//
10
#include "cxa_demangle.h"
10
#define _LIBCPP_EXTERN_TEMPLATE(...)
11
#define _LIBCPP_NO_EXCEPTIONS
17
14
#include <algorithm>
27
21
namespace __cxxabiv1
33
#pragma GCC visibility push(hidden)
37
__node(const __node&);
38
__node& operator=(const __node&);
48
: __name_(0), __size_(0), __left_(0), __right_(0), __cached_size_(-1)
52
void reset_cached_size()
56
__left_->reset_cached_size();
58
__right_->reset_cached_size();
61
virtual size_t first_size() const {return 0;}
62
virtual size_t second_size() const {return 0;}
63
virtual size_t size() const
65
if (__cached_size_ == -1)
66
const_cast<long&>(__cached_size_) = static_cast<long>(first_size() + second_size());
67
return static_cast<size_t>(__cached_size_);
69
virtual char* first_demangled_name(char* buf) const {return buf;}
70
virtual char* second_demangled_name(char* buf) const {return buf;}
71
virtual char* get_demangled_name(char* buf) const
73
return second_demangled_name(first_demangled_name(buf));
75
virtual size_t base_size() const {return size();}
76
virtual char* get_base_name(char* buf) const
78
return get_demangled_name(buf);
81
virtual bool ends_with_template(bool /*parsing*/ = false) const
85
virtual bool is_ctor_dtor_conv() const
89
virtual __node* base_name() const
91
return const_cast<__node*>(this);
93
virtual bool is_reference_or_pointer_to_function_or_array() const
97
virtual bool is_function() const
101
virtual bool is_cv_qualifer() const
105
virtual bool is_array() const
110
virtual bool fix_forward_references(__node**, __node**)
114
virtual __node* extract_cv(__node*&) const
118
virtual size_t list_len() const
122
virtual bool is_sub() const
130
void display(__node* x, int indent = 0)
134
for (int i = 0; i < 2*indent; ++i)
136
size_t sz = x->size();
137
char* buf = (char*)calloc(sz+10, 1);
138
x->get_demangled_name(buf);
139
printf("%s [%ld] %s, %p\n", typeid(*x).name(), sz, buf, x);
140
if (strlen(buf) != sz)
142
printf("strlen(buf) = %ld and size = %ld\n", strlen(buf), sz);
145
display(x->__left_, indent+1);
146
display(x->__right_, indent+1);
37
const char* parse_type(const char* first, const char* last, C& db);
39
const char* parse_encoding(const char* first, const char* last, C& db);
41
const char* parse_name(const char* first, const char* last, C& db);
43
const char* parse_expression(const char* first, const char* last, C& db);
45
const char* parse_template_args(const char* first, const char* last, C& db);
47
const char* parse_operator_name(const char* first, const char* last, C& db);
49
const char* parse_unqualified_name(const char* first, const char* last, C& db);
51
const char* parse_decltype(const char* first, const char* last, C& db);
55
print_stack(const C& db)
57
printf("---------\n");
59
for (auto& s : db.names)
60
printf("{%s#%s}\n", s.first.c_str(), s.second.c_str());
63
for (auto& v : db.subs)
66
printf("S%i_ = {", i);
70
printf("{%s#%s}", s.first.c_str(), s.second.c_str());
74
printf("template_param:\n");
75
for (auto& t : db.template_param)
82
printf("T%i_ = {", i);
86
printf("{%s#%s}", s.first.c_str(), s.second.c_str());
91
printf("---------\n\n");
96
print_state(const char* msg, const char* first, const char* last, const C& db)
99
for (; first != last; ++first)
100
printf("%c", *first);
105
// <number> ::= [n] <non-negative decimal integer>
108
parse_number(const char* first, const char* last)
112
const char* t = first;
121
else if ('1' <= *t && *t <= '9')
124
while (first != last && std::isdigit(*first))
132
template <class Float>
136
struct float_data<float>
138
static const size_t mangled_size = 8;
139
static const size_t max_demangled_size = 24;
140
static constexpr const char* spec = "%af";
143
constexpr const char* float_data<float>::spec;
146
struct float_data<double>
148
static const size_t mangled_size = 16;
149
static const size_t max_demangled_size = 32;
150
static constexpr const char* spec = "%a";
153
constexpr const char* float_data<double>::spec;
156
struct float_data<long double>
158
static const size_t mangled_size = 20; // May need to be adjusted to 16 or 24 on other platforms
159
static const size_t max_demangled_size = 40;
160
static constexpr const char* spec = "%LaL";
163
constexpr const char* float_data<long double>::spec;
165
template <class Float, class C>
167
parse_floating_number(const char* first, const char* last, C& db)
169
const size_t N = float_data<Float>::mangled_size;
170
if (static_cast<std::size_t>(last - first) > N)
176
char buf[sizeof(Float)];
178
const char* t = first;
180
for (; t != last; ++t, ++e)
184
unsigned d1 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
185
static_cast<unsigned>(*t - 'a' + 10);
187
unsigned d0 = isdigit(*t) ? static_cast<unsigned>(*t - '0') :
188
static_cast<unsigned>(*t - 'a' + 10);
189
*e = static_cast<char>((d1 << 4) + d0);
193
#if __LITTLE_ENDIAN__
194
std::reverse(buf, e);
155
static const ptrdiff_t n = sizeof("vtable for ") - 1;
157
__vtable(__node* type)
162
virtual size_t first_size() const
164
if (__cached_size_ == -1)
165
const_cast<long&>(__cached_size_) = n + static_cast<long>(__right_->size());
166
return static_cast<size_t>(__cached_size_);
168
virtual char* first_demangled_name(char* buf) const
170
strncpy(buf, "vtable for ", n);
171
return __right_->get_demangled_name(buf+n);
173
virtual __node* base_name() const
175
return __right_->base_name();
177
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
179
return __right_->fix_forward_references(t_begin, t_end);
186
static const ptrdiff_t n = sizeof("VTT for ") - 1;
193
virtual size_t first_size() const
195
if (__cached_size_ == -1)
196
const_cast<long&>(__cached_size_) = n + static_cast<long>(__right_->size());
197
return static_cast<size_t>(__cached_size_);
199
virtual char* first_demangled_name(char* buf) const
201
strncpy(buf, "VTT for ", n);
202
return __right_->get_demangled_name(buf+n);
204
virtual __node* base_name() const
206
return __right_->base_name();
208
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
210
return __right_->fix_forward_references(t_begin, t_end);
214
class __construction_vtable
217
static const ptrdiff_t n = sizeof("construction vtable for ") - 1 + 4;
219
__construction_vtable(__node* left, __node* right)
225
virtual size_t first_size() const
227
if (__cached_size_ == -1)
228
const_cast<long&>(__cached_size_) = n + static_cast<long>(__left_->size()
230
return static_cast<size_t>(__cached_size_);
232
virtual char* first_demangled_name(char* buf) const
234
strncpy(buf, "construction vtable for ", n-4);
235
buf = __left_->get_demangled_name(buf+n-4);
240
return __right_->get_demangled_name(buf);
242
virtual __node* base_name() const
244
return __right_->base_name();
246
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
250
r = __left_->fix_forward_references(t_begin, t_end);
251
return r && __right_->fix_forward_references(t_begin, t_end);
258
static const ptrdiff_t n = sizeof("typeinfo for ") - 1;
260
__typeinfo(__node* type)
265
virtual size_t first_size() const
267
if (__cached_size_ == -1)
268
const_cast<long&>(__cached_size_) = n + static_cast<long>(__right_->size());
269
return static_cast<size_t>(__cached_size_);
271
virtual char* first_demangled_name(char* buf) const
273
strncpy(buf, "typeinfo for ", n);
274
return __right_->get_demangled_name(buf+n);
276
virtual __node* base_name() const
278
return __right_->base_name();
280
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
282
return __right_->fix_forward_references(t_begin, t_end);
286
class __typeinfo_name
289
static const ptrdiff_t n = sizeof("typeinfo name for ") - 1;
291
__typeinfo_name(__node* type)
296
virtual size_t first_size() const
298
if (__cached_size_ == -1)
299
const_cast<long&>(__cached_size_) = n + static_cast<long>(__right_->size());
300
return static_cast<size_t>(__cached_size_);
302
virtual char* first_demangled_name(char* buf) const
304
strncpy(buf, "typeinfo name for ", n);
305
return __right_->get_demangled_name(buf+n);
307
virtual __node* base_name() const
309
return __right_->base_name();
311
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
313
return __right_->fix_forward_references(t_begin, t_end);
317
class __covariant_return_thunk
320
static const ptrdiff_t n = sizeof("covariant return thunk to ") - 1;
322
__covariant_return_thunk(__node* type)
327
virtual size_t first_size() const
329
if (__cached_size_ == -1)
330
const_cast<long&>(__cached_size_) = n + static_cast<long>(__right_->size());
331
return static_cast<size_t>(__cached_size_);
333
virtual char* first_demangled_name(char* buf) const
335
strncpy(buf, "covariant return thunk to ", n);
336
return __right_->get_demangled_name(buf+n);
338
virtual __node* base_name() const
340
return __right_->base_name();
342
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
344
return __right_->fix_forward_references(t_begin, t_end);
348
class __virtual_thunk
351
static const size_t n = sizeof("virtual thunk to ") - 1;
353
__virtual_thunk(__node* type)
358
virtual size_t first_size() const
360
if (__cached_size_ == -1)
361
const_cast<long&>(__cached_size_) = static_cast<long>(n + __right_->size());
362
return static_cast<size_t>(__cached_size_);
364
virtual char* first_demangled_name(char* buf) const
366
strncpy(buf, "virtual thunk to ", n);
367
return __right_->get_demangled_name(buf+n);
369
virtual __node* base_name() const
371
return __right_->base_name();
373
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
375
return __right_->fix_forward_references(t_begin, t_end);
379
class __non_virtual_thunk
382
static const size_t n = sizeof("non-virtual thunk to ") - 1;
384
__non_virtual_thunk(__node* type)
389
virtual size_t first_size() const
391
if (__cached_size_ == -1)
392
const_cast<long&>(__cached_size_) = static_cast<long>(n + __right_->size());
393
return static_cast<size_t>(__cached_size_);
395
virtual char* first_demangled_name(char* buf) const
397
strncpy(buf, "non-virtual thunk to ", n);
398
return __right_->get_demangled_name(buf+n);
400
virtual __node* base_name() const
402
return __right_->base_name();
404
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
406
return __right_->fix_forward_references(t_begin, t_end);
410
class __guard_variable
413
static const size_t n = sizeof("guard variable for ") - 1;
415
__guard_variable(__node* type)
420
virtual size_t first_size() const
422
if (__cached_size_ == -1)
423
const_cast<long&>(__cached_size_) = static_cast<long>(n + __right_->size());
424
return static_cast<size_t>(__cached_size_);
426
virtual char* first_demangled_name(char* buf) const
428
strncpy(buf, "guard variable for ", n);
429
return __right_->get_demangled_name(buf+n);
431
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
433
return __right_->fix_forward_references(t_begin, t_end);
437
class __reference_temporary
440
static const size_t n = sizeof("reference temporary for ") - 1;
442
__reference_temporary(__node* type)
447
virtual size_t first_size() const
449
if (__cached_size_ == -1)
450
const_cast<long&>(__cached_size_) = static_cast<long>(n + __right_->size());
451
return static_cast<size_t>(__cached_size_);
453
virtual char* first_demangled_name(char* buf) const
455
strncpy(buf, "reference temporary for ", n);
456
return __right_->get_demangled_name(buf+n);
458
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
460
return __right_->fix_forward_references(t_begin, t_end);
468
__source_name(const char* __name, size_t __size)
474
virtual size_t first_size() const
476
if (__cached_size_ == -1)
478
if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
479
const_cast<long&>(__cached_size_) = 21;
481
const_cast<long&>(__cached_size_) = static_cast<long>(__size_);
483
return static_cast<size_t>(__cached_size_);
485
virtual char* first_demangled_name(char* buf) const
487
if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0)
488
return strncpy(buf, "(anonymous namespace)", 21) + 21;
489
return strncpy(buf, __name_, __size_) + __size_;
498
virtual size_t first_size() const {return sizeof("operator new") - 1;}
499
virtual char* first_demangled_name(char* buf) const
501
return strncpy(buf, "operator new", sizeof("operator new") - 1) +
502
sizeof("operator new") - 1;
506
class __operator_new_array
511
virtual size_t first_size() const {return sizeof("operator new[]") - 1;}
512
virtual char* first_demangled_name(char* buf) const
514
return strncpy(buf, "operator new[]", sizeof("operator new[]") - 1) +
515
sizeof("operator new[]") - 1;
519
class __operator_delete
524
virtual size_t first_size() const {return sizeof("operator delete") - 1;}
525
virtual char* first_demangled_name(char* buf) const
527
return strncpy(buf, "operator delete", sizeof("operator delete") - 1) +
528
sizeof("operator delete") - 1;
532
class __operator_delete_array
537
virtual size_t first_size() const {return sizeof("operator delete[]") - 1;}
538
virtual char* first_demangled_name(char* buf) const
540
return strncpy(buf, "operator delete[]", sizeof("operator delete[]") - 1) +
541
sizeof("operator delete[]") - 1;
545
class __operator_logical_and
550
__operator_logical_and() {}
551
__operator_logical_and(__node* op1, __node* op2)
556
virtual size_t first_size() const
558
if (__cached_size_ == -1)
561
const_cast<long&>(__cached_size_) = static_cast<long>(
562
__left_->size() + 8 +
565
const_cast<long&>(__cached_size_) = sizeof("operator&&") - 1;
567
return static_cast<size_t>(__cached_size_);
569
virtual char* first_demangled_name(char* buf) const
574
buf = __left_->get_demangled_name(buf);
575
strncpy(buf, ") && (", 6);
577
buf = __right_->get_demangled_name(buf);
582
strncpy(buf, "operator&&", sizeof("operator&&") - 1);
583
buf += sizeof("operator&&") - 1;
587
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
591
r = r && __left_->fix_forward_references(t_begin, t_end);
593
r = r && __right_->fix_forward_references(t_begin, t_end);
598
class __operator_addressof
603
__operator_addressof() {}
604
explicit __operator_addressof(__node* op)
608
virtual size_t first_size() const
610
if (__cached_size_ == -1)
613
const_cast<long&>(__cached_size_) = static_cast<long>(3 + __left_->size());
615
const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
617
return static_cast<size_t>(__cached_size_);
619
virtual char* first_demangled_name(char* buf) const
625
buf = __left_->get_demangled_name(buf);
630
strncpy(buf, "operator&", sizeof("operator&") - 1);
631
buf += sizeof("operator&") - 1;
635
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
638
return __left_->fix_forward_references(t_begin, t_end);
643
class __operator_bit_and
648
__operator_bit_and() {}
649
__operator_bit_and(__node* op1, __node* op2)
654
virtual size_t first_size() const
656
if (__cached_size_ == -1)
659
const_cast<long&>(__cached_size_) = static_cast<long>(
660
__left_->size() + 7 +
663
const_cast<long&>(__cached_size_) = sizeof("operator&") - 1;
665
return static_cast<size_t>(__cached_size_);
667
virtual char* first_demangled_name(char* buf) const
672
buf = __left_->get_demangled_name(buf);
673
strncpy(buf, ") & (", 5);
675
buf = __right_->get_demangled_name(buf);
680
strncpy(buf, "operator&", sizeof("operator&") - 1);
681
buf += sizeof("operator&") - 1;
685
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
689
r = r && __left_->fix_forward_references(t_begin, t_end);
691
r = r && __right_->fix_forward_references(t_begin, t_end);
696
class __operator_and_equal
701
__operator_and_equal() {}
702
__operator_and_equal(__node* op1, __node* op2)
707
virtual size_t first_size() const
709
if (__cached_size_ == -1)
712
const_cast<long&>(__cached_size_) = static_cast<long>(
713
__left_->size() + 8 +
716
const_cast<long&>(__cached_size_) = sizeof("operator&=") - 1;
718
return static_cast<size_t>(__cached_size_);
720
virtual char* first_demangled_name(char* buf) const
725
buf = __left_->get_demangled_name(buf);
726
strncpy(buf, ") &= (", 6);
728
buf = __right_->get_demangled_name(buf);
733
strncpy(buf, "operator&=", sizeof("operator&=") - 1);
734
buf += sizeof("operator&=") - 1;
738
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
742
r = r && __left_->fix_forward_references(t_begin, t_end);
744
r = r && __right_->fix_forward_references(t_begin, t_end);
749
class __operator_equal
754
__operator_equal() {}
755
__operator_equal(__node* op1, __node* op2)
760
virtual size_t first_size() const
762
if (__cached_size_ == -1)
765
const_cast<long&>(__cached_size_) = static_cast<long>(
766
__left_->size() + 7 +
769
const_cast<long&>(__cached_size_) = sizeof("operator=") - 1;
771
return static_cast<size_t>(__cached_size_);
773
virtual char* first_demangled_name(char* buf) const
778
buf = __left_->get_demangled_name(buf);
779
strncpy(buf, ") = (", 5);
781
buf = __right_->get_demangled_name(buf);
786
strncpy(buf, "operator=", sizeof("operator=") - 1);
787
buf += sizeof("operator=") - 1;
791
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
795
r = r && __left_->fix_forward_references(t_begin, t_end);
797
r = r && __right_->fix_forward_references(t_begin, t_end);
802
class __operator_alignof_type
807
__operator_alignof_type() {}
808
__operator_alignof_type(__node* op)
812
virtual size_t first_size() const
814
if (__cached_size_ == -1)
817
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->size() + 10);
819
const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
821
return static_cast<size_t>(__cached_size_);
823
virtual char* first_demangled_name(char* buf) const
827
strncpy(buf, "alignof (", 9);
829
buf = __right_->get_demangled_name(buf);
834
strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
835
buf += sizeof("operator alignof") - 1;
839
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
842
return __right_->fix_forward_references(t_begin, t_end);
847
class __operator_alignof_expression
852
__operator_alignof_expression() {}
853
__operator_alignof_expression(__node* op)
857
virtual size_t first_size() const
859
if (__cached_size_ == -1)
862
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->size() + 10);
864
const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1;
866
return static_cast<size_t>(__cached_size_);
868
virtual char* first_demangled_name(char* buf) const
872
strncpy(buf, "alignof (", 9);
874
buf = __right_->get_demangled_name(buf);
879
strncpy(buf, "operator alignof", sizeof("operator alignof") - 1);
880
buf += sizeof("operator alignof") - 1;
884
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
887
return __right_->fix_forward_references(t_begin, t_end);
892
class __operator_paren
897
virtual size_t first_size() const {return sizeof("operator()") - 1;}
898
virtual char* first_demangled_name(char* buf) const
900
strncpy(buf, "operator()", sizeof("operator()") - 1);
901
return buf + sizeof("operator()") - 1;
905
class __operator_comma
910
__operator_comma() {}
911
__operator_comma(__node* op1, __node* op2)
916
virtual size_t first_size() const
918
if (__cached_size_ == -1)
921
const_cast<long&>(__cached_size_) = static_cast<long>(
922
__left_->size() + 7 +
925
const_cast<long&>(__cached_size_) = sizeof("operator,") - 1;
927
return static_cast<size_t>(__cached_size_);
929
virtual char* first_demangled_name(char* buf) const
934
buf = __left_->get_demangled_name(buf);
935
strncpy(buf, ") , (", 5);
937
buf = __right_->get_demangled_name(buf);
942
strncpy(buf, "operator,", sizeof("operator,") - 1);
943
buf += sizeof("operator,") - 1;
947
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
951
r = r && __left_->fix_forward_references(t_begin, t_end);
953
r = r && __right_->fix_forward_references(t_begin, t_end);
958
class __operator_tilda
963
__operator_tilda() {}
964
explicit __operator_tilda(__node* op)
968
virtual size_t first_size() const
970
if (__cached_size_ == -1)
973
const_cast<long&>(__cached_size_) = static_cast<long>(3 + __left_->size());
975
const_cast<long&>(__cached_size_) = sizeof("operator~") - 1;
977
return static_cast<size_t>(__cached_size_);
979
virtual char* first_demangled_name(char* buf) const
985
buf = __left_->get_demangled_name(buf);
990
strncpy(buf, "operator~", sizeof("operator~") - 1);
991
buf += sizeof("operator~") - 1;
995
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
998
return __left_->fix_forward_references(t_begin, t_end);
1003
class __operator_cast
1006
static const size_t n = sizeof("operator ") - 1;
1009
explicit __operator_cast(__node* type)
1013
__operator_cast(__node* type, __node* arg)
1019
virtual size_t first_size() const
1021
if (__cached_size_ == -1)
1027
off += __right_->size();
1029
off += __left_->size();
1032
off = n + __right_->size();;
1033
const_cast<long&>(__cached_size_) = static_cast<long>(off);
1035
return static_cast<size_t>(__cached_size_);
1037
virtual char* first_demangled_name(char* buf) const
1042
buf = __right_->get_demangled_name(buf);
1046
buf = __left_->get_demangled_name(buf);
1051
strncpy(buf, "operator ", n);
1052
buf = __right_->get_demangled_name(buf+n);
1056
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1060
r = r && __left_->fix_forward_references(t_begin, t_end);
1061
r = r && __right_->fix_forward_references(t_begin, t_end);
1064
virtual bool is_ctor_dtor_conv() const
1070
class __cast_literal
1075
__cast_literal(__node* type, const char* f, const char* l)
1079
__size_ = static_cast<size_t>(l - f);
1081
virtual size_t first_size() const
1083
if (__cached_size_ == -1)
1084
const_cast<long&>(__cached_size_) = static_cast<long>(2 +
1085
__left_->size() + __size_);
1086
return static_cast<size_t>(__cached_size_);
1088
virtual char* first_demangled_name(char* buf) const
1091
buf = __left_->get_demangled_name(buf);
1093
strncpy(buf, __name_, __size_);
1094
return buf + __size_;
1096
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1098
return __left_->fix_forward_references(t_begin, t_end);
1102
class __operator_dereference
1107
__operator_dereference() {}
1108
explicit __operator_dereference(__node* op)
1112
virtual size_t first_size() const
1114
if (__cached_size_ == -1)
1117
const_cast<long&>(__cached_size_) = static_cast<long>(3 + __left_->size());
1119
const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
1121
return static_cast<size_t>(__cached_size_);
1123
virtual char* first_demangled_name(char* buf) const
1129
buf = __left_->get_demangled_name(buf);
1134
strncpy(buf, "operator*", sizeof("operator*") - 1);
1135
buf += sizeof("operator*") - 1;
1139
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1142
return __left_->fix_forward_references(t_begin, t_end);
1147
class __operator_divide
1152
__operator_divide() {}
1153
__operator_divide(__node* op1, __node* op2)
1158
virtual size_t first_size() const
1160
if (__cached_size_ == -1)
1163
const_cast<long&>(__cached_size_) = static_cast<long>(
1164
__left_->size() + 7 +
1167
const_cast<long&>(__cached_size_) = sizeof("operator/") - 1;
1169
return static_cast<size_t>(__cached_size_);
1171
virtual char* first_demangled_name(char* buf) const
1176
buf = __left_->get_demangled_name(buf);
1177
strncpy(buf, ") / (", 5);
1179
buf = __right_->get_demangled_name(buf);
1184
strncpy(buf, "operator/", sizeof("operator/") - 1);
1185
buf += sizeof("operator/") - 1;
1189
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1193
r = r && __left_->fix_forward_references(t_begin, t_end);
1195
r = r && __right_->fix_forward_references(t_begin, t_end);
1200
class __operator_divide_equal
1205
__operator_divide_equal() {}
1206
__operator_divide_equal(__node* op1, __node* op2)
1211
virtual size_t first_size() const
1213
if (__cached_size_ == -1)
1216
const_cast<long&>(__cached_size_) = static_cast<long>(
1217
__left_->size() + 8 +
1220
const_cast<long&>(__cached_size_) = sizeof("operator/=") - 1;
1222
return static_cast<size_t>(__cached_size_);
1224
virtual char* first_demangled_name(char* buf) const
1229
buf = __left_->get_demangled_name(buf);
1230
strncpy(buf, ") /= (", 6);
1232
buf = __right_->get_demangled_name(buf);
1237
strncpy(buf, "operator/=", sizeof("operator/=") - 1);
1238
buf += sizeof("operator/=") - 1;
1242
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1246
r = r && __left_->fix_forward_references(t_begin, t_end);
1248
r = r && __right_->fix_forward_references(t_begin, t_end);
1253
class __operator_xor
1259
__operator_xor(__node* op1, __node* op2)
1264
virtual size_t first_size() const
1266
if (__cached_size_ == -1)
1269
const_cast<long&>(__cached_size_) = static_cast<long>(
1270
__left_->size() + 7 +
1273
const_cast<long&>(__cached_size_) = sizeof("operator^") - 1;
1275
return static_cast<size_t>(__cached_size_);
1277
virtual char* first_demangled_name(char* buf) const
1282
buf = __left_->get_demangled_name(buf);
1283
strncpy(buf, ") ^ (", 5);
1285
buf = __right_->get_demangled_name(buf);
1290
strncpy(buf, "operator^", sizeof("operator^") - 1);
1291
buf += sizeof("operator^") - 1;
1295
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1299
r = r && __left_->fix_forward_references(t_begin, t_end);
1301
r = r && __right_->fix_forward_references(t_begin, t_end);
1306
class __operator_xor_equal
1311
__operator_xor_equal() {}
1312
__operator_xor_equal(__node* op1, __node* op2)
1317
virtual size_t first_size() const
1319
if (__cached_size_ == -1)
1322
const_cast<long&>(__cached_size_) = static_cast<long>(
1323
__left_->size() + 8 +
1326
const_cast<long&>(__cached_size_) = sizeof("operator^=") - 1;
1328
return static_cast<size_t>(__cached_size_);
1330
virtual char* first_demangled_name(char* buf) const
1334
*buf++ = '('; // strncpy(buf, "(", 1);
1335
buf = __left_->get_demangled_name(buf);
1336
strncpy(buf, ") ^= (", 6);
1338
buf = __right_->get_demangled_name(buf);
1343
strncpy(buf, "operator^=", sizeof("operator^=") - 1);
1344
buf += sizeof("operator^=") - 1;
1348
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1352
r = r && __left_->fix_forward_references(t_begin, t_end);
1354
r = r && __right_->fix_forward_references(t_begin, t_end);
1359
class __operator_equality
1364
__operator_equality() {}
1365
__operator_equality(__node* op1, __node* op2)
1370
virtual size_t first_size() const
1372
if (__cached_size_ == -1)
1375
const_cast<long&>(__cached_size_) = static_cast<long>(
1376
__left_->size() + 8 +
1379
const_cast<long&>(__cached_size_) = sizeof("operator==") - 1;
1381
return static_cast<size_t>(__cached_size_);
1383
virtual char* first_demangled_name(char* buf) const
1388
buf = __left_->get_demangled_name(buf);
1389
strncpy(buf, ") == (", 6);
1391
buf = __right_->get_demangled_name(buf);
1396
strncpy(buf, "operator==", sizeof("operator==") - 1);
1397
buf += sizeof("operator==") - 1;
1401
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1405
r = r && __left_->fix_forward_references(t_begin, t_end);
1407
r = r && __right_->fix_forward_references(t_begin, t_end);
1412
class __operator_greater_equal
1417
__operator_greater_equal() {}
1418
__operator_greater_equal(__node* op1, __node* op2)
1423
virtual size_t first_size() const
1425
if (__cached_size_ == -1)
1428
const_cast<long&>(__cached_size_) = static_cast<long>(
1429
__left_->size() + 8 +
1432
const_cast<long&>(__cached_size_) = sizeof("operator>=") - 1;
1434
return static_cast<size_t>(__cached_size_);
1436
virtual char* first_demangled_name(char* buf) const
1441
buf = __left_->get_demangled_name(buf);
1442
strncpy(buf, ") >= (", 6);
1444
buf = __right_->get_demangled_name(buf);
1449
strncpy(buf, "operator>=", sizeof("operator>=") - 1);
1450
buf += sizeof("operator>=") - 1;
1454
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1458
r = r && __left_->fix_forward_references(t_begin, t_end);
1460
r = r && __right_->fix_forward_references(t_begin, t_end);
1465
class __operator_greater
1470
__operator_greater() {}
1471
__operator_greater(__node* op1, __node* op2)
1476
virtual size_t first_size() const
1478
if (__cached_size_ == -1)
1481
const_cast<long&>(__cached_size_) = static_cast<long>(
1482
__left_->size() + 9 +
1485
const_cast<long&>(__cached_size_) = sizeof("operator>") - 1;
1487
return static_cast<size_t>(__cached_size_);
1489
virtual char* first_demangled_name(char* buf) const
1495
buf = __left_->get_demangled_name(buf);
1496
strncpy(buf, ") > (", 5);
1498
buf = __right_->get_demangled_name(buf);
1504
strncpy(buf, "operator>", sizeof("operator>") - 1);
1505
buf += sizeof("operator>") - 1;
1509
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1513
r = r && __left_->fix_forward_references(t_begin, t_end);
1515
r = r && __right_->fix_forward_references(t_begin, t_end);
1520
class __operator_brackets
1525
virtual size_t first_size() const {return sizeof("operator[]") - 1;}
1526
virtual char* first_demangled_name(char* buf) const
1528
strncpy(buf, "operator[]", sizeof("operator[]") - 1);
1529
return buf + sizeof("operator[]") - 1;
1533
class __operator_less_equal
1538
__operator_less_equal() {}
1539
__operator_less_equal(__node* op1, __node* op2)
1544
virtual size_t first_size() const
1546
if (__cached_size_ == -1)
1549
const_cast<long&>(__cached_size_) = static_cast<long>(
1550
__left_->size() + 8 +
1553
const_cast<long&>(__cached_size_) = sizeof("operator<=") - 1;
1555
return static_cast<size_t>(__cached_size_);
1557
virtual char* first_demangled_name(char* buf) const
1562
buf = __left_->get_demangled_name(buf);
1563
strncpy(buf, ") <= (", 6);
1565
buf = __right_->get_demangled_name(buf);
1570
strncpy(buf, "operator<=", sizeof("operator<=") - 1);
1571
buf += sizeof("operator<=") - 1;
1575
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1579
r = r && __left_->fix_forward_references(t_begin, t_end);
1581
r = r && __right_->fix_forward_references(t_begin, t_end);
1586
class __operator_less
1591
__operator_less() {}
1592
__operator_less(__node* op1, __node* op2)
1597
virtual size_t first_size() const
1599
if (__cached_size_ == -1)
1602
const_cast<long&>(__cached_size_) = static_cast<long>(
1603
__left_->size() + 7 +
1606
const_cast<long&>(__cached_size_) = sizeof("operator<") - 1;
1608
return static_cast<size_t>(__cached_size_);
1610
virtual char* first_demangled_name(char* buf) const
1615
buf = __left_->get_demangled_name(buf);
1616
strncpy(buf, ") < (", 5);
1618
buf = __right_->get_demangled_name(buf);
1623
strncpy(buf, "operator<", sizeof("operator<") - 1);
1624
buf += sizeof("operator<") - 1;
1628
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1632
r = r && __left_->fix_forward_references(t_begin, t_end);
1634
r = r && __right_->fix_forward_references(t_begin, t_end);
1639
class __operator_left_shift
1644
__operator_left_shift() {}
1645
__operator_left_shift(__node* op1, __node* op2)
1650
virtual size_t first_size() const
1652
if (__cached_size_ == -1)
1655
const_cast<long&>(__cached_size_) = static_cast<long>(
1656
__left_->size() + 8 +
1659
const_cast<long&>(__cached_size_) = sizeof("operator<<") - 1;
1661
return static_cast<size_t>(__cached_size_);
1663
virtual char* first_demangled_name(char* buf) const
1668
buf = __left_->get_demangled_name(buf);
1669
strncpy(buf, ") << (", 6);
1671
buf = __right_->get_demangled_name(buf);
1676
strncpy(buf, "operator<<", sizeof("operator<<") - 1);
1677
buf += sizeof("operator<<") - 1;
1681
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1685
r = r && __left_->fix_forward_references(t_begin, t_end);
1687
r = r && __right_->fix_forward_references(t_begin, t_end);
1692
class __operator_left_shift_equal
1697
__operator_left_shift_equal() {}
1698
__operator_left_shift_equal(__node* op1, __node* op2)
1703
virtual size_t first_size() const
1705
if (__cached_size_ == -1)
1708
const_cast<long&>(__cached_size_) = static_cast<long>(
1709
__left_->size() + 9 +
1712
const_cast<long&>(__cached_size_) = sizeof("operator<<=") - 1;
1714
return static_cast<size_t>(__cached_size_);
1716
virtual char* first_demangled_name(char* buf) const
1721
buf = __left_->get_demangled_name(buf);
1722
strncpy(buf, ") <<= (", 7);
1724
buf = __right_->get_demangled_name(buf);
1729
strncpy(buf, "operator<<=", sizeof("operator<<=") - 1);
1730
buf += sizeof("operator<<=") - 1;
1734
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1738
r = r && __left_->fix_forward_references(t_begin, t_end);
1740
r = r && __right_->fix_forward_references(t_begin, t_end);
1745
class __operator_minus
1750
__operator_minus() {}
1751
__operator_minus(__node* op1, __node* op2)
1756
virtual size_t first_size() const
1758
if (__cached_size_ == -1)
1761
const_cast<long&>(__cached_size_) = static_cast<long>(
1762
__left_->size() + 7 +
1765
const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
1767
return static_cast<size_t>(__cached_size_);
1769
virtual char* first_demangled_name(char* buf) const
1774
buf = __left_->get_demangled_name(buf);
1775
strncpy(buf, ") - (", 5);
1777
buf = __right_->get_demangled_name(buf);
1782
strncpy(buf, "operator-", sizeof("operator-") - 1);
1783
buf += sizeof("operator-") - 1;
1787
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1791
r = r && __left_->fix_forward_references(t_begin, t_end);
1793
r = r && __right_->fix_forward_references(t_begin, t_end);
1798
class __operator_minus_equal
1803
__operator_minus_equal() {}
1804
__operator_minus_equal(__node* op1, __node* op2)
1809
virtual size_t first_size() const
1811
if (__cached_size_ == -1)
1814
const_cast<long&>(__cached_size_) = static_cast<long>(
1815
__left_->size() + 8 +
1818
const_cast<long&>(__cached_size_) = sizeof("operator-=") - 1;
1820
return static_cast<size_t>(__cached_size_);
1822
virtual char* first_demangled_name(char* buf) const
1827
buf = __left_->get_demangled_name(buf);
1828
strncpy(buf, ") -= (", 6);
1830
buf = __right_->get_demangled_name(buf);
1835
strncpy(buf, "operator-=", sizeof("operator-=") - 1);
1836
buf += sizeof("operator-=") - 1;
1840
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1844
r = r && __left_->fix_forward_references(t_begin, t_end);
1846
r = r && __right_->fix_forward_references(t_begin, t_end);
1851
class __operator_times
1856
__operator_times() {}
1857
__operator_times(__node* op1, __node* op2)
1862
virtual size_t first_size() const
1864
if (__cached_size_ == -1)
1867
const_cast<long&>(__cached_size_) = static_cast<long>(
1868
__left_->size() + 7 +
1871
const_cast<long&>(__cached_size_) = sizeof("operator*") - 1;
1873
return static_cast<size_t>(__cached_size_);
1875
virtual char* first_demangled_name(char* buf) const
1880
buf = __left_->get_demangled_name(buf);
1881
strncpy(buf, ") * (", 5);
1883
buf = __right_->get_demangled_name(buf);
1888
strncpy(buf, "operator*", sizeof("operator*") - 1);
1889
buf += sizeof("operator*") - 1;
1893
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1897
r = r && __left_->fix_forward_references(t_begin, t_end);
1899
r = r && __right_->fix_forward_references(t_begin, t_end);
1904
class __operator_times_equal
1909
__operator_times_equal() {}
1910
__operator_times_equal(__node* op1, __node* op2)
1915
virtual size_t first_size() const
1917
if (__cached_size_ == -1)
1920
const_cast<long&>(__cached_size_) = static_cast<long>(
1921
__left_->size() + 8 +
1924
const_cast<long&>(__cached_size_) = sizeof("operator*=") - 1;
1926
return static_cast<size_t>(__cached_size_);
1928
virtual char* first_demangled_name(char* buf) const
1933
buf = __left_->get_demangled_name(buf);
1934
strncpy(buf, ") *= (", 6);
1936
buf = __right_->get_demangled_name(buf);
1941
strncpy(buf, "operator*=", sizeof("operator*=") - 1);
1942
buf += sizeof("operator*=") - 1;
1946
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
1950
r = r && __left_->fix_forward_references(t_begin, t_end);
1952
r = r && __right_->fix_forward_references(t_begin, t_end);
1957
class __operator_decrement
1962
__operator_decrement() {}
1963
explicit __operator_decrement(bool prefix, __node* op)
1968
virtual size_t first_size() const
1970
if (__cached_size_ == -1)
1973
const_cast<long&>(__cached_size_) = static_cast<long>(4 + __left_->size());
1975
const_cast<long&>(__cached_size_) = sizeof("operator--") - 1;
1977
return static_cast<size_t>(__cached_size_);
1979
virtual char* first_demangled_name(char* buf) const
1991
buf = __left_->get_demangled_name(buf);
2003
strncpy(buf, "operator--", sizeof("operator--") - 1);
2004
buf += sizeof("operator--") - 1;
2008
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2011
return __left_->fix_forward_references(t_begin, t_end);
2016
class __operator_not_equal
2021
__operator_not_equal() {}
2022
__operator_not_equal(__node* op1, __node* op2)
2027
virtual size_t first_size() const
2029
if (__cached_size_ == -1)
2032
const_cast<long&>(__cached_size_) = static_cast<long>(
2033
__left_->size() + 8 +
2036
const_cast<long&>(__cached_size_) = sizeof("operator!=") - 1;
2038
return static_cast<size_t>(__cached_size_);
2040
virtual char* first_demangled_name(char* buf) const
2045
buf = __left_->get_demangled_name(buf);
2046
strncpy(buf, ") != (", 6);
2048
buf = __right_->get_demangled_name(buf);
2053
strncpy(buf, "operator!=", sizeof("operator!=") - 1);
2054
buf += sizeof("operator!=") - 1;
2058
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2062
r = r && __left_->fix_forward_references(t_begin, t_end);
2064
r = r && __right_->fix_forward_references(t_begin, t_end);
2069
class __operator_negate
2074
__operator_negate() {}
2075
explicit __operator_negate(__node* op)
2079
virtual size_t first_size() const
2081
if (__cached_size_ == -1)
2084
const_cast<long&>(__cached_size_) = static_cast<long>(3 + __left_->size());
2086
const_cast<long&>(__cached_size_) = sizeof("operator-") - 1;
2088
return static_cast<size_t>(__cached_size_);
2090
virtual char* first_demangled_name(char* buf) const
2096
buf = __left_->get_demangled_name(buf);
2101
strncpy(buf, "operator-", sizeof("operator-") - 1);
2102
buf += sizeof("operator-") - 1;
2106
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2109
return __left_->fix_forward_references(t_begin, t_end);
2114
class __operator_logical_not
2119
__operator_logical_not() {}
2120
explicit __operator_logical_not(__node* op)
2124
virtual size_t first_size() const
2126
if (__cached_size_ == -1)
2129
const_cast<long&>(__cached_size_) = static_cast<long>(3 + __left_->size());
2131
const_cast<long&>(__cached_size_) = sizeof("operator!") - 1;
2133
return static_cast<size_t>(__cached_size_);
2135
virtual char* first_demangled_name(char* buf) const
2141
buf = __left_->get_demangled_name(buf);
2146
strncpy(buf, "operator!", sizeof("operator!") - 1);
2147
buf += sizeof("operator!") - 1;
2151
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2154
return __left_->fix_forward_references(t_begin, t_end);
2159
class __operator_logical_or
2164
__operator_logical_or() {}
2165
__operator_logical_or(__node* op1, __node* op2)
2170
virtual size_t first_size() const
2172
if (__cached_size_ == -1)
2175
const_cast<long&>(__cached_size_) = static_cast<long>(
2176
__left_->size() + 8 +
2179
const_cast<long&>(__cached_size_) = sizeof("operator||") - 1;
2181
return static_cast<size_t>(__cached_size_);
2183
virtual char* first_demangled_name(char* buf) const
2188
buf = __left_->get_demangled_name(buf);
2189
strncpy(buf, ") || (", 6);
2191
buf = __right_->get_demangled_name(buf);
2196
strncpy(buf, "operator||", sizeof("operator||") - 1);
2197
buf += sizeof("operator||") - 1;
2201
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2205
r = r && __left_->fix_forward_references(t_begin, t_end);
2207
r = r && __right_->fix_forward_references(t_begin, t_end);
2212
class __operator_bit_or
2217
__operator_bit_or() {}
2218
__operator_bit_or(__node* op1, __node* op2)
2223
virtual size_t first_size() const
2225
if (__cached_size_ == -1)
2228
const_cast<long&>(__cached_size_) = static_cast<long>(
2229
__left_->size() + 7 +
2232
const_cast<long&>(__cached_size_) = sizeof("operator|") - 1;
2234
return static_cast<size_t>(__cached_size_);
2236
virtual char* first_demangled_name(char* buf) const
2241
buf = __left_->get_demangled_name(buf);
2242
strncpy(buf, ") | (", 5);
2244
buf = __right_->get_demangled_name(buf);
2249
strncpy(buf, "operator|", sizeof("operator|") - 1);
2250
buf += sizeof("operator|") - 1;
2254
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2258
r = r && __left_->fix_forward_references(t_begin, t_end);
2260
r = r && __right_->fix_forward_references(t_begin, t_end);
2265
class __operator_or_equal
2270
__operator_or_equal() {}
2271
__operator_or_equal(__node* op1, __node* op2)
2276
virtual size_t first_size() const
2278
if (__cached_size_ == -1)
2281
const_cast<long&>(__cached_size_) = static_cast<long>(
2282
__left_->size() + 8 +
2285
const_cast<long&>(__cached_size_) = sizeof("operator|=") - 1;
2287
return static_cast<size_t>(__cached_size_);
2289
virtual char* first_demangled_name(char* buf) const
2294
buf = __left_->get_demangled_name(buf);
2295
strncpy(buf, ") |= (", 6);
2297
buf = __right_->get_demangled_name(buf);
2302
strncpy(buf, "operator|=", sizeof("operator|=") - 1);
2303
buf += sizeof("operator|=") - 1;
2307
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2311
r = r && __left_->fix_forward_references(t_begin, t_end);
2313
r = r && __right_->fix_forward_references(t_begin, t_end);
2318
class __operator_pointer_to_member
2323
__operator_pointer_to_member() {}
2324
__operator_pointer_to_member(__node* op1, __node* op2)
2329
virtual size_t first_size() const
2331
if (__cached_size_ == -1)
2334
const_cast<long&>(__cached_size_) = static_cast<long>(
2335
__left_->size() + 9 +
2338
const_cast<long&>(__cached_size_) = sizeof("operator->*") - 1;
2340
return static_cast<size_t>(__cached_size_);
2342
virtual char* first_demangled_name(char* buf) const
2347
buf = __left_->get_demangled_name(buf);
2348
strncpy(buf, ") ->* (", 7);
2350
buf = __right_->get_demangled_name(buf);
2355
strncpy(buf, "operator->*", sizeof("operator->*") - 1);
2356
buf += sizeof("operator->*") - 1;
2360
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2364
r = r && __left_->fix_forward_references(t_begin, t_end);
2366
r = r && __right_->fix_forward_references(t_begin, t_end);
2371
class __operator_plus
2376
__operator_plus() {}
2377
__operator_plus(__node* op1, __node* op2)
2382
virtual size_t first_size() const
2384
if (__cached_size_ == -1)
2387
const_cast<long&>(__cached_size_) = static_cast<long>(
2388
__left_->size() + 7 +
2391
const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
2393
return static_cast<size_t>(__cached_size_);
2395
virtual char* first_demangled_name(char* buf) const
2400
buf = __left_->get_demangled_name(buf);
2401
strncpy(buf, ") + (", 5);
2403
buf = __right_->get_demangled_name(buf);
2408
strncpy(buf, "operator+", sizeof("operator+") - 1);
2409
buf += sizeof("operator+") - 1;
2413
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2417
r = r && __left_->fix_forward_references(t_begin, t_end);
2419
r = r && __right_->fix_forward_references(t_begin, t_end);
2424
class __operator_plus_equal
2429
__operator_plus_equal() {}
2430
__operator_plus_equal(__node* op1, __node* op2)
2435
virtual size_t first_size() const
2437
if (__cached_size_ == -1)
2440
const_cast<long&>(__cached_size_) = static_cast<long>(
2441
__left_->size() + 8 +
2444
const_cast<long&>(__cached_size_) = sizeof("operator+=") - 1;
2446
return static_cast<size_t>(__cached_size_);
2448
virtual char* first_demangled_name(char* buf) const
2453
buf = __left_->get_demangled_name(buf);
2454
strncpy(buf, ") += (", 6);
2456
buf = __right_->get_demangled_name(buf);
2461
strncpy(buf, "operator+=", sizeof("operator+=") - 1);
2462
buf += sizeof("operator+=") - 1;
2466
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2470
r = r && __left_->fix_forward_references(t_begin, t_end);
2472
r = r && __right_->fix_forward_references(t_begin, t_end);
2477
class __operator_increment
2482
__operator_increment() {}
2483
explicit __operator_increment(bool prefix, __node* op)
2488
virtual size_t first_size() const
2490
if (__cached_size_ == -1)
2493
const_cast<long&>(__cached_size_) = static_cast<long>(4 + __left_->size());
2495
const_cast<long&>(__cached_size_) = sizeof("operator++") - 1;
2497
return static_cast<size_t>(__cached_size_);
2499
virtual char* first_demangled_name(char* buf) const
2511
buf = __left_->get_demangled_name(buf);
2523
strncpy(buf, "operator++", sizeof("operator++") - 1);
2524
buf += sizeof("operator++") - 1;
2528
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2531
return __left_->fix_forward_references(t_begin, t_end);
2536
class __operator_unary_plus
2541
__operator_unary_plus() {}
2542
explicit __operator_unary_plus(__node* op)
2546
virtual size_t first_size() const
2548
if (__cached_size_ == -1)
2551
const_cast<long&>(__cached_size_) = static_cast<long>(3 + __left_->size());
2553
const_cast<long&>(__cached_size_) = sizeof("operator+") - 1;
2555
return static_cast<size_t>(__cached_size_);
2557
virtual char* first_demangled_name(char* buf) const
2563
buf = __left_->get_demangled_name(buf);
2568
strncpy(buf, "operator+", sizeof("operator+") - 1);
2569
buf += sizeof("operator+") - 1;
2573
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2576
return __left_->fix_forward_references(t_begin, t_end);
2581
class __operator_arrow
2586
__operator_arrow() {}
2587
__operator_arrow(__node* op1, __node* op2)
2592
virtual size_t first_size() const
2594
if (__cached_size_ == -1)
2597
const_cast<long&>(__cached_size_) = static_cast<long>(
2598
__left_->size() + 8 +
2601
const_cast<long&>(__cached_size_) = sizeof("operator->") - 1;
2603
return static_cast<size_t>(__cached_size_);
2605
virtual char* first_demangled_name(char* buf) const
2610
buf = __left_->get_demangled_name(buf);
2611
strncpy(buf, ") -> (", 6);
2613
buf = __right_->get_demangled_name(buf);
2618
strncpy(buf, "operator->", sizeof("operator->") - 1);
2619
buf += sizeof("operator->") - 1;
2623
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2627
r = r && __left_->fix_forward_references(t_begin, t_end);
2629
r = r && __right_->fix_forward_references(t_begin, t_end);
2634
class __operator_conditional
2639
__operator_conditional() {}
2640
__operator_conditional(__node* op1, __node* op2, __node* op3)
2642
__name_ = (const char*)op1;
2646
virtual size_t first_size() const
2648
if (__cached_size_ == -1)
2652
__node* op1 = (__node*)__name_;
2653
const_cast<long&>(__cached_size_) = static_cast<long>(
2655
__left_->size() + 12 +
2659
const_cast<long&>(__cached_size_) = sizeof("operator?") - 1;
2661
return static_cast<size_t>(__cached_size_);
2663
virtual char* first_demangled_name(char* buf) const
2667
__node* op1 = (__node*)__name_;
2669
buf = op1->get_demangled_name(buf);
2670
strncpy(buf, ") ? (", 5);
2672
buf = __left_->get_demangled_name(buf);
2673
strncpy(buf, ") : (", 5);
2675
buf = __right_->get_demangled_name(buf);
2680
strncpy(buf, "operator?", sizeof("operator?") - 1);
2681
buf += sizeof("operator?") - 1;
2685
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2689
r = r && ((__node*)__name_)->fix_forward_references(t_begin, t_end);
2691
r = r && __left_->fix_forward_references(t_begin, t_end);
2693
r = r && __right_->fix_forward_references(t_begin, t_end);
2698
class __operator_mod
2704
__operator_mod(__node* op1, __node* op2)
2709
virtual size_t first_size() const
2711
if (__cached_size_ == -1)
2714
const_cast<long&>(__cached_size_) = static_cast<long>(
2715
__left_->size() + 7 +
2718
const_cast<long&>(__cached_size_) = sizeof("operator%") - 1;
2720
return static_cast<size_t>(__cached_size_);
2722
virtual char* first_demangled_name(char* buf) const
2727
buf = __left_->get_demangled_name(buf);
2728
strncpy(buf, ") % (", 5);
2730
buf = __right_->get_demangled_name(buf);
2735
strncpy(buf, "operator%", sizeof("operator%") - 1);
2736
buf += sizeof("operator%") - 1;
2740
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2744
r = r && __left_->fix_forward_references(t_begin, t_end);
2746
r = r && __right_->fix_forward_references(t_begin, t_end);
2751
class __operator_mod_equal
2756
__operator_mod_equal() {}
2757
__operator_mod_equal(__node* op1, __node* op2)
2762
virtual size_t first_size() const
2764
if (__cached_size_ == -1)
2767
const_cast<long&>(__cached_size_) = static_cast<long>(
2768
__left_->size() + 8 +
2771
const_cast<long&>(__cached_size_) = sizeof("operator%=") - 1;
2773
return static_cast<size_t>(__cached_size_);
2775
virtual char* first_demangled_name(char* buf) const
2780
buf = __left_->get_demangled_name(buf);
2781
strncpy(buf, ") %= (", 6);
2783
buf = __right_->get_demangled_name(buf);
2788
strncpy(buf, "operator%=", sizeof("operator%=") - 1);
2789
buf += sizeof("operator%=") - 1;
2793
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2797
r = r && __left_->fix_forward_references(t_begin, t_end);
2799
r = r && __right_->fix_forward_references(t_begin, t_end);
2804
class __operator_right_shift
2809
__operator_right_shift() {}
2810
__operator_right_shift(__node* op1, __node* op2)
2815
virtual size_t first_size() const
2817
if (__cached_size_ == -1)
2820
const_cast<long&>(__cached_size_) = static_cast<long>(
2821
__left_->size() + 8 +
2824
const_cast<long&>(__cached_size_) = sizeof("operator>>") - 1;
2826
return static_cast<size_t>(__cached_size_);
2828
virtual char* first_demangled_name(char* buf) const
2833
buf = __left_->get_demangled_name(buf);
2834
strncpy(buf, ") >> (", 6);
2836
buf = __right_->get_demangled_name(buf);
2841
strncpy(buf, "operator>>", sizeof("operator>>") - 1);
2842
buf += sizeof("operator>>") - 1;
2846
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2850
r = r && __left_->fix_forward_references(t_begin, t_end);
2852
r = r && __right_->fix_forward_references(t_begin, t_end);
2857
class __operator_right_shift_equal
2862
__operator_right_shift_equal() {}
2863
__operator_right_shift_equal(__node* op1, __node* op2)
2868
virtual size_t first_size() const
2870
if (__cached_size_ == -1)
2873
const_cast<long&>(__cached_size_) = static_cast<long>(
2874
__left_->size() + 9 +
2877
const_cast<long&>(__cached_size_) = sizeof("operator>>=") - 1;
2879
return static_cast<size_t>(__cached_size_);
2881
virtual char* first_demangled_name(char* buf) const
2886
buf = __left_->get_demangled_name(buf);
2887
strncpy(buf, ") >>= (", 7);
2889
buf = __right_->get_demangled_name(buf);
2894
strncpy(buf, "operator>>=", sizeof("operator>>=") - 1);
2895
buf += sizeof("operator>>=") - 1;
2899
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2903
r = r && __left_->fix_forward_references(t_begin, t_end);
2905
r = r && __right_->fix_forward_references(t_begin, t_end);
2910
class __operator_sizeof_type
2915
__operator_sizeof_type() {}
2916
__operator_sizeof_type(__node* op)
2920
virtual size_t first_size() const
2922
if (__cached_size_ == -1)
2925
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->size() + 9);
2927
const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
2929
return static_cast<size_t>(__cached_size_);
2931
virtual char* first_demangled_name(char* buf) const
2935
strncpy(buf, "sizeof (", 8);
2937
buf = __right_->get_demangled_name(buf);
2942
strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
2943
buf += sizeof("operator sizeof") - 1;
2947
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2950
return __right_->fix_forward_references(t_begin, t_end);
2955
class __operator_sizeof_expression
2960
__operator_sizeof_expression() {}
2961
__operator_sizeof_expression(__node* op)
2965
virtual size_t first_size() const
2967
if (__cached_size_ == -1)
2970
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->size() + 9);
2972
const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1;
2974
return static_cast<size_t>(__cached_size_);
2976
virtual char* first_demangled_name(char* buf) const
2980
strncpy(buf, "sizeof (", 8);
2982
buf = __right_->get_demangled_name(buf);
2987
strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1);
2988
buf += sizeof("operator sizeof") - 1;
2992
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
2995
return __right_->fix_forward_references(t_begin, t_end);
3005
__typeid(__node* op)
3009
virtual size_t first_size() const
3011
if (__cached_size_ == -1)
3012
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->size() + 8);
3013
return static_cast<size_t>(__cached_size_);
3015
virtual char* first_demangled_name(char* buf) const
3017
strncpy(buf, "typeid(", 7);
3019
buf = __right_->get_demangled_name(buf);
3023
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3025
return __right_->fix_forward_references(t_begin, t_end);
3038
virtual size_t first_size() const
3040
if (__cached_size_ == -1)
3041
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->size() + 6);
3042
return static_cast<size_t>(__cached_size_);
3044
virtual char* first_demangled_name(char* buf) const
3046
strncpy(buf, "throw ", 6);
3047
return __right_->get_demangled_name(buf+6);
3049
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3051
return __right_->fix_forward_references(t_begin, t_end);
3058
static const ptrdiff_t n = sizeof("throw") - 1;
3061
virtual size_t first_size() const {return n;}
3062
virtual char* first_demangled_name(char* buf) const
3064
strncpy(buf, "throw", n);
3069
class __operator_sizeof_param_pack
3074
__operator_sizeof_param_pack(__node* op)
3078
virtual size_t first_size() const
3080
if (__cached_size_ == -1)
3081
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->size() + 11);
3082
return static_cast<size_t>(__cached_size_);
3084
virtual char* first_demangled_name(char* buf) const
3086
strncpy(buf, "sizeof...(", 10);
3088
buf = __right_->get_demangled_name(buf);
3092
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3094
return __right_->fix_forward_references(t_begin, t_end);
3103
__const_cast(__node* op1, __node* op2)
3108
virtual size_t first_size() const
3110
if (__cached_size_ == -1)
3111
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3112
14 + __right_->size());
3113
return static_cast<size_t>(__cached_size_);
3115
virtual char* first_demangled_name(char* buf) const
3117
strncpy(buf, "const_cast<", 11);
3119
buf = __left_->get_demangled_name(buf);
3122
buf = __right_->get_demangled_name(buf);
3126
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3128
return __left_->fix_forward_references(t_begin, t_end) &&
3129
__right_->fix_forward_references(t_begin, t_end);
3133
class __dynamic_cast
3138
__dynamic_cast(__node* op1, __node* op2)
3143
virtual size_t first_size() const
3145
if (__cached_size_ == -1)
3146
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3147
16 + __right_->size());
3148
return static_cast<size_t>(__cached_size_);
3150
virtual char* first_demangled_name(char* buf) const
3152
strncpy(buf, "dynamic_cast<", 13);
3154
buf = __left_->get_demangled_name(buf);
3157
buf = __right_->get_demangled_name(buf);
3161
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3163
return __left_->fix_forward_references(t_begin, t_end) &&
3164
__right_->fix_forward_references(t_begin, t_end);
3168
class __reinterpret_cast
3173
__reinterpret_cast(__node* op1, __node* op2)
3178
virtual size_t first_size() const
3180
if (__cached_size_ == -1)
3181
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3182
20 + __right_->size());
3183
return static_cast<size_t>(__cached_size_);
3185
virtual char* first_demangled_name(char* buf) const
3187
strncpy(buf, "reinterpret_cast<", 17);
3189
buf = __left_->get_demangled_name(buf);
3192
buf = __right_->get_demangled_name(buf);
3196
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3198
return __left_->fix_forward_references(t_begin, t_end) &&
3199
__right_->fix_forward_references(t_begin, t_end);
3208
__static_cast(__node* op1, __node* op2)
3213
virtual size_t first_size() const
3215
if (__cached_size_ == -1)
3216
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3217
15 + __right_->size());
3218
return static_cast<size_t>(__cached_size_);
3220
virtual char* first_demangled_name(char* buf) const
3222
strncpy(buf, "static_cast<", 12);
3224
buf = __left_->get_demangled_name(buf);
3227
buf = __right_->get_demangled_name(buf);
3231
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3233
return __left_->fix_forward_references(t_begin, t_end) &&
3234
__right_->fix_forward_references(t_begin, t_end);
3243
__call_expr(__node* op1, __node* op2)
3248
virtual size_t first_size() const
3250
if (__cached_size_ == -1)
3252
size_t off = __left_->size() + 2;
3254
off += __right_->size();
3255
const_cast<long&>(__cached_size_) = static_cast<long>(off);
3257
return static_cast<size_t>(__cached_size_);
3259
virtual char* first_demangled_name(char* buf) const
3261
buf = __left_->get_demangled_name(buf);
3264
buf = __right_->get_demangled_name(buf);
3268
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3270
bool r = __left_->fix_forward_references(t_begin, t_end);
3272
r = r && __right_->fix_forward_references(t_begin, t_end);
3277
class __delete_array_expr
3282
__delete_array_expr(bool global, __node* op)
3287
virtual size_t first_size() const
3289
if (__cached_size_ == -1)
3290
const_cast<long&>(__cached_size_) = static_cast<long>((__size_ ? 2 : 0) +
3291
9 + __right_->size());
3292
return static_cast<size_t>(__cached_size_);
3294
virtual char* first_demangled_name(char* buf) const
3301
strncpy(buf, "delete[] ", 9);
3302
return __right_->get_demangled_name(buf+9);
3304
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3306
return __right_->fix_forward_references(t_begin, t_end);
3315
__delete_expr(bool global, __node* op)
3320
virtual size_t first_size() const
3322
if (__cached_size_ == -1)
3323
const_cast<long&>(__cached_size_) = static_cast<long>((__size_ ? 2 : 0) +
3324
7 + __right_->size());
3325
return static_cast<size_t>(__cached_size_);
3327
virtual char* first_demangled_name(char* buf) const
3334
strncpy(buf, "delete ", 7);
3335
return __right_->get_demangled_name(buf+7);
3337
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3339
return __right_->fix_forward_references(t_begin, t_end);
3348
__new_expr(bool global, bool is_array, bool has_init,
3349
__node* expr, __node* type, __node* init)
3351
__size_ = (unsigned)global |
3352
((unsigned)is_array << 1) |
3353
((unsigned)has_init << 2);
3355
__name_ = (const char*)type;
3358
virtual size_t first_size() const
3360
if (__cached_size_ == -1)
3370
off += __left_->size();
3372
__node* type = (__node*)__name_;
3373
off += type->size();
3378
off += __right_->size();
3380
const_cast<long&>(__cached_size_) = static_cast<long>(off);
3382
return static_cast<size_t>(__cached_size_);
3384
virtual char* first_demangled_name(char* buf) const
3402
buf = __left_->get_demangled_name(buf);
3406
__node* type = (__node*)__name_;
3407
buf = type->get_demangled_name(buf);
3412
buf = __right_->get_demangled_name(buf);
3417
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3419
__node* type = (__node*)__name_;
3420
bool r = type->fix_forward_references(t_begin, t_end);
3422
r = r && __left_->fix_forward_references(t_begin, t_end);;
3424
r = r && __right_->fix_forward_references(t_begin, t_end);;
3429
class __dot_star_expr
3434
__dot_star_expr(__node* op1, __node* op2)
3439
virtual size_t first_size() const
3441
if (__cached_size_ == -1)
3442
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3443
2 + __right_->size());
3444
return static_cast<size_t>(__cached_size_);
3446
virtual char* first_demangled_name(char* buf) const
3448
buf = __left_->get_demangled_name(buf);
3451
return __right_->get_demangled_name(buf);
3453
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3455
return __left_->fix_forward_references(t_begin, t_end) &&
3456
__right_->fix_forward_references(t_begin, t_end);
3465
__dot_expr(__node* op1, __node* op2)
3470
virtual size_t first_size() const
3472
if (__cached_size_ == -1)
3473
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3474
1 + __right_->size());
3475
return static_cast<size_t>(__cached_size_);
3477
virtual char* first_demangled_name(char* buf) const
3479
buf = __left_->get_demangled_name(buf);
3481
return __right_->get_demangled_name(buf);
3483
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3485
return __left_->fix_forward_references(t_begin, t_end) &&
3486
__right_->fix_forward_references(t_begin, t_end);
3495
__arrow_expr(__node* op1, __node* op2)
3500
virtual size_t first_size() const
3502
if (__cached_size_ == -1)
3503
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3504
2 + __right_->size());
3505
return static_cast<size_t>(__cached_size_);
3507
virtual char* first_demangled_name(char* buf) const
3509
buf = __left_->get_demangled_name(buf);
3512
return __right_->get_demangled_name(buf);
3514
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3516
return __left_->fix_forward_references(t_begin, t_end) &&
3517
__right_->fix_forward_references(t_begin, t_end);
3521
class __std_qualified_name
3524
static const ptrdiff_t n = sizeof("std") - 1;
3527
__std_qualified_name()
3530
virtual size_t first_size() const
3535
virtual char* first_demangled_name(char* buf) const
3544
class __sub_allocator
3547
static const ptrdiff_t n = sizeof("std::allocator") - 1;
3550
virtual size_t first_size() const
3554
virtual char* first_demangled_name(char* buf) const
3556
strncpy(buf, "std::allocator", n);
3561
class __sub_basic_string
3564
static const ptrdiff_t n = sizeof("std::basic_string") - 1;
3567
virtual size_t first_size() const
3571
virtual char* first_demangled_name(char* buf) const
3573
strncpy(buf, "std::basic_string", n);
3581
static const size_t n = sizeof("std::string") - 1;
3582
static const size_t ne = sizeof("std::basic_string<char, std::char_traits<char>, std::allocator<char> >") - 1;
3585
virtual size_t first_size() const
3591
virtual char* first_demangled_name(char* buf) const
3595
strncpy(buf, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >", ne);
3600
strncpy(buf, "std::string", n);
3606
virtual size_t base_size() const
3610
virtual char* get_base_name(char* buf) const
3612
strncpy(buf, "basic_string", 12);
3616
virtual __node* base_name() const
3618
const_cast<size_t&>(__size_) = true;
3619
return const_cast<__node*>(static_cast<const __node*>(this));
3626
static const ptrdiff_t n = sizeof("std::istream") - 1;
3629
virtual size_t first_size() const {return n;}
3630
virtual char* first_demangled_name(char* buf) const
3632
strncpy(buf, "std::istream", n);
3640
static const ptrdiff_t n = sizeof("std::ostream") - 1;
3643
virtual size_t first_size() const {return n;}
3644
virtual char* first_demangled_name(char* buf) const
3646
strncpy(buf, "std::ostream", n);
3651
class __sub_iostream
3654
static const ptrdiff_t n = sizeof("std::iostream") - 1;
3657
virtual size_t first_size() const {return n;}
3658
virtual char* first_demangled_name(char* buf) const
3660
strncpy(buf, "std::iostream", n);
3670
explicit __sub(__node* arg)
3674
explicit __sub(size_t arg)
3678
virtual size_t first_size() const
3680
return __left_->first_size();
3682
virtual char* first_demangled_name(char* buf) const
3684
return __left_->first_demangled_name(buf);
3686
virtual size_t second_size() const
3688
return __left_->second_size();
3690
virtual char* second_demangled_name(char* buf) const
3692
return __left_->second_demangled_name(buf);
3694
virtual bool ends_with_template(bool parsing = false) const
3696
return __left_->ends_with_template(parsing);
3698
virtual __node* base_name() const
3700
return __left_->base_name();
3702
virtual bool is_reference_or_pointer_to_function_or_array() const
3704
return __left_->is_reference_or_pointer_to_function_or_array();
3706
virtual bool is_function() const
3710
return __left_->is_function();
3712
virtual bool is_cv_qualifer() const
3714
return __left_->is_cv_qualifer();
3716
virtual bool is_ctor_dtor_conv() const
3718
return __left_->is_ctor_dtor_conv();
3720
virtual bool is_array() const
3722
return __left_->is_array();
3724
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3728
if (__size_ < static_cast<size_t>(t_end - t_begin))
3730
__left_ = t_begin[__size_];
3738
virtual size_t list_len() const
3740
return __left_->list_len();
3742
virtual bool is_sub() const
3748
class __unscoped_template_name
3752
__unscoped_template_name(__node* name, __node* args)
3753
{__left_ = name; __right_ = args;}
3755
virtual size_t first_size() const
3757
if (__cached_size_ == -1)
3758
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
3760
return static_cast<size_t>(__cached_size_);
3762
virtual char* first_demangled_name(char* buf) const
3764
buf = __left_->get_demangled_name(buf);
3765
return __right_->get_demangled_name(buf);
3767
virtual bool ends_with_template(bool parsing = false) const
3769
return __right_->ends_with_template(parsing);
3771
virtual __node* base_name() const
3773
return __left_->base_name();
3775
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3777
return __left_->fix_forward_references(t_begin, t_end) &&
3778
__right_->fix_forward_references(t_begin, t_end);
3782
// length == 0: __left_ == NULL
3783
// length == 1: __left_ != NULL, __right_ == NULL
3784
// length > 1: __left_ != NULL, __right_ != NULL
3789
explicit __list(__node* type)
3792
virtual size_t first_size() const
3794
if (__cached_size_ == -1)
3796
if (__left_ == NULL)
3797
const_cast<long&>(__cached_size_) = 0;
3798
else if (__right_ == NULL)
3799
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size());
3802
size_t off = __right_->size();
3805
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() + off);
3808
return static_cast<size_t>(__cached_size_);
3810
virtual char* first_demangled_name(char* buf) const
3812
if (__left_ != NULL)
3814
char* t = __left_->get_demangled_name(buf + (__size_ ? 2 : 0));
3817
else if (t != buf+2)
3824
buf = __right_->get_demangled_name(buf);
3828
virtual bool ends_with_template(bool parsing = false) const
3830
if (__right_ && __right_->size() > 0)
3832
return __right_->ends_with_template(parsing);
3834
else if (__left_ && __left_->size() > 0)
3836
return __left_->ends_with_template(parsing);
3840
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3844
r = r && __left_->fix_forward_references(t_begin, t_end);
3846
r = r && __right_->fix_forward_references(t_begin, t_end);
3849
virtual size_t list_len() const
3855
return 1 + __right_->list_len();
3859
class __template_args
3863
__template_args(__node* name, __node* list)
3869
virtual size_t first_size() const
3871
if (__cached_size_ == -1)
3876
if (__right_->ends_with_template())
3878
off += __right_->size();
3880
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() + off);
3882
return static_cast<size_t>(__cached_size_);
3884
virtual char* first_demangled_name(char* buf) const
3886
buf = __left_->get_demangled_name(buf);
3890
buf = __right_->get_demangled_name(buf);
3897
virtual bool ends_with_template(bool /*parsing*/ = false) const
3901
virtual __node* base_name() const
3903
return __left_->base_name();
3905
virtual bool is_ctor_dtor_conv() const
3907
return __left_->is_ctor_dtor_conv();
3909
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3911
bool r = __left_->fix_forward_references(t_begin, t_end);
3913
r = r && __right_->fix_forward_references(t_begin, t_end);
3918
class __function_args
3922
__function_args(__node* list)
3925
virtual size_t first_size() const
3927
if (__cached_size_ == -1)
3928
const_cast<long&>(__cached_size_) = static_cast<long>(2 + __right_->size());
3929
return static_cast<size_t>(__cached_size_);
3931
virtual char* first_demangled_name(char* buf) const
3934
buf = __right_->get_demangled_name(buf);
3938
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3940
return __right_->fix_forward_references(t_begin, t_end);
3944
class ___lambda_node
3948
___lambda_node(__node* params, const char *number, size_t number_size)
3952
__size_ = number_size;
3955
virtual size_t first_size() const
3957
if (__cached_size_ == -1)
3960
r += sizeof("'lambda'")-1;
3962
r += __right_->size();
3964
const_cast<long&>(__cached_size_) = static_cast<long>(r);
3966
return static_cast<size_t>(__cached_size_);
3968
virtual char* first_demangled_name(char* buf) const
3970
size_t n = sizeof("'lambda") - 1;
3971
strncpy(buf, "'lambda", n);
3975
strncpy(buf, __name_, __size_);
3981
buf = __right_->get_demangled_name(buf);
3985
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
3988
return __right_->fix_forward_references(t_begin, t_end);
3997
__unnamed(const char *number, size_t number_size)
4000
__size_ = number_size;
4003
virtual size_t first_size() const
4005
if (__cached_size_ == -1)
4008
r += sizeof("'unnamed'")-1;
4010
const_cast<long&>(__cached_size_) = static_cast<long>(r);
4012
return static_cast<size_t>(__cached_size_);
4014
virtual char* first_demangled_name(char* buf) const
4016
size_t n = sizeof("'unnamed") - 1;
4017
strncpy(buf, "'unnamed", n);
4021
strncpy(buf, __name_, __size_);
4029
class __cv_qualifiers
4033
__cv_qualifiers(size_t cv, __node* type)
4036
__size_ = __left_->is_function() ? cv << 5 : cv;
4039
virtual size_t first_size() const
4041
size_t s = __left_->first_size();
4043
s += sizeof(" restrict")-1;
4045
s += sizeof(" volatile")-1;
4047
s += sizeof(" const")-1;
4049
s += sizeof(" &")-1;
4051
s += sizeof(" &&")-1;
4054
virtual char* first_demangled_name(char* buf) const
4056
buf = __left_->first_demangled_name(buf);
4059
const size_t n = sizeof(" const")-1;
4060
strncpy(buf, " const", n);
4065
const size_t n = sizeof(" volatile")-1;
4066
strncpy(buf, " volatile", n);
4071
const size_t n = sizeof(" restrict")-1;
4072
strncpy(buf, " restrict", n);
4088
virtual size_t second_size() const
4090
size_t s = __left_->second_size();
4092
s += sizeof(" restrict")-1;
4094
s += sizeof(" volatile")-1;
4096
s += sizeof(" const")-1;
4098
s += sizeof(" &")-1;
4100
s += sizeof(" &&")-1;
4103
virtual char* second_demangled_name(char* buf) const
4105
buf = __left_->second_demangled_name(buf);
4108
const size_t n = sizeof(" const")-1;
4109
strncpy(buf, " const", n);
4114
const size_t n = sizeof(" volatile")-1;
4115
strncpy(buf, " volatile", n);
4120
const size_t n = sizeof(" restrict")-1;
4121
strncpy(buf, " restrict", n);
4137
virtual __node* base_name() const
4139
return __left_->base_name();
4141
virtual bool is_reference_or_pointer_to_function_or_array() const
4143
return __left_->is_reference_or_pointer_to_function_or_array();
4145
virtual bool is_function() const
4147
return __left_->is_function();
4149
virtual bool is_cv_qualifer() const
4153
virtual __node* extract_cv(__node*& rt) const
4158
return const_cast<__node*>(static_cast<const __node*>(this));
4162
virtual bool ends_with_template(bool parsing = false) const
4165
return __left_->ends_with_template(parsing);
4168
virtual bool is_ctor_dtor_conv() const
4170
return __left_->is_ctor_dtor_conv();
4172
virtual bool is_array() const
4174
return __left_->is_array();
4176
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4178
return __left_->fix_forward_references(t_begin, t_end);
4180
virtual size_t list_len() const
4182
return __left_->list_len();
4186
class __extended_qualifier
4190
__extended_qualifier(__node* name, __node* type)
4194
__size_ = __left_->is_function() ? 1 : 0;
4197
virtual size_t first_size() const
4199
size_t s = __left_->first_size();
4201
s += __right_->size() + 1;
4204
virtual char* first_demangled_name(char* buf) const
4206
buf = __left_->first_demangled_name(buf);
4210
buf = __right_->get_demangled_name(buf);
4214
virtual size_t second_size() const
4216
size_t s = __left_->second_size();
4218
s += __right_->size() + 1;
4221
virtual char* second_demangled_name(char* buf) const
4223
buf = __left_->second_demangled_name(buf);
4227
buf = __right_->get_demangled_name(buf);
4231
virtual __node* base_name() const
4233
return __left_->base_name();
4235
virtual bool is_reference_or_pointer_to_function_or_array() const
4237
return __left_->is_reference_or_pointer_to_function_or_array();
4239
virtual bool is_function() const
4241
return __left_->is_function();
4243
virtual bool is_cv_qualifer() const
4247
virtual __node* extract_cv(__node*& rt) const
4252
return const_cast<__node*>(static_cast<const __node*>(this));
4256
virtual bool ends_with_template(bool parsing = false) const
4258
return __left_->ends_with_template(parsing);
4260
virtual bool is_ctor_dtor_conv() const
4262
return __left_->is_ctor_dtor_conv();
4264
virtual bool is_array() const
4266
return __left_->is_array();
4268
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4270
return __left_->fix_forward_references(t_begin, t_end);
4272
virtual size_t list_len() const
4274
return __left_->list_len();
4283
__function(__node* name, __node* signature, size_t ret_goes_first = true)
4285
__size_ = ret_goes_first;
4287
__right_ = signature;
4290
virtual size_t first_size() const
4295
off = __right_->first_size();
4296
if (off > 0 && (__left_ == NULL ||
4297
!__right_->__left_->is_reference_or_pointer_to_function_or_array()))
4303
off += __left_->first_size();
4309
virtual size_t second_size() const
4312
if (__left_ == NULL)
4314
off += __right_->second_size();
4318
off += __right_->first_size();
4323
virtual char* first_demangled_name(char* buf) const
4327
const char* t = buf;
4328
buf = __right_->first_demangled_name(buf);
4329
if (buf != t && (__left_ == NULL ||
4330
!__right_->__left_->is_reference_or_pointer_to_function_or_array()))
4335
strncpy(buf, "auto ", 5);
4339
buf = __left_->first_demangled_name(buf);
4344
virtual char* second_demangled_name(char* buf) const
4346
if (__left_ == NULL)
4348
buf = __right_->second_demangled_name(buf);
4353
buf = __right_->first_demangled_name(buf);
4357
virtual char* get_demangled_name(char* buf) const
4361
const char* t = buf;
4362
buf = __right_->first_demangled_name(buf);
4363
if (buf != t && (__left_ == NULL ||
4364
!__right_->__left_->is_reference_or_pointer_to_function_or_array()))
4369
strncpy(buf, "auto ", 5);
4373
buf = __left_->first_demangled_name(buf);
4374
buf = __right_->second_demangled_name(buf);
4379
buf = __right_->first_demangled_name(buf);
4384
virtual size_t size() const
4386
if (__cached_size_ == -1)
4391
off = __right_->first_size();
4392
if (off > 0 && (__left_ == NULL ||
4393
!__right_->__left_->is_reference_or_pointer_to_function_or_array()))
4399
off += __left_->first_size();
4400
off += __right_->second_size();
4404
off += __right_->first_size();
4406
const_cast<long&>(__cached_size_) = static_cast<long>(off);
4408
return static_cast<size_t>(__cached_size_);
4411
virtual bool is_function() const
4415
virtual bool is_ctor_dtor_conv() const
4417
return __left_->is_ctor_dtor_conv();
4419
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4423
r = r && __left_->fix_forward_references(t_begin, t_end);
4424
r = r && __right_->fix_forward_references(t_begin, t_end);
4429
class __function_signature
4433
__function_signature(__node* ret, __node* args)
4438
virtual size_t first_size() const
4440
return __left_ ? __left_->first_size() : 0;
4443
virtual size_t second_size() const
4445
return 2 + (__right_ ? __right_->size() : 0)
4446
+ (__left_ ? __left_->second_size() : 0);
4449
virtual char* first_demangled_name(char* buf) const
4452
buf = __left_->first_demangled_name(buf);
4456
virtual char* second_demangled_name(char* buf) const
4460
buf = __right_->get_demangled_name(buf);
4463
buf = __left_->second_demangled_name(buf);
4466
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4470
r = r && __left_->fix_forward_references(t_begin, t_end);
4472
r = r && __right_->fix_forward_references(t_begin, t_end);
4482
explicit __pointer_to(__node* type)
4486
virtual size_t first_size() const
4488
return __left_->first_size() + (__left_->is_array() ? 3 : 1);
4490
virtual size_t second_size() const
4492
return __left_->second_size() + (__left_->is_array() ? 1 : 0);
4494
virtual char* first_demangled_name(char* buf) const
4496
buf = __left_->first_demangled_name(buf);
4497
if (__left_->is_array())
4507
virtual char* second_demangled_name(char* buf) const
4509
if (__left_->is_array())
4511
return __left_->second_demangled_name(buf);
4513
virtual __node* base_name() const
4515
return __left_->base_name();
4517
virtual bool is_reference_or_pointer_to_function_or_array() const
4519
return __left_->is_function() ||
4520
__left_->is_reference_or_pointer_to_function_or_array();
4522
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4524
return __left_->fix_forward_references(t_begin, t_end);
4526
virtual size_t list_len() const
4528
return __left_->list_len();
4532
class __lvalue_reference_to
4537
explicit __lvalue_reference_to(__node* type)
4541
virtual size_t first_size() const
4543
return __left_->first_size() + (__left_->is_array() ? 3 : 1);
4545
virtual size_t second_size() const
4547
return __left_->second_size() + (__left_->is_array() ? 1 : 0);
4549
virtual char* first_demangled_name(char* buf) const
4551
buf = __left_->first_demangled_name(buf);
4552
if (__left_->is_array())
4562
virtual char* second_demangled_name(char* buf) const
4564
if (__left_->is_array())
4566
return __left_->second_demangled_name(buf);
4568
virtual __node* base_name() const
4570
return __left_->base_name();
4572
virtual bool is_reference_or_pointer_to_function_or_array() const
4574
return __left_->is_function();
4576
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4578
return __left_->fix_forward_references(t_begin, t_end);
4580
virtual size_t list_len() const
4582
return __left_->list_len();
4586
class __rvalue_reference_to
4591
explicit __rvalue_reference_to(__node* type)
4595
virtual size_t first_size() const
4597
return __left_->first_size() + (__left_->is_array() ? 4 : 2);
4599
virtual size_t second_size() const
4601
return __left_->second_size() + (__left_->is_array() ? 1 : 0);
4603
virtual char* first_demangled_name(char* buf) const
4605
buf = __left_->first_demangled_name(buf);
4606
if (__left_->is_array())
4608
strncpy(buf, " (&&", 4);
4618
virtual char* second_demangled_name(char* buf) const
4620
if (__left_->is_array())
4622
return __left_->second_demangled_name(buf);
4624
virtual __node* base_name() const
4626
return __left_->base_name();
4628
virtual bool is_reference_or_pointer_to_function_or_array() const
4630
return __left_->is_function();
4632
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4634
return __left_->fix_forward_references(t_begin, t_end);
4636
virtual size_t list_len() const
4638
return __left_->list_len();
4645
static const size_t n = sizeof(" complex") - 1;
4648
explicit __d_complex(__node* type)
4652
virtual size_t first_size() const
4654
if (__cached_size_ == -1)
4655
const_cast<long&>(__cached_size_) = static_cast<long>(n + __left_->size());
4656
return static_cast<size_t>(__cached_size_);
4658
virtual char* first_demangled_name(char* buf) const
4660
buf = __left_->get_demangled_name(buf);
4661
strncpy(buf, " complex", n);
4664
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4666
return __left_->fix_forward_references(t_begin, t_end);
4673
static const size_t n = sizeof(" imaginary") - 1;
4676
explicit __imaginary(__node* type)
4680
virtual size_t first_size() const
4682
if (__cached_size_ == -1)
4683
const_cast<long&>(__cached_size_) = static_cast<long>(n + __left_->size());
4684
return static_cast<size_t>(__cached_size_);
4686
virtual char* first_demangled_name(char* buf) const
4688
buf = __left_->get_demangled_name(buf);
4689
strncpy(buf, " imaginary", n);
4692
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4694
return __left_->fix_forward_references(t_begin, t_end);
4698
class __pack_expansion
4703
explicit __pack_expansion(__node* type)
4707
virtual size_t first_size() const
4709
if (__cached_size_ == -1)
4711
size_t len = __left_->list_len();
4715
if (__left_->is_sub() || len == 1)
4716
off = __left_->size();
196
char num[float_data<Float>::max_demangled_size] = {0};
197
int n = snprintf(num, sizeof(num), float_data<Float>::spec, value);
198
if (static_cast<std::size_t>(n) >= sizeof(num))
200
db.names.push_back(typename C::String(num, static_cast<std::size_t>(n)));
207
// <source-name> ::= <positive length number> <identifier>
211
parse_source_name(const char* first, const char* last, C& db)
216
if (isdigit(c) && first+1 != last)
218
const char* t = first+1;
219
size_t n = static_cast<size_t>(c - '0');
220
for (c = *t; isdigit(c); c = *t)
222
n = n * 10 + static_cast<size_t>(c - '0');
226
if (static_cast<size_t>(last - t) >= n)
228
typename C::String r(t, n);
229
if (r.substr(0, 10) == "_GLOBAL__N")
230
db.names.push_back("(anonymous namespace)");
4719
__node* top = __left_;
4720
__node* bottom = top;
4721
while (!bottom->__left_->is_sub())
4722
bottom = bottom->__left_;
4723
__node* sub = bottom->__left_;
4724
__node* i = sub->__left_;
4726
top->reset_cached_size();
4731
bottom->__left_ = i->__left_;
4733
top->reset_cached_size();
4737
bottom->__left_ = sub;
4740
const_cast<long&>(__cached_size_) = static_cast<long>(off);
4742
return static_cast<size_t>(__cached_size_);
4744
virtual char* first_demangled_name(char* buf) const
4746
size_t len = __left_->list_len();
4749
if (__left_->is_sub() || len == 1)
4750
buf = __left_->get_demangled_name(buf);
4753
__node* top = __left_;
4754
__node* bottom = top;
4755
while (!bottom->__left_->is_sub())
4756
bottom = bottom->__left_;
4757
__node* sub = bottom->__left_;
4758
__node* i = sub->__left_;
4760
top->reset_cached_size();
4768
bottom->__left_ = i->__left_;
4769
buf = top->get_demangled_name(buf);
4770
top->reset_cached_size();
4774
bottom->__left_ = sub;
4779
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
4781
return __left_->fix_forward_references(t_begin, t_end);
4788
static const size_t n = sizeof("void") - 1;
4791
virtual size_t first_size() const {return n;}
4792
virtual char* first_demangled_name(char* buf) const
4794
strncpy(buf, "void", n);
4802
static const size_t n = sizeof("wchar_t") - 1;
4805
virtual size_t first_size() const {return n;}
4806
virtual char* first_demangled_name(char* buf) const
4808
strncpy(buf, "wchar_t", n);
4813
class __wchar_t_literal
4817
explicit __wchar_t_literal(const char* __first, const char* __last)
4820
__size_ = static_cast<size_t>(__last - __first);
4823
virtual size_t first_size() const
4827
virtual char* first_demangled_name(char* buf) const
4829
strncpy(buf, "(wchar_t)", 9);
4831
strncpy(buf, __name_, __size_);
4832
return buf + __size_;
4839
static const size_t n = sizeof("bool") - 1;
4842
virtual size_t first_size() const {return n;}
4843
virtual char* first_demangled_name(char* buf) const
4845
strncpy(buf, "bool", n);
4850
class __bool_literal
4854
explicit __bool_literal(const char* __name, unsigned __size)
4860
virtual size_t first_size() const
4864
virtual char* first_demangled_name(char* buf) const
4866
strncpy(buf, __name_, __size_);
4867
return buf + __size_;
4874
static const size_t n = sizeof("char") - 1;
4877
virtual size_t first_size() const {return n;}
4878
virtual char* first_demangled_name(char* buf) const
4880
strncpy(buf, "char", n);
4885
class __char_literal
4889
explicit __char_literal(const char* __first, const char* __last)
4892
__size_ = static_cast<size_t>(__last - __first);
4895
virtual size_t first_size() const
4899
virtual char* first_demangled_name(char* buf) const
4901
strncpy(buf, "(char)", 6);
4903
if (*__name_ == 'n')
4905
*buf++ = '-'; // strncpy(buf+6, "-", 1);
4906
strncpy(buf, __name_+1, __size_-1);
4911
strncpy(buf, __name_, __size_);
4921
static const size_t n = sizeof("signed char") - 1;
4924
virtual size_t first_size() const {return n;}
4925
virtual char* first_demangled_name(char* buf) const
4927
strncpy(buf, "signed char", n);
4932
class __signed_char_literal
4936
explicit __signed_char_literal(const char* __first, const char* __last)
4939
__size_ = static_cast<size_t>(__last - __first);
4942
virtual size_t first_size() const
4946
virtual char* first_demangled_name(char* buf) const
4948
strncpy(buf, "(signed char)", 13);
4950
if (*__name_ == 'n')
4953
strncpy(buf, __name_+1, __size_-1);
4958
strncpy(buf, __name_, __size_);
4965
class __unsigned_char
4968
static const size_t n = sizeof("unsigned char") - 1;
4971
virtual size_t first_size() const {return n;}
4972
virtual char* first_demangled_name(char* buf) const
4974
strncpy(buf, "unsigned char", n);
4979
class __unsigned_char_literal
4983
explicit __unsigned_char_literal(const char* __first, const char* __last)
4986
__size_ = static_cast<size_t>(__last - __first);
4989
virtual size_t first_size() const
4993
virtual char* first_demangled_name(char* buf) const
4995
strncpy(buf, "(unsigned char)", 15);
4997
strncpy(buf, __name_, __size_);
4998
return buf + __size_;
5005
static const size_t n = sizeof("short") - 1;
5008
virtual size_t first_size() const {return n;}
5009
virtual char* first_demangled_name(char* buf) const
5011
strncpy(buf, "short", n);
5016
class __short_literal
5020
explicit __short_literal(const char* __first, const char* __last)
5023
__size_ = static_cast<size_t>(__last - __first);
5026
virtual size_t first_size() const
5030
virtual char* first_demangled_name(char* buf) const
5032
strncpy(buf, "(short)", 7);
5034
if (*__name_ == 'n')
5037
strncpy(buf, __name_+1, __size_-1);
5042
strncpy(buf, __name_, __size_);
5049
class __unsigned_short
5052
static const size_t n = sizeof("unsigned short") - 1;
5055
virtual size_t first_size() const {return n;}
5056
virtual char* first_demangled_name(char* buf) const
5058
strncpy(buf, "unsigned short", n);
5063
class __unsigned_short_literal
5067
explicit __unsigned_short_literal(const char* __first, const char* __last)
5070
__size_ = static_cast<size_t>(__last - __first);
5073
virtual size_t first_size() const
5077
virtual char* first_demangled_name(char* buf) const
5079
strncpy(buf, "(unsigned short)", 16);
5081
strncpy(buf, __name_, __size_);
5082
return buf + __size_;
5089
static const size_t n = sizeof("int") - 1;
5092
virtual size_t first_size() const {return n;}
5093
virtual char* first_demangled_name(char* buf) const
5106
explicit __int_literal(const char* __first, const char* __last)
5109
__size_ = static_cast<size_t>(__last - __first);
5112
virtual size_t first_size() const
5116
virtual char* first_demangled_name(char* buf) const
5118
if (*__name_ == 'n')
5121
strncpy(buf, __name_+1, __size_-1);
5126
strncpy(buf, __name_, __size_);
5133
class __unsigned_int
5136
static const size_t n = sizeof("unsigned int") - 1;
5139
virtual size_t first_size() const {return n;}
5140
virtual char* first_demangled_name(char* buf) const
5142
strncpy(buf, "unsigned int", n);
5147
class __unsigned_int_literal
5151
explicit __unsigned_int_literal(const char* __first, const char* __last)
5154
__size_ = static_cast<size_t>(__last - __first);
5157
virtual size_t first_size() const
5161
virtual char* first_demangled_name(char* buf) const
5163
strncpy(buf, __name_, __size_);
5173
static const size_t n = sizeof("long") - 1;
5176
virtual size_t first_size() const {return n;}
5177
virtual char* first_demangled_name(char* buf) const
5179
strncpy(buf, "long", n);
5184
class __long_literal
5188
explicit __long_literal(const char* __first, const char* __last)
5191
__size_ = static_cast<size_t>(__last - __first);
5194
virtual size_t first_size() const
5198
virtual char* first_demangled_name(char* buf) const
5200
if (*__name_ == 'n')
5202
*buf++ = '-'; // strncpy(buf, "-", 1);
5203
strncpy(buf, __name_+1, __size_-1);
5208
strncpy(buf, __name_, __size_);
5216
class __unsigned_long
5219
static const size_t n = sizeof("unsigned long") - 1;
5222
virtual size_t first_size() const {return n;}
5223
virtual char* first_demangled_name(char* buf) const
5225
strncpy(buf, "unsigned long", n);
5230
class __unsigned_long_literal
5234
explicit __unsigned_long_literal(const char* __first, const char* __last)
5237
__size_ = static_cast<size_t>(__last - __first);
5240
virtual size_t first_size() const
5244
virtual char* first_demangled_name(char* buf) const
5246
strncpy(buf, __name_, __size_);
5257
static const size_t n = sizeof("long long") - 1;
5260
virtual size_t first_size() const {return n;}
5261
virtual char* first_demangled_name(char* buf) const
5263
strncpy(buf, "long long", n);
5268
class __long_long_literal
5272
explicit __long_long_literal(const char* __first, const char* __last)
5275
__size_ = static_cast<size_t>(__last - __first);
5278
virtual size_t first_size() const
5282
virtual char* first_demangled_name(char* buf) const
5284
if (*__name_ == 'n')
5287
strncpy(buf, __name_+1, __size_-1);
5292
strncpy(buf, __name_, __size_);
5301
class __unsigned_long_long
5304
static const size_t n = sizeof("unsigned long long") - 1;
5307
virtual size_t first_size() const {return n;}
5308
virtual char* first_demangled_name(char* buf) const
5310
strncpy(buf, "unsigned long long", n);
5315
class __unsigned_long_long_literal
5319
explicit __unsigned_long_long_literal(const char* __first, const char* __last)
5322
__size_ = static_cast<size_t>(__last - __first);
5325
virtual size_t first_size() const
5329
virtual char* first_demangled_name(char* buf) const
5331
strncpy(buf, __name_, __size_);
5340
class __signed_int128
5343
static const size_t n = sizeof("__int128") - 1;
5346
virtual size_t first_size() const {return n;}
5347
virtual char* first_demangled_name(char* buf) const
5349
strncpy(buf, "__int128", n);
5354
class __int128_literal
5358
explicit __int128_literal(const char* __first, const char* __last)
5361
__size_ = static_cast<size_t>(__last - __first);
5364
virtual size_t first_size() const
5368
virtual char* first_demangled_name(char* buf) const
5370
strncpy(buf, "(__int128)", 10);
5372
if (*__name_ == 'n')
5375
strncpy(buf, __name_+1, __size_-1);
5380
strncpy(buf, __name_, __size_);
5387
class __unsigned_int128
5390
static const size_t n = sizeof("unsigned __int128") - 1;
5393
virtual size_t first_size() const {return n;}
5394
virtual char* first_demangled_name(char* buf) const
5396
strncpy(buf, "unsigned __int128", n);
5401
class __unsigned_int128_literal
5405
explicit __unsigned_int128_literal(const char* __first, const char* __last)
5408
__size_ = static_cast<size_t>(__last - __first);
5411
virtual size_t first_size() const
5415
virtual char* first_demangled_name(char* buf) const
5417
strncpy(buf, "(unsigned __int128)", 19);
5419
strncpy(buf, __name_, __size_);
5420
return buf + __size_;
5424
class __float_literal
5428
explicit __float_literal(float value)
5433
virtual size_t first_size() const
5435
if (__cached_size_ == -1)
5438
float v = static_cast<float>(__value_);
5439
const_cast<long&>(__cached_size_) = sprintf(num, "%a", v)+1;
5441
return static_cast<size_t>(__cached_size_);
5443
virtual char* first_demangled_name(char* buf) const
5446
float v = static_cast<float>(__value_);
5447
int n = sprintf(num, "%a", v);
5448
strncpy(buf, num, static_cast<size_t>(n));
5458
static const size_t n = sizeof("float") - 1;
5461
virtual size_t first_size() const {return n;}
5462
virtual char* first_demangled_name(char* buf) const
5464
strncpy(buf, "float", n);
5469
class __double_literal
5473
explicit __double_literal(double value)
5478
virtual size_t first_size() const
5480
if (__cached_size_ == -1)
5483
double v = static_cast<double>(__value_);
5484
const_cast<long&>(__cached_size_) = sprintf(num, "%a", v);
5486
return static_cast<size_t>(__cached_size_);
5488
virtual char* first_demangled_name(char* buf) const
5491
double v = static_cast<double>(__value_);
5492
int n = sprintf(num, "%a", v);
5493
strncpy(buf, num, static_cast<size_t>(n));
5501
static const size_t n = sizeof("double") - 1;
5504
virtual size_t first_size() const {return n;}
5505
virtual char* first_demangled_name(char* buf) const
5507
strncpy(buf, "double", n);
5515
static const size_t n = sizeof("long double") - 1;
5518
virtual size_t first_size() const {return n;}
5519
virtual char* first_demangled_name(char* buf) const
5521
strncpy(buf, "long double", n);
5529
static const size_t n = sizeof("__float128") - 1;
5532
virtual size_t first_size() const {return n;}
5533
virtual char* first_demangled_name(char* buf) const
5535
strncpy(buf, "__float128", n);
5543
static const size_t n = sizeof("...") - 1;
5546
virtual size_t first_size() const {return n;}
5547
virtual char* first_demangled_name(char* buf) const
5559
static const size_t n = sizeof("decimal64") - 1;
5562
virtual size_t first_size() const {return n;}
5563
virtual char* first_demangled_name(char* buf) const
5565
strncpy(buf, "decimal64", n);
5573
static const size_t n = sizeof("decimal128") - 1;
5576
virtual size_t first_size() const {return n;}
5577
virtual char* first_demangled_name(char* buf) const
5579
strncpy(buf, "decimal128", n);
5587
static const size_t n = sizeof("decimal32") - 1;
5590
virtual size_t first_size() const {return n;}
5591
virtual char* first_demangled_name(char* buf) const
5593
strncpy(buf, "decimal32", n);
5601
static const size_t n = sizeof("decimal16") - 1;
5604
virtual size_t first_size() const {return n;}
5605
virtual char* first_demangled_name(char* buf) const
5607
strncpy(buf, "decimal16", n);
5615
static const size_t n = sizeof("char32_t") - 1;
5618
virtual size_t first_size() const {return n;}
5619
virtual char* first_demangled_name(char* buf) const
5621
strncpy(buf, "char32_t", n);
5629
static const size_t n = sizeof("char16_t") - 1;
5632
virtual size_t first_size() const {return n;}
5633
virtual char* first_demangled_name(char* buf) const
5635
strncpy(buf, "char16_t", n);
5643
static const size_t n = sizeof("auto") - 1;
5646
virtual size_t first_size() const {return n;}
5647
virtual char* first_demangled_name(char* buf) const
5649
strncpy(buf, "auto", n);
5657
static const size_t n = sizeof("std::nullptr_t") - 1;
5660
virtual size_t first_size() const {return n;}
5661
virtual char* first_demangled_name(char* buf) const
5663
strncpy(buf, "std::nullptr_t", n);
5673
explicit __array(__node* type)
5678
__array(__node* type, size_t dim)
5684
__array(__node* type, __node* dim)
5690
virtual size_t size() const
5692
if (__cached_size_ == -1)
5694
size_t r = __left_->size() + 3;
5696
r += __right_->size();
5697
else if (__size_ != 0)
5698
r += static_cast<size_t>(snprintf(0, 0, "%ld", __size_));
5699
const_cast<long&>(__cached_size_) = static_cast<long>(r);
5701
return static_cast<size_t>(__cached_size_);
5704
virtual char* get_demangled_name(char* buf) const
5706
buf = __left_->get_demangled_name(buf);
5710
buf = __right_->get_demangled_name(buf);
5711
else if (__size_ != 0)
5713
int rs = sprintf(buf, "%ld", __size_);
5720
virtual size_t first_size() const
5722
return __left_->first_size();
5725
virtual char* first_demangled_name(char* buf) const
5727
return __left_->first_demangled_name(buf);
5730
virtual size_t second_size() const
5732
size_t r = 2 + __left_->second_size();
5733
if (!__left_->is_array())
5736
r += __right_->size();
5737
else if (__size_ != 0)
5738
r += static_cast<size_t>(snprintf(0, 0, "%ld", __size_));
5742
virtual char* second_demangled_name(char* buf) const
5747
buf = __right_->get_demangled_name(buf);
5748
else if (__size_ != 0)
5750
int off = sprintf(buf, "%ld", __size_);
5754
buf = __left_->second_demangled_name(buf);
5760
virtual bool is_array() const
5764
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5766
bool r = __left_->fix_forward_references(t_begin, t_end);
5768
r = r && __right_->fix_forward_references(t_begin, t_end);
5773
class __pointer_to_member_type
5778
__pointer_to_member_type(__node* class_type, __node* member_type)
5780
__left_ = class_type;
5781
__right_ = member_type;
5784
virtual size_t first_size() const
5786
if (__cached_size_ == -1)
5787
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() + 3
5788
+ __right_->first_size()
5789
+ __right_->second_size());
5790
return static_cast<size_t>(__cached_size_);
5792
virtual char* first_demangled_name(char* buf) const
5794
buf = __right_->first_demangled_name(buf);
5795
buf = __left_->get_demangled_name(buf);
5799
return __right_->second_demangled_name(buf);
5801
virtual __node* base_name() const
5803
return __left_->base_name();
5805
virtual bool is_reference_or_pointer_to_function_or_array() const
5807
return __right_->is_function();
5809
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5811
return __left_->fix_forward_references(t_begin, t_end) &&
5812
__right_->fix_forward_references(t_begin, t_end);
5816
class __decltype_node
5821
explicit __decltype_node(__node* expr)
5826
virtual size_t first_size() const
5828
if (__cached_size_ == -1)
5829
const_cast<long&>(__cached_size_) = static_cast<long>(10 + __right_->size());
5830
return static_cast<size_t>(__cached_size_);
5833
virtual char* first_demangled_name(char* buf) const
5835
strncpy(buf, "decltype(", 9);
5837
buf = __right_->get_demangled_name(buf);
5841
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5843
return __right_->fix_forward_references(t_begin, t_end);
5847
class __nested_delimeter
5852
explicit __nested_delimeter(__node* prev, __node* arg)
5858
virtual size_t first_size() const
5860
if (__cached_size_ == -1)
5861
const_cast<long&>(__cached_size_) = static_cast<long>(__left_->size() +
5862
__right_->size() + 2);
5863
return static_cast<size_t>(__cached_size_);
5866
virtual char* first_demangled_name(char* buf) const
5868
buf = __left_->get_demangled_name(buf);
5871
return __right_->get_demangled_name(buf);
5874
virtual bool ends_with_template(bool parsing = false) const
5876
return __right_->ends_with_template(parsing);
5878
virtual __node* base_name() const
5880
return __right_->base_name();
5882
virtual bool is_ctor_dtor_conv() const
5884
return __right_->is_ctor_dtor_conv();
5886
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5888
return __left_->fix_forward_references(t_begin, t_end) &&
5889
__right_->fix_forward_references(t_begin, t_end);
5891
virtual __node* extract_cv(__node*&) const
5893
return __right_->extract_cv(const_cast<__node*&>(__right_));
5897
class __unresolved_name
5902
__unresolved_name(__node* prev, __node* arg)
5908
__unresolved_name(bool global, __node* prev, __node* arg)
5915
virtual size_t first_size() const
5917
if (__cached_size_ == -1)
5918
const_cast<long&>(__cached_size_) = static_cast<long>((__left_ ?
5919
__left_->size() + 2 : 0) +
5920
__right_->size() + __size_ * 2);
5921
return static_cast<size_t>(__cached_size_);
5924
virtual char* first_demangled_name(char* buf) const
5933
buf = __left_->get_demangled_name(buf);
5937
return __right_->get_demangled_name(buf);
5940
virtual bool ends_with_template(bool parsing = false) const
5942
return __right_->ends_with_template(parsing);
5944
virtual __node* base_name() const
5946
return __right_->base_name();
5948
virtual bool is_ctor_dtor_conv() const
5950
return __right_->is_ctor_dtor_conv();
5952
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
5956
r = __left_->fix_forward_references(t_begin, t_end);
5957
return r && __right_->fix_forward_references(t_begin, t_end);
5959
virtual __node* extract_cv(__node*&) const
5961
return __right_->extract_cv(const_cast<__node*&>(__right_));
5965
class __string_literal
5970
virtual size_t first_size() const
5975
virtual char* first_demangled_name(char* buf) const
5977
strncpy(buf, "string literal", 14);
5987
explicit __constructor(__node* name)
5992
virtual size_t first_size() const
5994
if (__cached_size_ == -1)
5995
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->base_size());
5996
return static_cast<size_t>(__cached_size_);
5999
virtual char* first_demangled_name(char* buf) const
6001
return __right_->get_base_name(buf);
6003
virtual __node* base_name() const
6005
return __right_->base_name();
6007
virtual bool ends_with_template(bool parsing = false) const
6009
return __right_->ends_with_template(parsing);
6011
virtual bool is_ctor_dtor_conv() const
6015
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6017
return __right_->fix_forward_references(t_begin, t_end);
6026
explicit __destructor(__node* name)
6031
virtual size_t first_size() const
6033
if (__cached_size_ == -1)
6034
const_cast<long&>(__cached_size_) = static_cast<long>(__right_->base_size() + 1);
6035
return static_cast<size_t>(__cached_size_);
6038
virtual char* first_demangled_name(char* buf) const
6041
return __right_->get_base_name(buf);
6043
virtual __node* base_name() const
6045
return __right_->base_name();
6047
virtual bool is_ctor_dtor_conv() const
6051
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6053
return __right_->fix_forward_references(t_begin, t_end);
6061
__dot_suffix(__node* name, const char* suffix, size_t sz)
6068
virtual size_t first_size() const
6070
if (__cached_size_ == -1)
6072
size_t off = __left_->size();
6074
const_cast<long&>(__cached_size_) = static_cast<long>(off);
6076
return static_cast<size_t>(__cached_size_);
6078
virtual char* first_demangled_name(char* buf) const
6080
buf = __left_->get_demangled_name(buf);
6083
strncpy(buf, __name_, __size_);
6088
virtual __node* base_name() const
6090
return __left_->base_name();
6092
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6094
return __left_->fix_forward_references(t_begin, t_end);
6102
__vector_type(__node* type, const char* num, size_t sz)
6109
__vector_type(__node* type, __node* num)
6115
virtual size_t first_size() const
6117
if (__cached_size_ == -1)
6121
off = __left_->size();
6124
off += __right_->size();
6125
else if (__size_ > 0)
6127
const_cast<long&>(__cached_size_) = static_cast<long>(off);
6129
return static_cast<size_t>(__cached_size_);
6131
virtual char* first_demangled_name(char* buf) const
6134
buf = __left_->get_demangled_name(buf);
6137
strncpy(buf, "pixel", 5);
6140
strncpy(buf, " vector[", 8);
6143
buf = __right_->get_demangled_name(buf);
6144
else if (__size_ > 0)
6146
strncpy(buf, __name_, __size_);
6152
virtual __node* base_name() const
6155
return __left_->base_name();
6158
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
6162
r = __left_->fix_forward_references(t_begin, t_end);
6164
r = r && __right_->fix_forward_references(t_begin, t_end);
6170
enum {invalid_args = -3, invalid_mangled_name, memory_alloc_failure, success,
6171
not_yet_implemented};
6173
__demangle_tree::__demangle_tree(const char* mangled_name, char* buf, size_t bs)
6174
: __mangled_name_begin_(0), __mangled_name_end_(0),
6175
__status_(invalid_mangled_name), __root_(0),
6176
__node_begin_(0), __node_end_(0), __node_cap_(0),
6177
__sub_begin_(0), __sub_end_(0), __sub_cap_(0),
6178
__t_begin_(0), __t_end_(0), __t_cap_(0),
6179
__tag_templates_(true),
6180
__fix_forward_references_(false)
6182
size_t n = strlen(mangled_name);
6183
size_t ms = n + 2*n*sizeof(__node) + 2*n*sizeof(__node*);
6188
__owns_buf_ = false;
6192
m = static_cast<char*>(malloc(ms));
6197
__status_ = memory_alloc_failure;
6200
__node_begin_ = __node_end_ = (__node*)(m);
6201
__node_cap_ = __node_begin_ + 2*n;
6202
__sub_begin_ = __sub_end_ = (__node**)(__node_cap_);
6203
__sub_cap_ = __sub_begin_ + n;
6204
__t_begin_ = __t_end_ = (__node**)(__sub_cap_);
6205
__t_cap_ = __t_begin_ + n;
6206
__mangled_name_begin_ = (const char*)(__t_cap_);
6207
__mangled_name_end_ = __mangled_name_begin_ + n;
6208
strncpy(const_cast<char*>(__mangled_name_begin_), mangled_name, n);
6211
__demangle_tree::~__demangle_tree()
6214
free(__node_begin_);
6217
__demangle_tree::__demangle_tree(__demangle_tree& t)
6218
: __mangled_name_begin_(t.__mangled_name_begin_),
6219
__mangled_name_end_(t.__mangled_name_end_),
6220
__status_(t.__status_), __root_(t.__root_),
6221
__node_begin_(t.__node_begin_), __node_end_(t.__node_end_),
6222
__node_cap_(t.__node_cap_),
6223
__sub_begin_(t.__sub_begin_), __sub_end_(t.__sub_end_),
6224
__sub_cap_(t.__sub_cap_),
6225
__t_begin_(t.__t_begin_), __t_end_(t.__t_end_),
6226
__t_cap_(t.__t_cap_),
6227
__tag_templates_(t.__tag_templates_),
6228
__fix_forward_references_(t.__fix_forward_references_),
6229
__owns_buf_(t.__owns_buf_)
6231
t.__mangled_name_begin_ = 0;
6232
t.__mangled_name_end_ = 0;
6233
t.__status_ = invalid_mangled_name;
6235
t.__node_begin_ = t.__node_end_ = t.__node_cap_ = 0;
6236
t.__sub_begin_ = t.__sub_end_ = t.__sub_cap_ = 0;
6237
t.__t_begin_ = t.__t_end_ = t.__t_cap_ = 0;
6238
t.__owns_buf_ = false;
6241
__demangle_tree::__demangle_tree(__demangle_tree_rv rv)
6242
: __mangled_name_begin_(rv.ptr_->__mangled_name_begin_),
6243
__mangled_name_end_(rv.ptr_->__mangled_name_end_),
6244
__status_(rv.ptr_->__status_), __root_(rv.ptr_->__root_),
6245
__node_begin_(rv.ptr_->__node_begin_), __node_end_(rv.ptr_->__node_end_),
6246
__node_cap_(rv.ptr_->__node_cap_),
6247
__sub_begin_(rv.ptr_->__sub_begin_), __sub_end_(rv.ptr_->__sub_end_),
6248
__sub_cap_(rv.ptr_->__sub_cap_),
6249
__t_begin_(rv.ptr_->__t_begin_), __t_end_(rv.ptr_->__t_end_),
6250
__t_cap_(rv.ptr_->__t_cap_),
6251
__tag_templates_(rv.ptr_->__tag_templates_),
6252
__fix_forward_references_(rv.ptr_->__fix_forward_references_),
6253
__owns_buf_(rv.ptr_->__owns_buf_)
6255
rv.ptr_->__mangled_name_begin_ = 0;
6256
rv.ptr_->__mangled_name_end_ = 0;
6257
rv.ptr_->__status_ = invalid_mangled_name;
6258
rv.ptr_->__root_ = 0;
6259
rv.ptr_->__node_begin_ = rv.ptr_->__node_end_ = rv.ptr_->__node_cap_ = 0;
6260
rv.ptr_->__sub_begin_ = rv.ptr_->__sub_end_ = rv.ptr_->__sub_cap_ = 0;
6261
rv.ptr_->__t_begin_ = rv.ptr_->__t_end_ = rv.ptr_->__t_cap_ = 0;
6262
rv.ptr_->__owns_buf_ = false;
6266
__demangle_tree::__status() const
6272
__demangle_tree::size() const
6274
return __status_ == success ? __root_->size() : 0;
6278
__demangle_tree::__get_demangled_name(char* buf) const
6280
if (__status_ == success)
6281
return __root_->get_demangled_name(buf);
6285
template <class _Tp>
6287
__demangle_tree::__make()
6289
if (__node_end_ < __node_cap_)
6291
::new (__node_end_) _Tp();
6292
__root_ = __node_end_;
6296
__status_ = memory_alloc_failure;
6300
template <class _Tp, class _A0>
6302
__demangle_tree::__make(_A0 __a0)
6304
if (__node_end_ < __node_cap_)
6306
::new (__node_end_) _Tp(__a0);
6307
__root_ = __node_end_;
6311
__status_ = memory_alloc_failure;
6315
template <class _Tp, class _A0, class _A1>
6317
__demangle_tree::__make(_A0 __a0, _A1 __a1)
6319
if (__node_end_ < __node_cap_)
6321
::new (__node_end_) _Tp(__a0, __a1);
6322
__root_ = __node_end_;
6326
__status_ = memory_alloc_failure;
6330
template <class _Tp, class _A0, class _A1, class _A2>
6332
__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2)
6334
if (__node_end_ < __node_cap_)
6336
::new (__node_end_) _Tp(__a0, __a1, __a2);
6337
__root_ = __node_end_;
6341
__status_ = memory_alloc_failure;
6345
template <class _Tp, class _A0, class _A1, class _A2, class _A3>
6347
__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3)
6349
if (__node_end_ < __node_cap_)
6351
::new (__node_end_) _Tp(__a0, __a1, __a2, __a3);
6352
__root_ = __node_end_;
6356
__status_ = memory_alloc_failure;
6360
template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4>
6362
__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4)
6364
if (__node_end_ < __node_cap_)
6366
::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4);
6367
__root_ = __node_end_;
6371
__status_ = memory_alloc_failure;
6375
template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4,
6378
__demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4,
6381
if (__node_end_ < __node_cap_)
6383
::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4, __a5);
6384
__root_ = __node_end_;
6388
__status_ = memory_alloc_failure;
6392
// <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
6393
// [R | O] # & or &&
232
db.names.push_back(std::move(r));
240
// <substitution> ::= S <seq-id> _
242
// <substitution> ::= Sa # ::std::allocator
243
// <substitution> ::= Sb # ::std::basic_string
244
// <substitution> ::= Ss # ::std::basic_string < char,
245
// ::std::char_traits<char>,
246
// ::std::allocator<char> >
247
// <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> >
248
// <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> >
249
// <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> >
6396
__demangle_tree::__parse_cv_qualifiers(const char* first, const char* last,
6397
unsigned& cv, bool look_for_ref_quals)
253
parse_substitution(const char* first, const char* last, C& db)
6399
if (look_for_ref_quals)
6401
for (; first != last; ++first)
6427
for (; first != last; ++first)
255
if (last - first >= 2)
262
db.names.push_back("std::allocator");
266
db.names.push_back("std::basic_string");
270
db.names.push_back("std::string");
274
db.names.push_back("std::istream");
278
db.names.push_back("std::ostream");
282
db.names.push_back("std::iostream");
286
if (!db.subs.empty())
288
for (const auto& n : db.subs.front())
289
db.names.push_back(n);
294
if (std::isdigit(first[1]) || std::isupper(first[1]))
297
const char* t = first+1;
298
if (std::isdigit(*t))
299
sub = static_cast<size_t>(*t - '0');
301
sub = static_cast<size_t>(*t - 'A') + 10;
302
for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
305
if (std::isdigit(*t))
306
sub += static_cast<size_t>(*t - '0');
308
sub += static_cast<size_t>(*t - 'A') + 10;
310
if (t == last || *t != '_')
313
if (sub < db.subs.size())
315
for (const auto& n : db.subs[sub])
316
db.names.push_back(n);
8407
1862
// ::= G <type> # imaginary (C 2000)
8408
1863
// ::= Dp <type> # pack expansion (C++0x)
8409
1864
// ::= U <source-name> <type> # vendor extended type qualifier
1865
// extension := U <objc-name> <objc-type> # objc-type<identifier>
8410
1866
// extension := <vector-type> # <vector-type> starts with Dv
1868
// <objc-name> ::= <k0 number> objcproto <k1 number> <identifier> # k0 = 9 + <number of digits in k1> + k1
1869
// <objc-type> := <source-name> # PU<11+>objcproto 11objc_object<source-name> 11objc_object -> id<source-name>
8413
__demangle_tree::__parse_type(const char* first, const char* last,
8414
bool try_to_parse_template_args,
8415
bool look_for_ref_quals)
1873
parse_type(const char* first, const char* last, C& db)
8418
const char* t = __parse_cv_qualifiers(first, last, cv, look_for_ref_quals);
8421
const char* t2 = __parse_type(t, last, try_to_parse_template_args);
8424
if (__make<__cv_qualifiers>(cv, __root_))
8426
if (__sub_end_ == __sub_cap_)
8427
__status_ = memory_alloc_failure;
8430
*__sub_end_++ = __root_;
8437
1875
if (first != last)
8439
1877
switch (*first)
8442
t = __parse_array_type(first, last);
8445
if (__sub_end_ == __sub_cap_)
8446
__status_ = memory_alloc_failure;
8449
*__sub_end_++ = __root_;
8455
t = __parse_type(first+1, last, try_to_parse_template_args);
8458
if (__make<__d_complex>(__root_))
8460
if (__sub_end_ == __sub_cap_)
8461
__status_ = memory_alloc_failure;
8464
*__sub_end_++ = __root_;
8472
t = __parse_function_type(first, last);
8475
if (__sub_end_ == __sub_cap_)
8476
__status_ = memory_alloc_failure;
8479
*__sub_end_++ = __root_;
8485
t = __parse_type(first+1, last, try_to_parse_template_args);
8488
if (__make<__imaginary>(__root_))
8490
if (__sub_end_ == __sub_cap_)
8491
__status_ = memory_alloc_failure;
8494
*__sub_end_++ = __root_;
8502
t = __parse_pointer_to_member_type(first, last);
8505
if (__sub_end_ == __sub_cap_)
8506
__status_ = memory_alloc_failure;
8509
*__sub_end_++ = __root_;
8515
t = __parse_type(first+1, last, try_to_parse_template_args);
8518
if (__make<__rvalue_reference_to>(__root_))
8520
if (__sub_end_ == __sub_cap_)
8521
__status_ = memory_alloc_failure;
8524
*__sub_end_++ = __root_;
8532
t = __parse_type(first+1, last, try_to_parse_template_args);
8535
if (__make<__pointer_to>(__root_))
8537
if (__sub_end_ == __sub_cap_)
8538
__status_ = memory_alloc_failure;
8541
*__sub_end_++ = __root_;
8549
t = __parse_type(first+1, last, try_to_parse_template_args);
8552
if (__make<__lvalue_reference_to>(__root_))
8554
if (__sub_end_ == __sub_cap_)
8555
__status_ = memory_alloc_failure;
8558
*__sub_end_++ = __root_;
1884
const char* t = parse_cv_qualifiers(first, last, cv);
1887
bool is_function = *t == 'F';
1888
size_t k0 = db.names.size();
1889
const char* t1 = parse_type(t, last, db);
1890
size_t k1 = db.names.size();
1895
db.subs.emplace_back(db.names.get_allocator());
1896
for (size_t k = k0; k < k1; ++k)
1900
size_t p = db.names[k].second.size();
1901
if (db.names[k].second[p-2] == '&')
1903
else if (db.names[k].second.back() == '&')
1907
db.names[k].second.insert(p, " const");
1912
db.names[k].second.insert(p, " volatile");
1916
db.names[k].second.insert(p, " restrict");
1921
db.names[k].first.append(" const");
1923
db.names[k].first.append(" volatile");
1925
db.names[k].first.append(" restrict");
1927
db.subs.back().push_back(db.names[k]);
1936
const char* t = parse_builtin_type(first, last, db);
1946
t = parse_array_type(first, last, db);
1949
if (db.names.empty())
1952
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1956
t = parse_type(first+1, last, db);
1959
if (db.names.empty())
1961
db.names.back().first.append(" complex");
1963
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1967
t = parse_function_type(first, last, db);
1970
if (db.names.empty())
1973
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1977
t = parse_type(first+1, last, db);
1980
if (db.names.empty())
1982
db.names.back().first.append(" imaginary");
1984
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1988
t = parse_pointer_to_member_type(first, last, db);
1991
if (db.names.empty())
1994
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1999
size_t k0 = db.names.size();
2000
t = parse_type(first+1, last, db);
2001
size_t k1 = db.names.size();
2004
db.subs.emplace_back(db.names.get_allocator());
2005
for (size_t k = k0; k < k1; ++k)
2007
if (db.names[k].second.substr(0, 2) == " [")
2009
db.names[k].first += " (";
2010
db.names[k].second.insert(0, ")");
2012
else if (db.names[k].second.front() == '(')
2014
db.names[k].first += "(";
2015
db.names[k].second.insert(0, ")");
2017
db.names[k].first.append("&&");
2018
db.subs.back().push_back(db.names[k]);
2026
size_t k0 = db.names.size();
2027
t = parse_type(first+1, last, db);
2028
size_t k1 = db.names.size();
2031
db.subs.emplace_back(db.names.get_allocator());
2032
for (size_t k = k0; k < k1; ++k)
2034
if (db.names[k].second.substr(0, 2) == " [")
2036
db.names[k].first += " (";
2037
db.names[k].second.insert(0, ")");
2039
else if (db.names[k].second.front() == '(')
2041
db.names[k].first += "(";
2042
db.names[k].second.insert(0, ")");
2044
if (first[1] != 'U' || db.names[k].first.substr(0, 12) != "objc_object<")
2046
db.names[k].first.append("*");
2050
db.names[k].first.replace(0, 11, "id");
2052
db.subs.back().push_back(db.names[k]);
2060
size_t k0 = db.names.size();
2061
t = parse_type(first+1, last, db);
2062
size_t k1 = db.names.size();
2065
db.subs.emplace_back(db.names.get_allocator());
2066
for (size_t k = k0; k < k1; ++k)
2068
if (db.names[k].second.substr(0, 2) == " [")
2070
db.names[k].first += " (";
2071
db.names[k].second.insert(0, ")");
2073
else if (db.names[k].second.front() == '(')
2075
db.names[k].first += "(";
2076
db.names[k].second.insert(0, ")");
2078
db.names[k].first.append("&");
2079
db.subs.back().push_back(db.names[k]);
2087
size_t k0 = db.names.size();
2088
t = parse_template_param(first, last, db);
2089
size_t k1 = db.names.size();
2092
db.subs.emplace_back(db.names.get_allocator());
2093
for (size_t k = k0; k < k1; ++k)
2094
db.subs.back().push_back(db.names[k]);
2095
if (db.try_to_parse_template_args && k1 == k0+1)
2097
const char* t1 = parse_template_args(t, last, db);
2100
auto args = db.names.back().move_full();
2101
db.names.pop_back();
2102
db.names.back().first += std::move(args);
2103
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2112
if (first+1 != last)
2114
t = parse_source_name(first+1, last, db);
2117
const char* t2 = parse_type(t, last, db);
2120
if (db.names.size() < 2)
2122
auto type = db.names.back().move_full();
2123
db.names.pop_back();
2124
if (db.names.back().first.substr(0, 9) != "objcproto")
2126
db.names.back() = type + " " + db.names.back().move_full();
2130
auto proto = db.names.back().move_full();
2131
db.names.pop_back();
2132
t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
2133
if (t != proto.data() + 9)
2135
db.names.back() = type + "<" + db.names.back().move_full() + ">";
2139
db.names.push_back(type + " " + proto);
2142
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2149
if (first+1 != last && first[1] == 't')
2151
t = parse_name(first, last, db);
2154
if (db.names.empty())
2156
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2162
t = parse_substitution(first, last, db);
2166
// Parsed a substitution. If the substitution is a
2167
// <template-param> it might be followed by <template-args>.
2168
t = parse_template_args(first, last, db);
2171
if (db.names.size() < 2)
2173
auto template_args = db.names.back().move_full();
2174
db.names.pop_back();
2175
db.names.back().first += template_args;
2176
// Need to create substitution for <template-template-param> <template-args>
2177
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2184
if (first+1 != last)
2190
size_t k0 = db.names.size();
2191
t = parse_type(first+2, last, db);
2192
size_t k1 = db.names.size();
2195
db.subs.emplace_back(db.names.get_allocator());
2196
for (size_t k = k0; k < k1; ++k)
2197
db.subs.back().push_back(db.names[k]);
2205
t = parse_decltype(first, last, db);
2208
if (db.names.empty())
2210
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2216
t = parse_vector_type(first, last, db);
2219
if (db.names.empty())
2221
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2230
// must check for builtin-types before class-enum-types to avoid
2231
// ambiguities with operator-names
2232
t = parse_builtin_type(first, last, db);
2239
t = parse_name(first, last, db);
2242
if (db.names.empty())
2244
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2260
// ::= ad # & (unary)
2267
// ::= cv <type> # (cast)
2268
// ::= da # delete[]
2269
// ::= de # * (unary)
2280
// ::= li <source-name> # operator ""
2288
// ::= mm # -- (postfix in <expression> context)
2291
// ::= ng # - (unary)
2300
// ::= pp # ++ (postfix in <expression> context)
2301
// ::= ps # + (unary)
2308
// ::= v <digit> <source-name> # vendor extended operator
2312
parse_operator_name(const char* first, const char* last, C& db)
2314
if (last - first >= 2)
2322
db.names.push_back("operator&&");
2327
db.names.push_back("operator&");
2331
db.names.push_back("operator&=");
2335
db.names.push_back("operator=");
2344
db.names.push_back("operator()");
2348
db.names.push_back("operator,");
2352
db.names.push_back("operator~");
2357
bool try_to_parse_template_args = db.try_to_parse_template_args;
2358
db.try_to_parse_template_args = false;
2359
const char* t = parse_type(first+2, last, db);
2360
db.try_to_parse_template_args = try_to_parse_template_args;
2363
if (db.names.empty())
2365
db.names.back().first.insert(0, "operator ");
2366
db.parsed_ctor_dtor_cv = true;
2377
db.names.push_back("operator delete[]");
2381
db.names.push_back("operator*");
2385
db.names.push_back("operator delete");
2389
db.names.push_back("operator/");
2393
db.names.push_back("operator/=");
2402
db.names.push_back("operator^");
2406
db.names.push_back("operator^=");
2410
db.names.push_back("operator==");
2419
db.names.push_back("operator>=");
2423
db.names.push_back("operator>");
2429
if (first[1] == 'x')
2431
db.names.push_back("operator[]");
2439
db.names.push_back("operator<=");
2444
const char* t = parse_source_name(first+2, last, db);
2447
if (db.names.empty())
2449
db.names.back().first.insert(0, "operator\"\" ");
2455
db.names.push_back("operator<<");
2459
db.names.push_back("operator<<=");
2463
db.names.push_back("operator<");
2472
db.names.push_back("operator-");
2476
db.names.push_back("operator-=");
2480
db.names.push_back("operator*");
2484
db.names.push_back("operator*=");
2488
db.names.push_back("operator--");
2497
db.names.push_back("operator new[]");
2501
db.names.push_back("operator!=");
2505
db.names.push_back("operator-");
2509
db.names.push_back("operator!");
2513
db.names.push_back("operator new");
2522
db.names.push_back("operator||");
2526
db.names.push_back("operator|");
2530
db.names.push_back("operator|=");
2539
db.names.push_back("operator->*");
2543
db.names.push_back("operator+");
2547
db.names.push_back("operator+=");
2551
db.names.push_back("operator++");
2555
db.names.push_back("operator+");
2559
db.names.push_back("operator->");
2565
if (first[1] == 'u')
2567
db.names.push_back("operator?");
2575
db.names.push_back("operator%");
2579
db.names.push_back("operator%=");
2583
db.names.push_back("operator>>");
2587
db.names.push_back("operator>>=");
2593
if (std::isdigit(first[1]))
2595
const char* t = parse_source_name(first+2, last, db);
2598
if (db.names.empty())
2600
db.names.back().first.insert(0, "operator ");
2612
parse_integer_literal(const char* first, const char* last, const typename C::String& lit, C& db)
2614
const char* t = parse_number(first, last);
2615
if (t != first && t != last && *t == 'E')
2618
db.names.push_back("(" + lit + ")");
2620
db.names.emplace_back();
2623
db.names.back().first += '-';
2626
db.names.back().first.append(first, t);
2627
if (lit.size() <= 3)
2628
db.names.back().first += lit;
2634
// <expr-primary> ::= L <type> <value number> E # integer literal
2635
// ::= L <type> <value float> E # floating literal
2636
// ::= L <string type> E # string literal
2637
// ::= L <nullptr type> E # nullptr literal (i.e., "LDnE")
2638
// ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000)
2639
// ::= L <mangled-name> E # external name
2643
parse_expr_primary(const char* first, const char* last, C& db)
2645
if (last - first >= 4 && *first == 'L')
2651
const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
2657
if (first[3] == 'E')
2662
db.names.push_back("false");
2666
db.names.push_back("true");
2674
const char* t = parse_integer_literal(first+2, last, "char", db);
2681
const char* t = parse_integer_literal(first+2, last, "signed char", db);
2688
const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
2695
const char* t = parse_integer_literal(first+2, last, "short", db);
2702
const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
2709
const char* t = parse_integer_literal(first+2, last, "", db);
2716
const char* t = parse_integer_literal(first+2, last, "u", db);
2723
const char* t = parse_integer_literal(first+2, last, "l", db);
2730
const char* t = parse_integer_literal(first+2, last, "ul", db);
2737
const char* t = parse_integer_literal(first+2, last, "ll", db);
2744
const char* t = parse_integer_literal(first+2, last, "ull", db);
2751
const char* t = parse_integer_literal(first+2, last, "__int128", db);
2758
const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
2765
const char* t = parse_floating_number<float>(first+2, last, db);
2772
const char* t = parse_floating_number<double>(first+2, last, db);
2779
const char* t = parse_floating_number<long double>(first+2, last, db);
2785
if (first[2] == 'Z')
2787
const char* t = parse_encoding(first+3, last, db);
2788
if (t != first+3 && t != last && *t == 'E')
8566
t = __parse_template_param(first, last);
2793
// Invalid mangled name per
2794
// http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html
2798
// might be named type
2799
const char* t = parse_type(first+1, last, db);
2800
if (t != first+1 && t != last)
2805
for (; n != last && isdigit(*n); ++n)
2807
if (n != t && n != last && *n == 'E')
2809
if (db.names.empty())
2811
db.names.back() = "(" + db.names.back().move_full() + ")" + typename C::String(t, n);
2828
template <class String>
2830
base_name(String& s)
2834
if (s == "std::string")
2836
s = "std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
2837
return "basic_string";
2839
if (s == "std::istream")
2841
s = "std::basic_istream<char, std::char_traits<char> >";
2842
return "basic_istream";
2844
if (s == "std::ostream")
2846
s = "std::basic_ostream<char, std::char_traits<char> >";
2847
return "basic_ostream";
2849
if (s == "std::iostream")
2851
s = "std::basic_iostream<char, std::char_traits<char> >";
2852
return "basic_iostream";
2854
const char* const pf = s.data();
2855
const char* pe = pf + s.size();
2871
else if (pe[-1] == '>')
2875
const char* p0 = pe - 1;
2876
for (; p0 != pf; --p0)
2884
return String(p0, pe);
2887
// <ctor-dtor-name> ::= C1 # complete object constructor
2888
// ::= C2 # base object constructor
2889
// ::= C3 # complete object allocating constructor
2890
// extension ::= C5 # ?
2891
// ::= D0 # deleting destructor
2892
// ::= D1 # complete object destructor
2893
// ::= D2 # base object destructor
2894
// extension ::= D5 # ?
2898
parse_ctor_dtor_name(const char* first, const char* last, C& db)
2900
if (last-first >= 2 && !db.names.empty())
2911
if (db.names.empty())
2913
db.names.push_back(base_name(db.names.back().first));
2915
db.parsed_ctor_dtor_cv = true;
2926
if (db.names.empty())
2928
db.names.push_back("~" + base_name(db.names.back().first));
2930
db.parsed_ctor_dtor_cv = true;
2939
// <unnamed-type-name> ::= Ut [ <nonnegative number> ] _
2940
// ::= <closure-type-name>
2942
// <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _
2944
// <lambda-sig> ::= <parameter type>+ # Parameter types or "v" if the lambda has no parameters
2948
parse_unnamed_type_name(const char* first, const char* last, C& db)
2950
if (last - first > 2 && first[0] == 'U')
2952
char type = first[1];
2957
db.names.push_back(typename C::String("'unnamed"));
2958
const char* t0 = first+2;
2961
db.names.pop_back();
2964
if (std::isdigit(*t0))
2966
const char* t1 = t0 + 1;
2967
while (t1 != last && std::isdigit(*t1))
2969
db.names.back().first.append(t0, t1);
2972
db.names.back().first.push_back('\'');
2973
if (t0 == last || *t0 != '_')
2975
db.names.pop_back();
2983
db.names.push_back(typename C::String("'lambda'("));
2984
const char* t0 = first+2;
2985
if (first[2] == 'v')
2987
db.names.back().first += ')';
2992
const char* t1 = parse_type(t0, last, db);
2995
db.names.pop_back();
2998
if (db.names.size() < 2)
3000
auto tmp = db.names.back().move_full();
3001
db.names.pop_back();
3002
db.names.back().first.append(tmp);
3006
t1 = parse_type(t0, last, db);
3009
if (db.names.size() < 2)
3011
tmp = db.names.back().move_full();
3012
db.names.pop_back();
3015
db.names.back().first.append(", ");
3016
db.names.back().first.append(tmp);
3020
db.names.back().first.append(")");
3022
if (t0 == last || *t0 != 'E')
3024
db.names.pop_back();
3030
db.names.pop_back();
3033
if (std::isdigit(*t0))
3035
const char* t1 = t0 + 1;
3036
while (t1 != last && std::isdigit(*t1))
3038
db.names.back().first.insert(db.names.back().first.begin()+7, t0, t1);
3041
if (t0 == last || *t0 != '_')
3043
db.names.pop_back();
3054
// <unqualified-name> ::= <operator-name>
3055
// ::= <ctor-dtor-name>
3056
// ::= <source-name>
3057
// ::= <unnamed-type-name>
3061
parse_unqualified_name(const char* first, const char* last, C& db)
3070
t = parse_ctor_dtor_name(first, last, db);
8567
3071
if (t != first)
8569
if (__sub_end_ == __sub_cap_)
8570
__status_ = memory_alloc_failure;
8573
*__sub_end_++ = __root_;
8574
if (try_to_parse_template_args)
8576
const char* t2 = __parse_template_args(t, last);
8579
if (__sub_end_ < __sub_cap_)
8581
*__sub_end_++ = __root_;
8585
__status_ = memory_alloc_failure;
8600
if (first+1 != last)
8602
t = __parse_source_name(first+1, last);
8605
__node* name = __root_;
8606
const char* t2 = __parse_type(t, last, try_to_parse_template_args);
8609
if (__make<__extended_qualifier>(name, __root_))
8611
if (__sub_end_ == __sub_cap_)
8612
__status_ = memory_alloc_failure;
8615
*__sub_end_++ = __root_;
8625
if (first+1 != last && first[1] == 't')
8627
t = __parse_class_enum_type(first, last);
8630
if (__sub_end_ == __sub_cap_)
8631
__status_ = memory_alloc_failure;
8634
*__sub_end_++ = __root_;
8641
t = __parse_substitution(first, last);
8645
// Parsed a substitution. If the substitution is a
8646
// <template-param> it might be followed by <template-args>.
8647
t = __parse_template_args(first, last);
8650
// Need to create substitution for <template-template-param> <template-args>
8651
if (__sub_end_ == __sub_cap_)
8652
__status_ = memory_alloc_failure;
8655
*__sub_end_++ = __root_;
8663
if (first+1 != last)
8668
t = __parse_type(first+2, last, try_to_parse_template_args);
8671
if (__make<__pack_expansion>(__root_))
8673
if (__sub_end_ == __sub_cap_)
8674
__status_ = memory_alloc_failure;
8677
*__sub_end_++ = __root_;
8686
t = __parse_decltype(first, last);
8689
if (__sub_end_ == __sub_cap_)
8690
__status_ = memory_alloc_failure;
8693
*__sub_end_++ = __root_;
8700
t = __parse_vector_type(first, last);
8703
if (__sub_end_ == __sub_cap_)
8704
__status_ = memory_alloc_failure;
8707
*__sub_end_++ = __root_;
3075
t = parse_unnamed_type_name(first, last, db);
3088
t = parse_source_name(first, last, db);
8717
// must check for builtin-types before class-enum-types to avoid
8718
// ambiguities with operator-names
8719
t = __parse_builtin_type(first, last);
3093
t = parse_operator_name(first, last, db);
8720
3094
if (t != first)
8726
t = __parse_class_enum_type(first, last);
8729
if (__sub_end_ == __sub_cap_)
8730
__status_ = memory_alloc_failure;
8733
*__sub_end_++ = __root_;
8744
// <number> ::= [n] <non-negative decimal integer>
8747
__demangle_tree::__parse_number(const char* first, const char* last)
3102
// <unscoped-name> ::= <unqualified-name>
3103
// ::= St <unqualified-name> # ::std::
3104
// extension ::= StL<unqualified-name>
3108
parse_unscoped_name(const char* first, const char* last, C& db)
3110
if (last - first >= 2)
3112
const char* t0 = first;
3114
if (first[0] == 'S' && first[1] == 't')
3118
if (t0 != last && *t0 == 'L')
3121
const char* t1 = parse_unqualified_name(t0, last, db);
3126
if (db.names.empty())
3128
db.names.back().first.insert(0, "std::");
3136
// at <type> # alignof (a type)
3140
parse_alignof_type(const char* first, const char* last, C& db)
3142
if (last - first >= 3 && first[0] == 'a' && first[1] == 't')
3144
const char* t = parse_type(first+2, last, db);
3147
if (db.names.empty())
3149
db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3156
// az <expression> # alignof (a expression)
3160
parse_alignof_expr(const char* first, const char* last, C& db)
3162
if (last - first >= 3 && first[0] == 'a' && first[1] == 'z')
3164
const char* t = parse_expression(first+2, last, db);
3167
if (db.names.empty())
3169
db.names.back().first = "alignof (" + db.names.back().move_full() + ")";
3178
parse_noexcept_expression(const char* first, const char* last, C& db)
3180
const char* t1 = parse_expression(first, last, db);
3183
if (db.names.empty())
3185
db.names.back().first = "noexcept (" + db.names.back().move_full() + ")";
3193
parse_prefix_expression(const char* first, const char* last, const typename C::String& op, C& db)
3195
const char* t1 = parse_expression(first, last, db);
3198
if (db.names.empty())
3200
db.names.back().first = op + "(" + db.names.back().move_full() + ")";
3208
parse_binary_expression(const char* first, const char* last, const typename C::String& op, C& db)
3210
const char* t1 = parse_expression(first, last, db);
3213
const char* t2 = parse_expression(t1, last, db);
3216
if (db.names.size() < 2)
3218
auto op2 = db.names.back().move_full();
3219
db.names.pop_back();
3220
auto op1 = db.names.back().move_full();
3221
auto& nm = db.names.back().first;
3225
nm += "(" + op1 + ") " + op + " (" + op2 + ")";
3231
db.names.pop_back();
3236
// <expression> ::= <unary operator-name> <expression>
3237
// ::= <binary operator-name> <expression> <expression>
3238
// ::= <ternary operator-name> <expression> <expression> <expression>
3239
// ::= cl <expression>+ E # call
3240
// ::= cv <type> <expression> # conversion with one argument
3241
// ::= cv <type> _ <expression>* E # conversion with a different number of arguments
3242
// ::= [gs] nw <expression>* _ <type> E # new (expr-list) type
3243
// ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init)
3244
// ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type
3245
// ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init)
3246
// ::= [gs] dl <expression> # delete expression
3247
// ::= [gs] da <expression> # delete[] expression
3248
// ::= pp_ <expression> # prefix ++
3249
// ::= mm_ <expression> # prefix --
3250
// ::= ti <type> # typeid (type)
3251
// ::= te <expression> # typeid (expression)
3252
// ::= dc <type> <expression> # dynamic_cast<type> (expression)
3253
// ::= sc <type> <expression> # static_cast<type> (expression)
3254
// ::= cc <type> <expression> # const_cast<type> (expression)
3255
// ::= rc <type> <expression> # reinterpret_cast<type> (expression)
3256
// ::= st <type> # sizeof (a type)
3257
// ::= sz <expression> # sizeof (an expression)
3258
// ::= at <type> # alignof (a type)
3259
// ::= az <expression> # alignof (an expression)
3260
// ::= nx <expression> # noexcept (expression)
3261
// ::= <template-param>
3262
// ::= <function-param>
3263
// ::= dt <expression> <unresolved-name> # expr.name
3264
// ::= pt <expression> <unresolved-name> # expr->name
3265
// ::= ds <expression> <expression> # expr.*expr
3266
// ::= sZ <template-param> # size of a parameter pack
3267
// ::= sZ <function-param> # size of a function parameter pack
3268
// ::= sp <expression> # pack expansion
3269
// ::= tw <expression> # throw expression
3270
// ::= tr # throw with no operand (rethrow)
3271
// ::= <unresolved-name> # f(p), N::f(p), ::f(p),
3272
// # freestanding dependent name (e.g., T::x),
3273
// # objectless nonstatic member reference
3274
// ::= <expr-primary>
3278
parse_expression(const char* first, const char* last, C& db)
3280
if (last - first >= 2)
8751
3282
const char* t = first;
8760
else if ('1' <= *t && *t <= '9')
8763
while (first != last && isdigit(*first))
3283
bool parsed_gs = false;
3284
if (last - first >= 4 && t[0] == 'g' && t[1] == 's')
3292
first = parse_expr_primary(first, last, db);
3295
first = parse_template_param(first, last, db);
3298
first = parse_function_param(first, last, db);
3304
t = parse_binary_expression(first+2, last, "&&", db);
3309
t = parse_prefix_expression(first+2, last, "&", db);
3314
t = parse_binary_expression(first+2, last, "&", db);
3319
t = parse_binary_expression(first+2, last, "&=", db);
3324
t = parse_binary_expression(first+2, last, "=", db);
3329
first = parse_alignof_type(first, last, db);
3332
first = parse_alignof_expr(first, last, db);
3340
first = parse_const_cast_expr(first, last, db);
3343
first = parse_call_expr(first, last, db);
3346
t = parse_binary_expression(first+2, last, ",", db);
3351
t = parse_prefix_expression(first+2, last, "~", db);
3356
first = parse_conversion_expr(first, last, db);
3365
const char* t1 = parse_expression(t+2, last, db);
3368
if (db.names.empty())
3370
db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3371
"delete[] " + db.names.back().move_full();
3377
first = parse_dynamic_cast_expr(first, last, db);
3380
t = parse_prefix_expression(first+2, last, "*", db);
3386
const char* t1 = parse_expression(t+2, last, db);
3389
if (db.names.empty())
3391
db.names.back().first = (parsed_gs ? typename C::String("::") : typename C::String()) +
3392
"delete " + db.names.back().move_full();
3398
return parse_unresolved_name(first, last, db);
3400
first = parse_dot_star_expr(first, last, db);
3403
first = parse_dot_expr(first, last, db);
3406
t = parse_binary_expression(first+2, last, "/", db);
3411
t = parse_binary_expression(first+2, last, "/=", db);
3421
t = parse_binary_expression(first+2, last, "^", db);
3426
t = parse_binary_expression(first+2, last, "^=", db);
3431
t = parse_binary_expression(first+2, last, "==", db);
3441
t = parse_binary_expression(first+2, last, ">=", db);
3446
t = parse_binary_expression(first+2, last, ">", db);
3455
const char* t1 = parse_expression(first+2, last, db);
3458
const char* t2 = parse_expression(t1, last, db);
3461
if (db.names.size() < 2)
3463
auto op2 = db.names.back().move_full();
3464
db.names.pop_back();
3465
auto op1 = db.names.back().move_full();
3466
db.names.back() = "(" + op1 + ")[" + op2 + "]";
3470
db.names.pop_back();
3478
t = parse_binary_expression(first+2, last, "<=", db);
3483
t = parse_binary_expression(first+2, last, "<<", db);
3488
t = parse_binary_expression(first+2, last, "<<=", db);
3493
t = parse_binary_expression(first+2, last, "<", db);
3503
t = parse_binary_expression(first+2, last, "-", db);
3508
t = parse_binary_expression(first+2, last, "-=", db);
3513
t = parse_binary_expression(first+2, last, "*", db);
3518
t = parse_binary_expression(first+2, last, "*=", db);
3523
if (first+2 != last && first[2] == '_')
3525
t = parse_prefix_expression(first+3, last, "--", db);
3531
const char* t1 = parse_expression(first+2, last, db);
3534
if (db.names.empty())
3536
db.names.back() = "(" + db.names.back().move_full() + ")--";
3548
first = parse_new_expr(first, last, db);
3551
t = parse_binary_expression(first+2, last, "!=", db);
3556
t = parse_prefix_expression(first+2, last, "-", db);
3561
t = parse_prefix_expression(first+2, last, "!", db);
3566
t = parse_noexcept_expression(first+2, last, db);
3576
return parse_unresolved_name(first, last, db);
3578
t = parse_binary_expression(first+2, last, "||", db);
3583
t = parse_binary_expression(first+2, last, "|", db);
3588
t = parse_binary_expression(first+2, last, "|=", db);
3598
t = parse_binary_expression(first+2, last, "->*", db);
3603
t = parse_binary_expression(first+2, last, "+", db);
3608
t = parse_binary_expression(first+2, last, "+=", db);
3613
if (first+2 != last && first[2] == '_')
3615
t = parse_prefix_expression(first+3, last, "++", db);
3621
const char* t1 = parse_expression(first+2, last, db);
3624
if (db.names.empty())
3626
db.names.back() = "(" + db.names.back().move_full() + ")++";
3632
t = parse_prefix_expression(first+2, last, "+", db);
3637
first = parse_arrow_expr(first, last, db);
3644
const char* t1 = parse_expression(first+2, last, db);
3647
const char* t2 = parse_expression(t1, last, db);
3650
const char* t3 = parse_expression(t2, last, db);
3653
if (db.names.size() < 3)
3655
auto op3 = db.names.back().move_full();
3656
db.names.pop_back();
3657
auto op2 = db.names.back().move_full();
3658
db.names.pop_back();
3659
auto op1 = db.names.back().move_full();
3660
db.names.back() = "(" + op1 + ") ? (" + op2 + ") : (" + op3 + ")";
3665
db.names.pop_back();
3666
db.names.pop_back();
3670
db.names.pop_back();
3678
first = parse_reinterpret_cast_expr(first, last, db);
3681
t = parse_binary_expression(first+2, last, "%", db);
3686
t = parse_binary_expression(first+2, last, "%=", db);
3691
t = parse_binary_expression(first+2, last, ">>", db);
3696
t = parse_binary_expression(first+2, last, ">>=", db);
3706
first = parse_static_cast_expr(first, last, db);
3709
first = parse_pack_expansion(first, last, db);
3712
return parse_unresolved_name(first, last, db);
3714
first = parse_sizeof_type_expr(first, last, db);
3717
first = parse_sizeof_expr_expr(first, last, db);
3725
first = parse_sizeof_param_pack_expr(first, last, db);
3728
first = parse_sizeof_function_param_pack_expr(first, last, db);
3740
first = parse_typeid_expr(first, last, db);
3743
db.names.push_back("throw");
3747
first = parse_throw_expr(first, last, db);
3760
return parse_unresolved_name(first, last, db);
3766
// <template-arg> ::= <type> # type or template
3767
// ::= X <expression> E # expression
3768
// ::= <expr-primary> # simple expressions
3769
// ::= J <template-arg>* E # argument pack
3770
// ::= LZ <encoding> E # extension
3774
parse_template_arg(const char* first, const char* last, C& db)
3782
t = parse_expression(first+1, last, db);
3785
if (t != last && *t == 'E')
3795
const char* t1 = parse_template_arg(t, last, db);
3803
// <expr-primary> or LZ <encoding> E
3804
if (first+1 != last && first[1] == 'Z')
3806
t = parse_encoding(first+2, last, db);
3807
if (t != first+2 && t != last && *t == 'E')
3811
first = parse_expr_primary(first, last, db);
3815
first = parse_type(first, last, db);
3822
// <template-args> ::= I <template-arg>* E
3823
// extension, the abi says <template-arg>+
3827
parse_template_args(const char* first, const char* last, C& db)
3829
if (last - first >= 2 && *first == 'I')
3831
if (db.tag_templates)
3832
db.template_param.back().clear();
3833
const char* t = first+1;
3834
typename C::String args("<");
3837
if (db.tag_templates)
3838
db.template_param.emplace_back(db.names.get_allocator());
3839
size_t k0 = db.names.size();
3840
const char* t1 = parse_template_arg(t, last, db);
3841
size_t k1 = db.names.size();
3842
if (db.tag_templates)
3843
db.template_param.pop_back();
3844
if (t1 == t || t1 == last)
3846
if (db.tag_templates)
3848
db.template_param.back().emplace_back(db.names.get_allocator());
3849
for (size_t k = k0; k < k1; ++k)
3850
db.template_param.back().back().push_back(db.names[k]);
3852
for (size_t k = k0; k < k1; ++k)
3854
if (args.size() > 1)
3856
args += db.names[k].move_full();
3858
for (; k1 != k0; --k1)
3859
db.names.pop_back();
3863
if (args.back() != '>')
3867
db.names.push_back(std::move(args));
3873
// <nested-name> ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E
3874
// ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> <template-args> E
3876
// <prefix> ::= <prefix> <unqualified-name>
3877
// ::= <template-prefix> <template-args>
3878
// ::= <template-param>
3881
// ::= <substitution>
3882
// ::= <prefix> <data-member-prefix>
3885
// <template-prefix> ::= <prefix> <template unqualified-name>
3886
// ::= <template-param>
3887
// ::= <substitution>
3891
parse_nested_name(const char* first, const char* last, C& db)
3893
if (first != last && *first == 'N')
3896
const char* t0 = parse_cv_qualifiers(first+1, last, cv);
3905
else if (*t0 == 'O')
3910
db.names.emplace_back();
3911
if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't')
3914
db.names.back().first = "std";
3918
db.names.pop_back();
3921
bool pop_subs = false;
3928
if (t0 + 1 != last && t0[1] == 't')
3929
goto do_parse_unqualified_name;
3930
t1 = parse_substitution(t0, last, db);
3931
if (t1 != t0 && t1 != last)
3933
auto name = db.names.back().move_full();
3934
db.names.pop_back();
3935
if (!db.names.back().first.empty())
3937
db.names.back().first += "::" + name;
3938
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3941
db.names.back().first = name;
3949
t1 = parse_template_param(t0, last, db);
3950
if (t1 != t0 && t1 != last)
3952
auto name = db.names.back().move_full();
3953
db.names.pop_back();
3954
if (!db.names.back().first.empty())
3955
db.names.back().first += "::" + name;
3957
db.names.back().first = name;
3958
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3966
if (t0 + 1 != last && t0[1] != 't' && t0[1] != 'T')
3967
goto do_parse_unqualified_name;
3968
t1 = parse_decltype(t0, last, db);
3969
if (t1 != t0 && t1 != last)
3971
auto name = db.names.back().move_full();
3972
db.names.pop_back();
3973
if (!db.names.back().first.empty())
3974
db.names.back().first += "::" + name;
3976
db.names.back().first = name;
3977
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3985
t1 = parse_template_args(t0, last, db);
3986
if (t1 != t0 && t1 != last)
3988
auto name = db.names.back().move_full();
3989
db.names.pop_back();
3990
db.names.back().first += name;
3991
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4002
do_parse_unqualified_name:
4003
t1 = parse_unqualified_name(t0, last, db);
4004
if (t1 != t0 && t1 != last)
4006
auto name = db.names.back().move_full();
4007
db.names.pop_back();
4008
if (!db.names.back().first.empty())
4009
db.names.back().first += "::" + name;
4011
db.names.back().first = name;
4012
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4022
if (pop_subs && !db.subs.empty())
4028
// <discriminator> := _ <non-negative number> # when number < 10
4029
// := __ <non-negative number> _ # when number >= 10
4030
// extension := decimal-digit+
4033
parse_discriminator(const char* first, const char* last)
4035
// parse but ignore discriminator
4040
const char* t1 = first+1;
4043
if (std::isdigit(*t1))
4045
else if (*t1 == '_')
4047
for (++t1; t1 != last && std::isdigit(*t1); ++t1)
4049
if (t1 != last && *t1 == '_')
4054
else if (std::isdigit(*first))
4056
const char* t1 = first+1;
4057
for (; t1 != last && std::isdigit(*t1); ++t1)
4065
// <local-name> := Z <function encoding> E <entity name> [<discriminator>]
4066
// := Z <function encoding> E s [<discriminator>]
4067
// := Z <function encoding> Ed [ <parameter number> ] _ <entity name>
4071
parse_local_name(const char* first, const char* last, C& db)
4073
if (first != last && *first == 'Z')
4075
const char* t = parse_encoding(first+1, last, db);
4076
if (t != first+1 && t != last && *t == 'E' && ++t != last)
4081
first = parse_discriminator(t+1, last);
4082
if (db.names.empty())
4084
db.names.back().first.append("::string literal");
4089
const char* t1 = parse_number(t, last);
4090
if (t1 != last && *t1 == '_')
4093
t1 = parse_name(t, last, db);
4096
if (db.names.size() < 2)
4098
auto name = db.names.back().move_full();
4099
db.names.pop_back();
4100
db.names.back().first.append("::");
4101
db.names.back().first.append(name);
4105
db.names.pop_back();
4111
const char* t1 = parse_name(t, last, db);
4114
// parse but ignore discriminator
4115
first = parse_discriminator(t1, last);
4116
if (db.names.size() < 2)
4118
auto name = db.names.back().move_full();
4119
db.names.pop_back();
4120
db.names.back().first.append("::");
4121
db.names.back().first.append(name);
4124
db.names.pop_back();
4133
// <name> ::= <nested-name> // N
4134
// ::= <local-name> # See Scope Encoding below // Z
4135
// ::= <unscoped-template-name> <template-args>
4136
// ::= <unscoped-name>
4138
// <unscoped-template-name> ::= <unscoped-name>
4139
// ::= <substitution>
4143
parse_name(const char* first, const char* last, C& db)
4145
if (last - first >= 2)
4147
const char* t0 = first;
4148
// extension: ignore L here
4155
const char* t1 = parse_nested_name(t0, last, db);
4162
const char* t1 = parse_local_name(t0, last, db);
4169
const char* t1 = parse_unscoped_name(t0, last, db);
4172
if (t1 != last && *t1 == 'I') // <unscoped-template-name> <template-args>
4174
if (db.names.empty())
4176
db.subs.push_back(typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4178
t1 = parse_template_args(t0, last, db);
4181
if (db.names.size() < 2)
4183
auto tmp = db.names.back().move_full();
4184
db.names.pop_back();
4185
db.names.back().first += tmp;
4189
else // <unscoped-name>
4193
{ // try <substitution> <template-args>
4194
t1 = parse_substitution(t0, last, db);
4195
if (t1 != t0 && t1 != last && *t1 == 'I')
4198
t1 = parse_template_args(t0, last, db);
4201
if (db.names.size() < 2)
4203
auto tmp = db.names.back().move_full();
4204
db.names.pop_back();
4205
db.names.back().first += tmp;