1 //===-------------------------- cxa_demangle.cpp --------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "cxa_demangle.h" 11 12 #include <stdlib.h> 13 #include <string.h> 14 #include <ctype.h> 15 #include <stdio.h> 16 #include <new> 17 #include <algorithm> 18 #include <assert.h> 19 20 21 #ifdef DEBUGGING 22 23 #include <string> 24 #include <typeinfo> 25 26 #endif 27 28 namespace __cxxabiv1 29 { 30 31 namespace __libcxxabi 32 { 33 34 #pragma GCC visibility push(hidden) 35 36 class __node 37 { 38 __node(const __node&); 39 __node& operator=(const __node&); 40 public: 41 const char* __name_; 42 size_t __size_; 43 __node* __left_; 44 __node* __right_; 45 long double __value_; 46 long __cached_size_; 47 public: 48 __node() 49 : __name_(0), __size_(0), __left_(0), __right_(0), __cached_size_(-1) 50 {} 51 virtual ~__node() {}; 52 53 void reset_cached_size() 54 { 55 __cached_size_ = -1; 56 if (__left_) 57 __left_->reset_cached_size(); 58 if (__right_) 59 __right_->reset_cached_size(); 60 } 61 62 virtual size_t first_size() const {return 0;} 63 virtual size_t second_size() const {return 0;} 64 virtual size_t size() const 65 { 66 if (__cached_size_ == -1) 67 const_cast<long&>(__cached_size_) = first_size() + second_size(); 68 return __cached_size_; 69 } 70 virtual char* first_demangled_name(char* buf) const {return buf;} 71 virtual char* second_demangled_name(char* buf) const {return buf;} 72 virtual char* get_demangled_name(char* buf) const 73 { 74 return second_demangled_name(first_demangled_name(buf)); 75 } 76 virtual size_t base_size() const {return size();} 77 virtual char* get_base_name(char* buf) const 78 { 79 return get_demangled_name(buf); 80 } 81 virtual ptrdiff_t print_base_name(char* f, char* l) const 82 { 83 return print(f, l); 84 } 85 virtual bool ends_with_template() const 86 { 87 return false; 88 } 89 virtual bool is_ctor_dtor_conv() const 90 { 91 return false; 92 } 93 virtual __node* base_name() const 94 { 95 return const_cast<__node*>(this); 96 } 97 virtual bool is_reference_or_pointer_to_function_or_array() const 98 { 99 return false; 100 } 101 virtual bool is_function() const 102 { 103 return false; 104 } 105 virtual bool is_cv_qualifer() const 106 { 107 return false; 108 } 109 virtual bool is_array() const 110 { 111 return false; 112 } 113 114 virtual bool fix_forward_references(__node**, __node**) 115 { 116 return true; 117 } 118 virtual __node* extract_cv(__node*&) const 119 { 120 return 0; 121 } 122 virtual size_t list_len() const 123 { 124 return 0; 125 } 126 virtual bool is_sub() const 127 { 128 return false; 129 } 130 131 virtual ptrdiff_t print(char* f, char* l) const 132 { 133 const ptrdiff_t sz1 = print_first(f, l); 134 return sz1 + print_second(f+std::min(sz1, l-f), l); 135 } 136 virtual ptrdiff_t print_first(char*, char*) const 137 { 138 return 0; 139 } 140 virtual ptrdiff_t print_second(char*, char*) const 141 { 142 return 0; 143 } 144 }; 145 146 #ifdef DEBUGGING 147 148 void display(__node* x, int indent = 0) 149 { 150 if (x) 151 { 152 for (int i = 0; i < 2*indent; ++i) 153 printf(" "); 154 std::string buf(x->size(), '\0'); 155 x->print(&buf.front(), &buf.back()+1); 156 printf("%s %s, %p\n", typeid(*x).name(), buf.c_str(), x); 157 display(x->__left_, indent+1); 158 display(x->__right_, indent+1); 159 } 160 } 161 162 #endif 163 164 class __vtable 165 : public __node 166 { 167 static const ptrdiff_t n = sizeof("vtable for ") - 1; 168 public: 169 __vtable(__node* type) 170 { 171 __right_ = type; 172 } 173 174 virtual size_t first_size() const 175 { 176 if (__cached_size_ == -1) 177 const_cast<long&>(__cached_size_) = n + __right_->size(); 178 return __cached_size_; 179 } 180 virtual char* first_demangled_name(char* buf) const 181 { 182 strncpy(buf, "vtable for ", n); 183 return __right_->get_demangled_name(buf+n); 184 } 185 virtual ptrdiff_t print_first(char* f, char* l) const 186 { 187 const ptrdiff_t r = l - f; 188 if (r < n) 189 return n + __right_->print(l, l); 190 ptrdiff_t sz = __right_->print(f+n, l) + n; 191 if (r >= sz) 192 { 193 *f++ = 'v'; 194 *f++ = 't'; 195 *f++ = 'a'; 196 *f++ = 'b'; 197 *f++ = 'l'; 198 *f++ = 'e'; 199 *f++ = ' '; 200 *f++ = 'f'; 201 *f++ = 'o'; 202 *f++ = 'r'; 203 *f = ' '; 204 } 205 return sz; 206 } 207 virtual __node* base_name() const 208 { 209 return __right_->base_name(); 210 } 211 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 212 { 213 return __right_->fix_forward_references(t_begin, t_end); 214 } 215 }; 216 217 class __VTT 218 : public __node 219 { 220 static const ptrdiff_t n = sizeof("VTT for ") - 1; 221 public: 222 __VTT(__node* type) 223 { 224 __right_ = type; 225 } 226 227 virtual size_t first_size() const 228 { 229 if (__cached_size_ == -1) 230 const_cast<long&>(__cached_size_) = n + __right_->size(); 231 return __cached_size_; 232 } 233 virtual char* first_demangled_name(char* buf) const 234 { 235 strncpy(buf, "VTT for ", n); 236 return __right_->get_demangled_name(buf+n); 237 } 238 virtual ptrdiff_t print_first(char* f, char* l) const 239 { 240 const ptrdiff_t r = l - f; 241 if (r < n) 242 return n + __right_->print(l, l); 243 ptrdiff_t sz = __right_->print(f+n, l) + n; 244 if (r >= sz) 245 { 246 *f++ = 'V'; 247 *f++ = 'T'; 248 *f++ = 'T'; 249 *f++ = ' '; 250 *f++ = 'f'; 251 *f++ = 'o'; 252 *f++ = 'r'; 253 *f = ' '; 254 } 255 return sz; 256 } 257 virtual __node* base_name() const 258 { 259 return __right_->base_name(); 260 } 261 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 262 { 263 return __right_->fix_forward_references(t_begin, t_end); 264 } 265 }; 266 267 class __typeinfo 268 : public __node 269 { 270 static const ptrdiff_t n = sizeof("typeinfo for ") - 1; 271 public: 272 __typeinfo(__node* type) 273 { 274 __right_ = type; 275 } 276 277 virtual size_t first_size() const 278 { 279 if (__cached_size_ == -1) 280 const_cast<long&>(__cached_size_) = n + __right_->size(); 281 return __cached_size_; 282 } 283 virtual char* first_demangled_name(char* buf) const 284 { 285 strncpy(buf, "typeinfo for ", n); 286 return __right_->get_demangled_name(buf+n); 287 } 288 virtual ptrdiff_t print_first(char* f, char* l) const 289 { 290 const ptrdiff_t r = l - f; 291 if (r < n) 292 return n + __right_->print(l, l); 293 ptrdiff_t sz = __right_->print(f+n, l) + n; 294 if (r >= sz) 295 { 296 *f++ = 't'; 297 *f++ = 'y'; 298 *f++ = 'p'; 299 *f++ = 'e'; 300 *f++ = 'i'; 301 *f++ = 'n'; 302 *f++ = 'f'; 303 *f++ = 'o'; 304 *f++ = ' '; 305 *f++ = 'f'; 306 *f++ = 'o'; 307 *f++ = 'r'; 308 *f = ' '; 309 } 310 return sz; 311 } 312 virtual __node* base_name() const 313 { 314 return __right_->base_name(); 315 } 316 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 317 { 318 return __right_->fix_forward_references(t_begin, t_end); 319 } 320 }; 321 322 class __typeinfo_name 323 : public __node 324 { 325 static const ptrdiff_t n = sizeof("typeinfo name for ") - 1; 326 public: 327 __typeinfo_name(__node* type) 328 { 329 __right_ = type; 330 } 331 332 virtual size_t first_size() const 333 { 334 if (__cached_size_ == -1) 335 const_cast<long&>(__cached_size_) = n + __right_->size(); 336 return __cached_size_; 337 } 338 virtual char* first_demangled_name(char* buf) const 339 { 340 strncpy(buf, "typeinfo name for ", n); 341 return __right_->get_demangled_name(buf+n); 342 } 343 virtual ptrdiff_t print_first(char* f, char* l) const 344 { 345 const ptrdiff_t r = l - f; 346 if (r < n) 347 return n + __right_->print(l, l); 348 ptrdiff_t sz = __right_->print(f+n, l) + n; 349 if (r >= sz) 350 { 351 *f++ = 't'; 352 *f++ = 'y'; 353 *f++ = 'p'; 354 *f++ = 'e'; 355 *f++ = 'i'; 356 *f++ = 'n'; 357 *f++ = 'f'; 358 *f++ = 'o'; 359 *f++ = ' '; 360 *f++ = 'n'; 361 *f++ = 'a'; 362 *f++ = 'm'; 363 *f++ = 'e'; 364 *f++ = ' '; 365 *f++ = 'f'; 366 *f++ = 'o'; 367 *f++ = 'r'; 368 *f = ' '; 369 } 370 return sz; 371 } 372 virtual __node* base_name() const 373 { 374 return __right_->base_name(); 375 } 376 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 377 { 378 return __right_->fix_forward_references(t_begin, t_end); 379 } 380 }; 381 382 class __covariant_return_thunk 383 : public __node 384 { 385 static const ptrdiff_t n = sizeof("covariant return thunk to ") - 1; 386 public: 387 __covariant_return_thunk(__node* type) 388 { 389 __right_ = type; 390 } 391 392 virtual size_t first_size() const 393 { 394 if (__cached_size_ == -1) 395 const_cast<long&>(__cached_size_) = n + __right_->size(); 396 return __cached_size_; 397 } 398 virtual char* first_demangled_name(char* buf) const 399 { 400 strncpy(buf, "covariant return thunk to ", n); 401 return __right_->get_demangled_name(buf+n); 402 } 403 virtual ptrdiff_t print_first(char* f, char* l) const 404 { 405 const ptrdiff_t r = l - f; 406 if (r < n) 407 return n + __right_->print(l, l); 408 ptrdiff_t sz = __right_->print(f+n, l) + n; 409 if (r >= sz) 410 { 411 *f++ = 'c'; 412 *f++ = 'o'; 413 *f++ = 'v'; 414 *f++ = 'a'; 415 *f++ = 'r'; 416 *f++ = 'i'; 417 *f++ = 'a'; 418 *f++ = 'n'; 419 *f++ = 't'; 420 *f++ = ' '; 421 *f++ = 'r'; 422 *f++ = 'e'; 423 *f++ = 't'; 424 *f++ = 'u'; 425 *f++ = 'r'; 426 *f++ = 'n'; 427 *f++ = ' '; 428 *f++ = 't'; 429 *f++ = 'h'; 430 *f++ = 'u'; 431 *f++ = 'n'; 432 *f++ = 'k'; 433 *f++ = ' '; 434 *f++ = 't'; 435 *f++ = 'o'; 436 *f = ' '; 437 } 438 return sz; 439 } 440 virtual __node* base_name() const 441 { 442 return __right_->base_name(); 443 } 444 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 445 { 446 return __right_->fix_forward_references(t_begin, t_end); 447 } 448 }; 449 450 class __virtual_thunk 451 : public __node 452 { 453 static const size_t n = sizeof("virtual thunk to ") - 1; 454 public: 455 __virtual_thunk(__node* type) 456 { 457 __right_ = type; 458 } 459 460 virtual size_t first_size() const 461 { 462 if (__cached_size_ == -1) 463 const_cast<long&>(__cached_size_) = n + __right_->size(); 464 return __cached_size_; 465 } 466 virtual char* first_demangled_name(char* buf) const 467 { 468 strncpy(buf, "virtual thunk to ", n); 469 return __right_->get_demangled_name(buf+n); 470 } 471 virtual ptrdiff_t print_first(char* f, char* l) const 472 { 473 const ptrdiff_t r = l - f; 474 if (r < n) 475 return n + __right_->print(l, l); 476 ptrdiff_t sz = __right_->print(f+n, l) + n; 477 if (r >= sz) 478 { 479 *f++ = 'v'; 480 *f++ = 'i'; 481 *f++ = 'r'; 482 *f++ = 't'; 483 *f++ = 'u'; 484 *f++ = 'a'; 485 *f++ = 'l'; 486 *f++ = ' '; 487 *f++ = 't'; 488 *f++ = 'h'; 489 *f++ = 'u'; 490 *f++ = 'n'; 491 *f++ = 'k'; 492 *f++ = ' '; 493 *f++ = 't'; 494 *f++ = 'o'; 495 *f = ' '; 496 } 497 return sz; 498 } 499 virtual __node* base_name() const 500 { 501 return __right_->base_name(); 502 } 503 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 504 { 505 return __right_->fix_forward_references(t_begin, t_end); 506 } 507 }; 508 509 class __non_virtual_thunk 510 : public __node 511 { 512 static const size_t n = sizeof("non-virtual thunk to ") - 1; 513 public: 514 __non_virtual_thunk(__node* type) 515 { 516 __right_ = type; 517 } 518 519 virtual size_t first_size() const 520 { 521 if (__cached_size_ == -1) 522 const_cast<long&>(__cached_size_) = n + __right_->size(); 523 return __cached_size_; 524 } 525 virtual char* first_demangled_name(char* buf) const 526 { 527 strncpy(buf, "non-virtual thunk to ", n); 528 return __right_->get_demangled_name(buf+n); 529 } 530 virtual ptrdiff_t print_first(char* f, char* l) const 531 { 532 const ptrdiff_t r = l - f; 533 if (r < n) 534 return n + __right_->print(l, l); 535 ptrdiff_t sz = __right_->print(f+n, l) + n; 536 if (r >= sz) 537 { 538 *f++ = 'n'; 539 *f++ = 'o'; 540 *f++ = 'n'; 541 *f++ = '-'; 542 *f++ = 'v'; 543 *f++ = 'i'; 544 *f++ = 'r'; 545 *f++ = 't'; 546 *f++ = 'u'; 547 *f++ = 'a'; 548 *f++ = 'l'; 549 *f++ = ' '; 550 *f++ = 't'; 551 *f++ = 'h'; 552 *f++ = 'u'; 553 *f++ = 'n'; 554 *f++ = 'k'; 555 *f++ = ' '; 556 *f++ = 't'; 557 *f++ = 'o'; 558 *f = ' '; 559 } 560 return sz; 561 } 562 virtual __node* base_name() const 563 { 564 return __right_->base_name(); 565 } 566 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 567 { 568 return __right_->fix_forward_references(t_begin, t_end); 569 } 570 }; 571 572 class __guard_variable 573 : public __node 574 { 575 static const size_t n = sizeof("guard variable for ") - 1; 576 public: 577 __guard_variable(__node* type) 578 { 579 __right_ = type; 580 } 581 582 virtual size_t first_size() const 583 { 584 if (__cached_size_ == -1) 585 const_cast<long&>(__cached_size_) = n + __right_->size(); 586 return __cached_size_; 587 } 588 virtual char* first_demangled_name(char* buf) const 589 { 590 strncpy(buf, "guard variable for ", n); 591 return __right_->get_demangled_name(buf+n); 592 } 593 virtual ptrdiff_t print_first(char* f, char* l) const 594 { 595 const ptrdiff_t r = l - f; 596 if (r < n) 597 return n + __right_->print(l, l); 598 ptrdiff_t sz = __right_->print(f+n, l) + n; 599 if (r >= sz) 600 { 601 *f++ = 'g'; 602 *f++ = 'u'; 603 *f++ = 'a'; 604 *f++ = 'r'; 605 *f++ = 'd'; 606 *f++ = ' '; 607 *f++ = 'v'; 608 *f++ = 'a'; 609 *f++ = 'r'; 610 *f++ = 'i'; 611 *f++ = 'a'; 612 *f++ = 'b'; 613 *f++ = 'l'; 614 *f++ = 'e'; 615 *f++ = ' '; 616 *f++ = 'f'; 617 *f++ = 'o'; 618 *f++ = 'r'; 619 *f = ' '; 620 } 621 return sz; 622 } 623 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 624 { 625 return __right_->fix_forward_references(t_begin, t_end); 626 } 627 }; 628 629 class __source_name 630 : public __node 631 { 632 public: 633 __source_name(const char* __name, unsigned __size) 634 { 635 __name_ = __name; 636 __size_ = __size; 637 } 638 639 virtual size_t first_size() const 640 { 641 if (__cached_size_ == -1) 642 { 643 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0) 644 const_cast<long&>(__cached_size_) = 21; 645 else 646 const_cast<long&>(__cached_size_) = __size_; 647 } 648 return __cached_size_; 649 } 650 virtual char* first_demangled_name(char* buf) const 651 { 652 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0) 653 return strncpy(buf, "(anonymous namespace)", 21) + 21; 654 return strncpy(buf, __name_, __size_) + __size_; 655 } 656 virtual ptrdiff_t print_first(char* f, char* l) const 657 { 658 const ptrdiff_t r = l - f; 659 if (__size_ >= 10 && strncmp(__name_, "_GLOBAL__N", 10) == 0) 660 { 661 const ptrdiff_t n = sizeof("(anonymous namespace)") - 1; 662 if (r >= n) 663 { 664 *f++ = '('; 665 *f++ = 'a'; 666 *f++ = 'n'; 667 *f++ = 'o'; 668 *f++ = 'n'; 669 *f++ = 'y'; 670 *f++ = 'm'; 671 *f++ = 'o'; 672 *f++ = 'u'; 673 *f++ = 's'; 674 *f++ = ' '; 675 *f++ = 'n'; 676 *f++ = 'a'; 677 *f++ = 'm'; 678 *f++ = 'e'; 679 *f++ = 's'; 680 *f++ = 'p'; 681 *f++ = 'a'; 682 *f++ = 'c'; 683 *f++ = 'e'; 684 *f = ')'; 685 } 686 return n; 687 } 688 if (r >= __size_) 689 strncpy(f, __name_, __size_); 690 return __size_; 691 } 692 }; 693 694 class __operator_new 695 : public __node 696 { 697 public: 698 699 virtual size_t first_size() const {return sizeof("operator new") - 1;} 700 virtual char* first_demangled_name(char* buf) const 701 { 702 return strncpy(buf, "operator new", sizeof("operator new") - 1) + 703 sizeof("operator new") - 1; 704 } 705 virtual ptrdiff_t print_first(char* f, char* l) const 706 { 707 const ptrdiff_t r = l - f; 708 const ptrdiff_t n = sizeof("operator new") - 1; 709 if (r >= n) 710 { 711 *f++ = 'o'; 712 *f++ = 'p'; 713 *f++ = 'e'; 714 *f++ = 'r'; 715 *f++ = 'a'; 716 *f++ = 't'; 717 *f++ = 'o'; 718 *f++ = 'r'; 719 *f++ = ' '; 720 *f++ = 'n'; 721 *f++ = 'e'; 722 *f = 'w'; 723 } 724 return n; 725 } 726 }; 727 728 class __operator_new_array 729 : public __node 730 { 731 public: 732 733 virtual size_t first_size() const {return sizeof("operator new[]") - 1;} 734 virtual char* first_demangled_name(char* buf) const 735 { 736 return strncpy(buf, "operator new[]", sizeof("operator new[]") - 1) + 737 sizeof("operator new[]") - 1; 738 } 739 virtual ptrdiff_t print_first(char* f, char* l) const 740 { 741 const ptrdiff_t r = l - f; 742 const ptrdiff_t n = sizeof("operator new[]") - 1; 743 if (r >= n) 744 { 745 *f++ = 'o'; 746 *f++ = 'p'; 747 *f++ = 'e'; 748 *f++ = 'r'; 749 *f++ = 'a'; 750 *f++ = 't'; 751 *f++ = 'o'; 752 *f++ = 'r'; 753 *f++ = ' '; 754 *f++ = 'n'; 755 *f++ = 'e'; 756 *f++ = 'w'; 757 *f++ = '['; 758 *f = ']'; 759 } 760 return n; 761 } 762 }; 763 764 class __operator_delete 765 : public __node 766 { 767 public: 768 769 virtual size_t first_size() const {return sizeof("operator delete") - 1;} 770 virtual char* first_demangled_name(char* buf) const 771 { 772 return strncpy(buf, "operator delete", sizeof("operator delete") - 1) + 773 sizeof("operator delete") - 1; 774 } 775 virtual ptrdiff_t print_first(char* f, char* l) const 776 { 777 const ptrdiff_t r = l - f; 778 const ptrdiff_t n = sizeof("operator delete") - 1; 779 if (r >= n) 780 { 781 *f++ = 'o'; 782 *f++ = 'p'; 783 *f++ = 'e'; 784 *f++ = 'r'; 785 *f++ = 'a'; 786 *f++ = 't'; 787 *f++ = 'o'; 788 *f++ = 'r'; 789 *f++ = ' '; 790 *f++ = 'd'; 791 *f++ = 'e'; 792 *f++ = 'l'; 793 *f++ = 'e'; 794 *f++ = 't'; 795 *f = 'e'; 796 } 797 return n; 798 } 799 }; 800 801 class __operator_delete_array 802 : public __node 803 { 804 public: 805 806 virtual size_t first_size() const {return sizeof("operator delete[]") - 1;} 807 virtual char* first_demangled_name(char* buf) const 808 { 809 return strncpy(buf, "operator delete[]", sizeof("operator delete[]") - 1) + 810 sizeof("operator delete[]") - 1; 811 } 812 virtual ptrdiff_t print_first(char* f, char* l) const 813 { 814 const ptrdiff_t r = l - f; 815 const ptrdiff_t n = sizeof("operator delete[]") - 1; 816 if (r >= n) 817 { 818 *f++ = 'o'; 819 *f++ = 'p'; 820 *f++ = 'e'; 821 *f++ = 'r'; 822 *f++ = 'a'; 823 *f++ = 't'; 824 *f++ = 'o'; 825 *f++ = 'r'; 826 *f++ = ' '; 827 *f++ = 'd'; 828 *f++ = 'e'; 829 *f++ = 'l'; 830 *f++ = 'e'; 831 *f++ = 't'; 832 *f++ = 'e'; 833 *f++ = '['; 834 *f = ']'; 835 } 836 return n; 837 } 838 }; 839 840 class __operator_logical_and 841 : public __node 842 { 843 public: 844 845 __operator_logical_and() {} 846 __operator_logical_and(__node* op1, __node* op2) 847 { 848 __left_ = op1; 849 __right_ = op2; 850 } 851 virtual size_t first_size() const 852 { 853 if (__cached_size_ == -1) 854 { 855 if (__left_) 856 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 857 else 858 const_cast<long&>(__cached_size_) = sizeof("operator&&") - 1; 859 } 860 return __cached_size_; 861 } 862 virtual char* first_demangled_name(char* buf) const 863 { 864 if (__left_) 865 { 866 *buf++ = '('; 867 buf = __left_->get_demangled_name(buf); 868 strncpy(buf, ") && (", 6); 869 buf += 6; 870 buf = __right_->get_demangled_name(buf); 871 *buf++ = ')'; 872 } 873 else 874 { 875 strncpy(buf, "operator&&", sizeof("operator&&") - 1); 876 buf += sizeof("operator&&") - 1; 877 } 878 return buf; 879 } 880 virtual ptrdiff_t print_first(char* f, char* l) const 881 { 882 const ptrdiff_t r = l - f; 883 if (__left_) 884 { 885 const ptrdiff_t n1 = 8; 886 if (r < n1) 887 return n1 + __left_->print(l, l) + __right_->print(l, l); 888 ptrdiff_t sz1 = __left_->print(f+1, l); 889 if (r < n1 + sz1) 890 return n1 + sz1 + __right_->print(l, l); 891 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 892 if (r >= n1 + sz1 + sz2) 893 { 894 *f = '('; 895 f += 1 + sz1; 896 *f++ = ')'; 897 *f++ = ' '; 898 *f++ = '&'; 899 *f++ = '&'; 900 *f++ = ' '; 901 *f = '('; 902 f += 1 + sz2; 903 *f = ')'; 904 } 905 return n1 + sz1 + sz2; 906 } 907 const ptrdiff_t n2 = sizeof("operator&&") - 1; 908 if (r >= n2) 909 { 910 *f++ = 'o'; 911 *f++ = 'p'; 912 *f++ = 'e'; 913 *f++ = 'r'; 914 *f++ = 'a'; 915 *f++ = 't'; 916 *f++ = 'o'; 917 *f++ = 'r'; 918 *f++ = '&'; 919 *f = '&'; 920 } 921 return n2; 922 } 923 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 924 { 925 bool r = true; 926 if (__left_) 927 r = r && __left_->fix_forward_references(t_begin, t_end); 928 if (__right_) 929 r = r && __right_->fix_forward_references(t_begin, t_end); 930 return r; 931 } 932 }; 933 934 class __operator_addressof 935 : public __node 936 { 937 public: 938 939 __operator_addressof() {} 940 explicit __operator_addressof(__node* op) 941 { 942 __left_ = op; 943 } 944 virtual size_t first_size() const 945 { 946 if (__cached_size_ == -1) 947 { 948 if (__left_) 949 const_cast<long&>(__cached_size_) = 3+__left_->size(); 950 else 951 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1; 952 } 953 return __cached_size_; 954 } 955 virtual char* first_demangled_name(char* buf) const 956 { 957 if (__left_) 958 { 959 *buf++ = '&'; 960 *buf++ = '('; 961 buf = __left_->get_demangled_name(buf); 962 *buf++ = ')'; 963 } 964 else 965 { 966 strncpy(buf, "operator&", sizeof("operator&") - 1); 967 buf += sizeof("operator&") - 1; 968 } 969 return buf; 970 } 971 virtual ptrdiff_t print_first(char* f, char* l) const 972 { 973 const ptrdiff_t r = l - f; 974 if (__left_) 975 { 976 const ptrdiff_t n1 = 3; 977 if (r < n1) 978 return n1 + __left_->print(l, l); 979 ptrdiff_t sz1 = __left_->print(f+2, l); 980 if (r >= n1 + sz1) 981 { 982 *f++ = '&'; 983 *f = '('; 984 f += 1 + sz1; 985 *f = ')'; 986 } 987 return n1 + sz1; 988 } 989 const ptrdiff_t n2 = sizeof("operator&") - 1; 990 if (r >= n2) 991 { 992 *f++ = 'o'; 993 *f++ = 'p'; 994 *f++ = 'e'; 995 *f++ = 'r'; 996 *f++ = 'a'; 997 *f++ = 't'; 998 *f++ = 'o'; 999 *f++ = 'r'; 1000 *f = '&'; 1001 } 1002 return n2; 1003 } 1004 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1005 { 1006 if (__left_) 1007 return __left_->fix_forward_references(t_begin, t_end); 1008 return true; 1009 } 1010 }; 1011 1012 class __operator_bit_and 1013 : public __node 1014 { 1015 public: 1016 1017 __operator_bit_and() {} 1018 __operator_bit_and(__node* op1, __node* op2) 1019 { 1020 __left_ = op1; 1021 __right_ = op2; 1022 } 1023 virtual size_t first_size() const 1024 { 1025 if (__cached_size_ == -1) 1026 { 1027 if (__left_) 1028 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 1029 else 1030 const_cast<long&>(__cached_size_) = sizeof("operator&") - 1; 1031 } 1032 return __cached_size_; 1033 } 1034 virtual char* first_demangled_name(char* buf) const 1035 { 1036 if (__left_) 1037 { 1038 *buf++ = '('; 1039 buf = __left_->get_demangled_name(buf); 1040 strncpy(buf, ") & (", 5); 1041 buf += 5; 1042 buf = __right_->get_demangled_name(buf); 1043 *buf++ = ')'; 1044 } 1045 else 1046 { 1047 strncpy(buf, "operator&", sizeof("operator&") - 1); 1048 buf += sizeof("operator&") - 1; 1049 } 1050 return buf; 1051 } 1052 virtual ptrdiff_t print_first(char* f, char* l) const 1053 { 1054 const ptrdiff_t r = l - f; 1055 if (__left_) 1056 { 1057 const ptrdiff_t n1 = 7; 1058 if (r < n1) 1059 return n1 + __left_->print(l, l) + __right_->print(l, l); 1060 ptrdiff_t sz1 = __left_->print(f+1, l); 1061 if (r < n1 + sz1) 1062 return n1 + sz1 + __right_->print(l, l); 1063 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 1064 if (r >= n1 + sz1 + sz2) 1065 { 1066 *f = '('; 1067 f += 1 + sz1; 1068 *f++ = ')'; 1069 *f++ = ' '; 1070 *f++ = '&'; 1071 *f++ = ' '; 1072 *f = '('; 1073 f += 1 + sz2; 1074 *f = ')'; 1075 } 1076 return n1 + sz1 + sz2; 1077 } 1078 const ptrdiff_t n2 = sizeof("operator&") - 1; 1079 if (r >= n2) 1080 { 1081 *f++ = 'o'; 1082 *f++ = 'p'; 1083 *f++ = 'e'; 1084 *f++ = 'r'; 1085 *f++ = 'a'; 1086 *f++ = 't'; 1087 *f++ = 'o'; 1088 *f++ = 'r'; 1089 *f = '&'; 1090 } 1091 return n2; 1092 } 1093 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1094 { 1095 bool r = true; 1096 if (__left_) 1097 r = r && __left_->fix_forward_references(t_begin, t_end); 1098 if (__right_) 1099 r = r && __right_->fix_forward_references(t_begin, t_end); 1100 return r; 1101 } 1102 }; 1103 1104 class __operator_and_equal 1105 : public __node 1106 { 1107 public: 1108 1109 __operator_and_equal() {} 1110 __operator_and_equal(__node* op1, __node* op2) 1111 { 1112 __left_ = op1; 1113 __right_ = op2; 1114 } 1115 virtual size_t first_size() const 1116 { 1117 if (__cached_size_ == -1) 1118 { 1119 if (__left_) 1120 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 1121 else 1122 const_cast<long&>(__cached_size_) = sizeof("operator&=") - 1; 1123 } 1124 return __cached_size_; 1125 } 1126 virtual char* first_demangled_name(char* buf) const 1127 { 1128 if (__left_) 1129 { 1130 *buf++ = '('; 1131 buf = __left_->get_demangled_name(buf); 1132 strncpy(buf, ") &= (", 6); 1133 buf += 6; 1134 buf = __right_->get_demangled_name(buf); 1135 *buf++ = ')'; 1136 } 1137 else 1138 { 1139 strncpy(buf, "operator&=", sizeof("operator&=") - 1); 1140 buf += sizeof("operator&=") - 1; 1141 } 1142 return buf; 1143 } 1144 virtual ptrdiff_t print_first(char* f, char* l) const 1145 { 1146 const ptrdiff_t r = l - f; 1147 if (__left_) 1148 { 1149 const ptrdiff_t n1 = 8; 1150 if (r < n1) 1151 return n1 + __left_->print(l, l) + __right_->print(l, l); 1152 ptrdiff_t sz1 = __left_->print(f+1, l); 1153 if (r < n1 + sz1) 1154 return n1 + sz1 + __right_->print(l, l); 1155 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 1156 if (r >= n1 + sz1 + sz2) 1157 { 1158 *f = '('; 1159 f += 1 + sz1; 1160 *f++ = ')'; 1161 *f++ = ' '; 1162 *f++ = '&'; 1163 *f++ = '='; 1164 *f++ = ' '; 1165 *f = '('; 1166 f += 1 + sz2; 1167 *f = ')'; 1168 } 1169 return n1 + sz1 + sz2; 1170 } 1171 const ptrdiff_t n2 = sizeof("operator&=") - 1; 1172 if (r >= n2) 1173 { 1174 *f++ = 'o'; 1175 *f++ = 'p'; 1176 *f++ = 'e'; 1177 *f++ = 'r'; 1178 *f++ = 'a'; 1179 *f++ = 't'; 1180 *f++ = 'o'; 1181 *f++ = 'r'; 1182 *f++ = '&'; 1183 *f = '='; 1184 } 1185 return n2; 1186 } 1187 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1188 { 1189 bool r = true; 1190 if (__left_) 1191 r = r && __left_->fix_forward_references(t_begin, t_end); 1192 if (__right_) 1193 r = r && __right_->fix_forward_references(t_begin, t_end); 1194 return r; 1195 } 1196 }; 1197 1198 class __operator_equal 1199 : public __node 1200 { 1201 public: 1202 1203 __operator_equal() {} 1204 __operator_equal(__node* op1, __node* op2) 1205 { 1206 __left_ = op1; 1207 __right_ = op2; 1208 } 1209 virtual size_t first_size() const 1210 { 1211 if (__cached_size_ == -1) 1212 { 1213 if (__left_) 1214 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 1215 else 1216 const_cast<long&>(__cached_size_) = sizeof("operator=") - 1; 1217 } 1218 return __cached_size_; 1219 } 1220 virtual char* first_demangled_name(char* buf) const 1221 { 1222 if (__left_) 1223 { 1224 *buf++ = '('; 1225 buf = __left_->get_demangled_name(buf); 1226 strncpy(buf, ") = (", 5); 1227 buf += 5; 1228 buf = __right_->get_demangled_name(buf); 1229 *buf++ = ')'; 1230 } 1231 else 1232 { 1233 strncpy(buf, "operator=", sizeof("operator=") - 1); 1234 buf += sizeof("operator=") - 1; 1235 } 1236 return buf; 1237 } 1238 virtual ptrdiff_t print_first(char* f, char* l) const 1239 { 1240 const ptrdiff_t r = l - f; 1241 if (__left_) 1242 { 1243 const ptrdiff_t n1 = 7; 1244 if (r < n1) 1245 return n1 + __left_->print(l, l) + __right_->print(l, l); 1246 ptrdiff_t sz1 = __left_->print(f+1, l); 1247 if (r < n1 + sz1) 1248 return n1 + sz1 + __right_->print(l, l); 1249 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 1250 if (r >= n1 + sz1 + sz2) 1251 { 1252 *f = '('; 1253 f += 1 + sz1; 1254 *f++ = ')'; 1255 *f++ = ' '; 1256 *f++ = '='; 1257 *f++ = ' '; 1258 *f = '('; 1259 f += 1 + sz2; 1260 *f = ')'; 1261 } 1262 return n1 + sz1 + sz2; 1263 } 1264 const ptrdiff_t n2 = sizeof("operator=") - 1; 1265 if (r >= n2) 1266 { 1267 *f++ = 'o'; 1268 *f++ = 'p'; 1269 *f++ = 'e'; 1270 *f++ = 'r'; 1271 *f++ = 'a'; 1272 *f++ = 't'; 1273 *f++ = 'o'; 1274 *f++ = 'r'; 1275 *f = '='; 1276 } 1277 return n2; 1278 } 1279 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1280 { 1281 bool r = true; 1282 if (__left_) 1283 r = r && __left_->fix_forward_references(t_begin, t_end); 1284 if (__right_) 1285 r = r && __right_->fix_forward_references(t_begin, t_end); 1286 return r; 1287 } 1288 }; 1289 1290 class __operator_alignof_type 1291 : public __node 1292 { 1293 public: 1294 1295 __operator_alignof_type() {} 1296 __operator_alignof_type(__node* op) 1297 { 1298 __right_ = op; 1299 } 1300 virtual size_t first_size() const 1301 { 1302 if (__cached_size_ == -1) 1303 { 1304 if (__right_) 1305 const_cast<long&>(__cached_size_) = __right_->size() + 10; 1306 else 1307 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1; 1308 } 1309 return __cached_size_; 1310 } 1311 virtual char* first_demangled_name(char* buf) const 1312 { 1313 if (__right_) 1314 { 1315 strncpy(buf, "alignof (", 9); 1316 buf += 9; 1317 buf = __right_->get_demangled_name(buf); 1318 *buf++ = ')'; 1319 } 1320 else 1321 { 1322 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1); 1323 buf += sizeof("operator alignof") - 1; 1324 } 1325 return buf; 1326 } 1327 virtual ptrdiff_t print_first(char* f, char* l) const 1328 { 1329 const ptrdiff_t r = l - f; 1330 if (__right_) 1331 { 1332 const ptrdiff_t n1 = sizeof("alignof ()") - 1; 1333 if (r < n1) 1334 return n1 + __right_->print(l, l); 1335 ptrdiff_t sz1 = __right_->print(f+(n1-1), l); 1336 if (r >= n1 + sz1) 1337 { 1338 *f++ = 'a'; 1339 *f++ = 'l'; 1340 *f++ = 'i'; 1341 *f++ = 'g'; 1342 *f++ = 'n'; 1343 *f++ = 'o'; 1344 *f++ = 'f'; 1345 *f++ = ' '; 1346 *f = '('; 1347 f += 1 + sz1; 1348 *f = ')'; 1349 } 1350 return n1 + sz1; 1351 } 1352 const ptrdiff_t n2 = sizeof("operator alignof") - 1; 1353 if (r >= n2) 1354 { 1355 *f++ = 'o'; 1356 *f++ = 'p'; 1357 *f++ = 'e'; 1358 *f++ = 'r'; 1359 *f++ = 'a'; 1360 *f++ = 't'; 1361 *f++ = 'o'; 1362 *f++ = 'r'; 1363 *f++ = ' '; 1364 *f++ = 'a'; 1365 *f++ = 'l'; 1366 *f++ = 'i'; 1367 *f++ = 'g'; 1368 *f++ = 'n'; 1369 *f++ = 'o'; 1370 *f = 'f'; 1371 } 1372 return n2; 1373 } 1374 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1375 { 1376 if (__right_) 1377 return __right_->fix_forward_references(t_begin, t_end); 1378 return true; 1379 } 1380 }; 1381 1382 class __operator_alignof_expression 1383 : public __node 1384 { 1385 public: 1386 1387 __operator_alignof_expression() {} 1388 __operator_alignof_expression(__node* op) 1389 { 1390 __right_ = op; 1391 } 1392 virtual size_t first_size() const 1393 { 1394 if (__cached_size_ == -1) 1395 { 1396 if (__right_) 1397 const_cast<long&>(__cached_size_) = __right_->size() + 10; 1398 else 1399 const_cast<long&>(__cached_size_) = sizeof("operator alignof") - 1; 1400 } 1401 return __cached_size_; 1402 } 1403 virtual char* first_demangled_name(char* buf) const 1404 { 1405 if (__right_) 1406 { 1407 strncpy(buf, "alignof (", 9); 1408 buf += 9; 1409 buf = __right_->get_demangled_name(buf); 1410 *buf++ = ')'; 1411 } 1412 else 1413 { 1414 strncpy(buf, "operator alignof", sizeof("operator alignof") - 1); 1415 buf += sizeof("operator alignof") - 1; 1416 } 1417 return buf; 1418 } 1419 virtual ptrdiff_t print_first(char* f, char* l) const 1420 { 1421 const ptrdiff_t r = l - f; 1422 if (__right_) 1423 { 1424 const ptrdiff_t n1 = sizeof("alignof ()") - 1; 1425 if (r < n1) 1426 return n1 + __right_->print(l, l); 1427 ptrdiff_t sz1 = __right_->print(f+(n1-1), l); 1428 if (r >= n1 + sz1) 1429 { 1430 *f++ = 'a'; 1431 *f++ = 'l'; 1432 *f++ = 'i'; 1433 *f++ = 'g'; 1434 *f++ = 'n'; 1435 *f++ = 'o'; 1436 *f++ = 'f'; 1437 *f++ = ' '; 1438 *f = '('; 1439 f += 1 + sz1; 1440 *f = ')'; 1441 } 1442 return n1 + sz1; 1443 } 1444 const ptrdiff_t n2 = sizeof("operator alignof") - 1; 1445 if (r >= n2) 1446 { 1447 *f++ = 'o'; 1448 *f++ = 'p'; 1449 *f++ = 'e'; 1450 *f++ = 'r'; 1451 *f++ = 'a'; 1452 *f++ = 't'; 1453 *f++ = 'o'; 1454 *f++ = 'r'; 1455 *f++ = ' '; 1456 *f++ = 'a'; 1457 *f++ = 'l'; 1458 *f++ = 'i'; 1459 *f++ = 'g'; 1460 *f++ = 'n'; 1461 *f++ = 'o'; 1462 *f = 'f'; 1463 } 1464 return n2; 1465 } 1466 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1467 { 1468 if (__right_) 1469 return __right_->fix_forward_references(t_begin, t_end); 1470 return true; 1471 } 1472 }; 1473 1474 class __operator_paren 1475 : public __node 1476 { 1477 public: 1478 1479 virtual size_t first_size() const {return sizeof("operator()") - 1;} 1480 virtual char* first_demangled_name(char* buf) const 1481 { 1482 strncpy(buf, "operator()", sizeof("operator()") - 1); 1483 return buf + sizeof("operator()") - 1; 1484 } 1485 virtual ptrdiff_t print_first(char* f, char* l) const 1486 { 1487 const ptrdiff_t r = l - f; 1488 const ptrdiff_t n = sizeof("operator()") - 1; 1489 if (r >= n) 1490 { 1491 *f++ = 'o'; 1492 *f++ = 'p'; 1493 *f++ = 'e'; 1494 *f++ = 'r'; 1495 *f++ = 'a'; 1496 *f++ = 't'; 1497 *f++ = 'o'; 1498 *f++ = 'r'; 1499 *f++ = '('; 1500 *f = ')'; 1501 } 1502 return n; 1503 } 1504 }; 1505 1506 class __operator_comma 1507 : public __node 1508 { 1509 public: 1510 1511 __operator_comma() {} 1512 __operator_comma(__node* op1, __node* op2) 1513 { 1514 __left_ = op1; 1515 __right_ = op2; 1516 } 1517 virtual size_t first_size() const 1518 { 1519 if (__cached_size_ == -1) 1520 { 1521 if (__left_) 1522 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 1523 else 1524 const_cast<long&>(__cached_size_) = sizeof("operator,") - 1; 1525 } 1526 return __cached_size_; 1527 } 1528 virtual char* first_demangled_name(char* buf) const 1529 { 1530 if (__left_) 1531 { 1532 *buf++ = '('; 1533 buf = __left_->get_demangled_name(buf); 1534 strncpy(buf, ") , (", 5); 1535 buf += 5; 1536 buf = __right_->get_demangled_name(buf); 1537 *buf++ = ')'; 1538 } 1539 else 1540 { 1541 strncpy(buf, "operator,", sizeof("operator,") - 1); 1542 buf += sizeof("operator,") - 1; 1543 } 1544 return buf; 1545 } 1546 virtual ptrdiff_t print_first(char* f, char* l) const 1547 { 1548 const ptrdiff_t r = l - f; 1549 if (__left_) 1550 { 1551 const ptrdiff_t n1 = 7; 1552 if (r < n1) 1553 return n1 + __left_->print(l, l) + __right_->print(l, l); 1554 ptrdiff_t sz1 = __left_->print(f+1, l); 1555 if (r < n1 + sz1) 1556 return n1 + sz1 + __right_->print(l, l); 1557 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 1558 if (r >= n1 + sz1 + sz2) 1559 { 1560 *f = '('; 1561 f += 1 + sz1; 1562 *f++ = ')'; 1563 *f++ = ' '; 1564 *f++ = ','; 1565 *f++ = ' '; 1566 *f = '('; 1567 f += 1 + sz2; 1568 *f = ')'; 1569 } 1570 return n1 + sz1 + sz2; 1571 } 1572 const ptrdiff_t n2 = sizeof("operator,") - 1; 1573 if (r >= n2) 1574 { 1575 *f++ = 'o'; 1576 *f++ = 'p'; 1577 *f++ = 'e'; 1578 *f++ = 'r'; 1579 *f++ = 'a'; 1580 *f++ = 't'; 1581 *f++ = 'o'; 1582 *f++ = 'r'; 1583 *f = ','; 1584 } 1585 return n2; 1586 } 1587 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1588 { 1589 bool r = true; 1590 if (__left_) 1591 r = r && __left_->fix_forward_references(t_begin, t_end); 1592 if (__right_) 1593 r = r && __right_->fix_forward_references(t_begin, t_end); 1594 return r; 1595 } 1596 }; 1597 1598 class __operator_tilda 1599 : public __node 1600 { 1601 public: 1602 1603 __operator_tilda() {} 1604 explicit __operator_tilda(__node* op) 1605 { 1606 __left_ = op; 1607 } 1608 virtual size_t first_size() const 1609 { 1610 if (__cached_size_ == -1) 1611 { 1612 if (__left_) 1613 const_cast<long&>(__cached_size_) = 3+__left_->size(); 1614 else 1615 const_cast<long&>(__cached_size_) = sizeof("operator~") - 1; 1616 } 1617 return __cached_size_; 1618 } 1619 virtual char* first_demangled_name(char* buf) const 1620 { 1621 if (__left_) 1622 { 1623 *buf++ = '~'; 1624 *buf++ = '('; 1625 buf = __left_->get_demangled_name(buf); 1626 *buf++ = ')'; 1627 } 1628 else 1629 { 1630 strncpy(buf, "operator~", sizeof("operator~") - 1); 1631 buf += sizeof("operator~") - 1; 1632 } 1633 return buf; 1634 } 1635 virtual ptrdiff_t print_first(char* f, char* l) const 1636 { 1637 const ptrdiff_t r = l - f; 1638 if (__left_) 1639 { 1640 const ptrdiff_t n1 = 3; 1641 if (r < n1) 1642 return n1 + __left_->print(l, l); 1643 ptrdiff_t sz1 = __left_->print(f+2, l); 1644 if (r >= n1 + sz1) 1645 { 1646 *f++ = '~'; 1647 *f = '('; 1648 f += 1 + sz1; 1649 *f = ')'; 1650 } 1651 return n1 + sz1; 1652 } 1653 const ptrdiff_t n2 = sizeof("operator~") - 1; 1654 if (r >= n2) 1655 { 1656 *f++ = 'o'; 1657 *f++ = 'p'; 1658 *f++ = 'e'; 1659 *f++ = 'r'; 1660 *f++ = 'a'; 1661 *f++ = 't'; 1662 *f++ = 'o'; 1663 *f++ = 'r'; 1664 *f = '~'; 1665 } 1666 return n2; 1667 } 1668 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1669 { 1670 if (__left_) 1671 return __left_->fix_forward_references(t_begin, t_end); 1672 return true; 1673 } 1674 }; 1675 1676 class __operator_cast 1677 : public __node 1678 { 1679 static const size_t n = sizeof("operator ") - 1; 1680 public: 1681 1682 explicit __operator_cast(__node* type) 1683 { 1684 __right_ = type; 1685 } 1686 __operator_cast(__node* type, __node* arg) 1687 { 1688 __size_ = 1; 1689 __right_ = type; 1690 __left_ = arg; 1691 } 1692 virtual size_t first_size() const 1693 { 1694 if (__cached_size_ == -1) 1695 { 1696 size_t off; 1697 if (__size_) 1698 { 1699 off = 4; 1700 off += __right_->size(); 1701 if (__left_) 1702 off += __left_->size(); 1703 } 1704 else 1705 off = n + __right_->size();; 1706 const_cast<long&>(__cached_size_) = off; 1707 } 1708 return __cached_size_; 1709 } 1710 virtual char* first_demangled_name(char* buf) const 1711 { 1712 if (__size_) 1713 { 1714 *buf++ = '('; 1715 buf = __right_->get_demangled_name(buf); 1716 *buf++ = ')'; 1717 *buf++ = '('; 1718 if (__left_) 1719 buf = __left_->get_demangled_name(buf); 1720 *buf++ = ')'; 1721 } 1722 else 1723 { 1724 strncpy(buf, "operator ", n); 1725 buf = __right_->get_demangled_name(buf+n); 1726 } 1727 return buf; 1728 } 1729 virtual ptrdiff_t print_first(char* f, char* l) const 1730 { 1731 const ptrdiff_t r = l - f; 1732 if (__size_) 1733 { 1734 const ptrdiff_t n1 = 4; 1735 if (r < n1) 1736 return n1 + __right_->print(l, l) + 1737 (__left_ ? __left_->print(l, l) : 0); 1738 ptrdiff_t sz1 = __right_->print(f+1, l); 1739 if (r < n1 + sz1) 1740 return n1 + sz1 + (__left_ ? __left_->print(l, l) : 0); 1741 ptrdiff_t sz2 = __left_ ? __left_->print(f+3+sz1, l) : 0; 1742 if (r >= n1 + sz1 + sz2) 1743 { 1744 *f = '('; 1745 f += 1 + sz1; 1746 *f++ = ')'; 1747 *f = '('; 1748 f += 1 + sz2; 1749 *f = ')'; 1750 } 1751 return n1 + sz1 + sz2; 1752 } 1753 const ptrdiff_t n2 = sizeof("operator ") - 1; 1754 if (r < n2) 1755 return n2 + __right_->print(l, l); 1756 ptrdiff_t sz1 = __right_->print(f+n2, l); 1757 if (r >= n2 + sz1) 1758 { 1759 *f++ = 'o'; 1760 *f++ = 'p'; 1761 *f++ = 'e'; 1762 *f++ = 'r'; 1763 *f++ = 'a'; 1764 *f++ = 't'; 1765 *f++ = 'o'; 1766 *f++ = 'r'; 1767 *f = ' '; 1768 } 1769 return n2 + sz1; 1770 } 1771 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1772 { 1773 bool r = true; 1774 if (__left_) 1775 r = r && __left_->fix_forward_references(t_begin, t_end); 1776 r = r && __right_->fix_forward_references(t_begin, t_end); 1777 return r; 1778 } 1779 virtual bool is_ctor_dtor_conv() const 1780 { 1781 return true; 1782 } 1783 }; 1784 1785 class __cast_literal 1786 : public __node 1787 { 1788 public: 1789 1790 __cast_literal(__node* type, const char* f, const char* l) 1791 { 1792 __left_ = type; 1793 __name_ = f; 1794 __size_ = l - f; 1795 } 1796 virtual size_t first_size() const 1797 { 1798 if (__cached_size_ == -1) 1799 const_cast<long&>(__cached_size_) = 2 + __left_->size() + __size_; 1800 return __cached_size_; 1801 } 1802 virtual char* first_demangled_name(char* buf) const 1803 { 1804 *buf++ = '('; 1805 buf = __left_->get_demangled_name(buf); 1806 *buf++ = ')'; 1807 strncpy(buf, __name_, __size_); 1808 return buf + __size_; 1809 } 1810 virtual ptrdiff_t print_first(char* f, char* l) const 1811 { 1812 const ptrdiff_t r = l - f; 1813 const ptrdiff_t n = 2; 1814 if (r < __size_ + n) 1815 return __size_ + n + __left_->print(l, l); 1816 ptrdiff_t sz = __left_->print(f+1, l); 1817 if (r >= __size_ + n + sz) 1818 { 1819 *f = '('; 1820 f += 1 + sz; 1821 *f++ = ')'; 1822 strncpy(f, __name_, __size_); 1823 } 1824 return __size_ + n + sz; 1825 } 1826 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1827 { 1828 return __left_->fix_forward_references(t_begin, t_end); 1829 } 1830 }; 1831 1832 class __operator_dereference 1833 : public __node 1834 { 1835 public: 1836 1837 __operator_dereference() {} 1838 explicit __operator_dereference(__node* op) 1839 { 1840 __left_ = op; 1841 } 1842 virtual size_t first_size() const 1843 { 1844 if (__cached_size_ == -1) 1845 { 1846 if (__left_) 1847 const_cast<long&>(__cached_size_) = 3+__left_->size(); 1848 else 1849 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1; 1850 } 1851 return __cached_size_; 1852 } 1853 virtual char* first_demangled_name(char* buf) const 1854 { 1855 if (__left_) 1856 { 1857 *buf++ = '*'; 1858 *buf++ = '('; 1859 buf = __left_->get_demangled_name(buf); 1860 *buf++ = ')'; 1861 } 1862 else 1863 { 1864 strncpy(buf, "operator*", sizeof("operator*") - 1); 1865 buf += sizeof("operator*") - 1; 1866 } 1867 return buf; 1868 } 1869 virtual ptrdiff_t print_first(char* f, char* l) const 1870 { 1871 const ptrdiff_t r = l - f; 1872 if (__left_) 1873 { 1874 const ptrdiff_t n1 = 3; 1875 if (r < n1) 1876 return n1 + __left_->print(l, l); 1877 ptrdiff_t sz1 = __left_->print(f+2, l); 1878 if (r >= n1 + sz1) 1879 { 1880 *f++ = '*'; 1881 *f = '('; 1882 f += 1 + sz1; 1883 *f = ')'; 1884 } 1885 return n1 + sz1; 1886 } 1887 const ptrdiff_t n2 = sizeof("operator*") - 1; 1888 if (r >= n2) 1889 { 1890 *f++ = 'o'; 1891 *f++ = 'p'; 1892 *f++ = 'e'; 1893 *f++ = 'r'; 1894 *f++ = 'a'; 1895 *f++ = 't'; 1896 *f++ = 'o'; 1897 *f++ = 'r'; 1898 *f = '*'; 1899 } 1900 return n2; 1901 } 1902 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1903 { 1904 if (__left_) 1905 return __left_->fix_forward_references(t_begin, t_end); 1906 return true; 1907 } 1908 }; 1909 1910 class __operator_divide 1911 : public __node 1912 { 1913 public: 1914 1915 __operator_divide() {} 1916 __operator_divide(__node* op1, __node* op2) 1917 { 1918 __left_ = op1; 1919 __right_ = op2; 1920 } 1921 virtual size_t first_size() const 1922 { 1923 if (__cached_size_ == -1) 1924 { 1925 if (__left_) 1926 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 1927 else 1928 const_cast<long&>(__cached_size_) = sizeof("operator/") - 1; 1929 } 1930 return __cached_size_; 1931 } 1932 virtual char* first_demangled_name(char* buf) const 1933 { 1934 if (__left_) 1935 { 1936 *buf++ = '('; 1937 buf = __left_->get_demangled_name(buf); 1938 strncpy(buf, ") / (", 5); 1939 buf += 5; 1940 buf = __right_->get_demangled_name(buf); 1941 *buf++ = ')'; 1942 } 1943 else 1944 { 1945 strncpy(buf, "operator/", sizeof("operator/") - 1); 1946 buf += sizeof("operator/") - 1; 1947 } 1948 return buf; 1949 } 1950 virtual ptrdiff_t print_first(char* f, char* l) const 1951 { 1952 const ptrdiff_t r = l - f; 1953 if (__left_) 1954 { 1955 const ptrdiff_t n1 = 7; 1956 if (r < n1) 1957 return n1 + __left_->print(l, l) + __right_->print(l, l); 1958 ptrdiff_t sz1 = __left_->print(f+1, l); 1959 if (r < n1 + sz1) 1960 return n1 + sz1 + __right_->print(l, l); 1961 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 1962 if (r >= n1 + sz1 + sz2) 1963 { 1964 *f = '('; 1965 f += 1 + sz1; 1966 *f++ = ')'; 1967 *f++ = ' '; 1968 *f++ = '/'; 1969 *f++ = ' '; 1970 *f = '('; 1971 f += 1 + sz2; 1972 *f = ')'; 1973 } 1974 return n1 + sz1 + sz2; 1975 } 1976 const ptrdiff_t n2 = sizeof("operator/") - 1; 1977 if (r >= n2) 1978 { 1979 *f++ = 'o'; 1980 *f++ = 'p'; 1981 *f++ = 'e'; 1982 *f++ = 'r'; 1983 *f++ = 'a'; 1984 *f++ = 't'; 1985 *f++ = 'o'; 1986 *f++ = 'r'; 1987 *f = '/'; 1988 } 1989 return n2; 1990 } 1991 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 1992 { 1993 bool r = true; 1994 if (__left_) 1995 r = r && __left_->fix_forward_references(t_begin, t_end); 1996 if (__right_) 1997 r = r && __right_->fix_forward_references(t_begin, t_end); 1998 return r; 1999 } 2000 }; 2001 2002 class __operator_divide_equal 2003 : public __node 2004 { 2005 public: 2006 2007 __operator_divide_equal() {} 2008 __operator_divide_equal(__node* op1, __node* op2) 2009 { 2010 __left_ = op1; 2011 __right_ = op2; 2012 } 2013 virtual size_t first_size() const 2014 { 2015 if (__cached_size_ == -1) 2016 { 2017 if (__left_) 2018 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 2019 else 2020 const_cast<long&>(__cached_size_) = sizeof("operator/=") - 1; 2021 } 2022 return __cached_size_; 2023 } 2024 virtual char* first_demangled_name(char* buf) const 2025 { 2026 if (__left_) 2027 { 2028 *buf++ = '('; 2029 buf = __left_->get_demangled_name(buf); 2030 strncpy(buf, ") /= (", 6); 2031 buf += 6; 2032 buf = __right_->get_demangled_name(buf); 2033 *buf++ = ')'; 2034 } 2035 else 2036 { 2037 strncpy(buf, "operator/=", sizeof("operator/=") - 1); 2038 buf += sizeof("operator/=") - 1; 2039 } 2040 return buf; 2041 } 2042 virtual ptrdiff_t print_first(char* f, char* l) const 2043 { 2044 const ptrdiff_t r = l - f; 2045 if (__left_) 2046 { 2047 const ptrdiff_t n1 = 8; 2048 if (r < n1) 2049 return n1 + __left_->print(l, l) + __right_->print(l, l); 2050 ptrdiff_t sz1 = __left_->print(f+1, l); 2051 if (r < n1 + sz1) 2052 return n1 + sz1 + __right_->print(l, l); 2053 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2054 if (r >= n1 + sz1 + sz2) 2055 { 2056 *f = '('; 2057 f += 1 + sz1; 2058 *f++ = ')'; 2059 *f++ = ' '; 2060 *f++ = '/'; 2061 *f++ = '='; 2062 *f++ = ' '; 2063 *f = '('; 2064 f += 1 + sz2; 2065 *f = ')'; 2066 } 2067 return n1 + sz1 + sz2; 2068 } 2069 const ptrdiff_t n2 = sizeof("operator/=") - 1; 2070 if (r >= n2) 2071 { 2072 *f++ = 'o'; 2073 *f++ = 'p'; 2074 *f++ = 'e'; 2075 *f++ = 'r'; 2076 *f++ = 'a'; 2077 *f++ = 't'; 2078 *f++ = 'o'; 2079 *f++ = 'r'; 2080 *f++ = '/'; 2081 *f = '='; 2082 } 2083 return n2; 2084 } 2085 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2086 { 2087 bool r = true; 2088 if (__left_) 2089 r = r && __left_->fix_forward_references(t_begin, t_end); 2090 if (__right_) 2091 r = r && __right_->fix_forward_references(t_begin, t_end); 2092 return r; 2093 } 2094 }; 2095 2096 class __operator_xor 2097 : public __node 2098 { 2099 public: 2100 2101 __operator_xor() {} 2102 __operator_xor(__node* op1, __node* op2) 2103 { 2104 __left_ = op1; 2105 __right_ = op2; 2106 } 2107 virtual size_t first_size() const 2108 { 2109 if (__cached_size_ == -1) 2110 { 2111 if (__left_) 2112 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 2113 else 2114 const_cast<long&>(__cached_size_) = sizeof("operator^") - 1; 2115 } 2116 return __cached_size_; 2117 } 2118 virtual char* first_demangled_name(char* buf) const 2119 { 2120 if (__left_) 2121 { 2122 *buf++ = '('; 2123 buf = __left_->get_demangled_name(buf); 2124 strncpy(buf, ") ^ (", 5); 2125 buf += 5; 2126 buf = __right_->get_demangled_name(buf); 2127 *buf++ = ')'; 2128 } 2129 else 2130 { 2131 strncpy(buf, "operator^", sizeof("operator^") - 1); 2132 buf += sizeof("operator^") - 1; 2133 } 2134 return buf; 2135 } 2136 virtual ptrdiff_t print_first(char* f, char* l) const 2137 { 2138 const ptrdiff_t r = l - f; 2139 if (__left_) 2140 { 2141 const ptrdiff_t n1 = 7; 2142 if (r < n1) 2143 return n1 + __left_->print(l, l) + __right_->print(l, l); 2144 ptrdiff_t sz1 = __left_->print(f+1, l); 2145 if (r < n1 + sz1) 2146 return n1 + sz1 + __right_->print(l, l); 2147 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2148 if (r >= n1 + sz1 + sz2) 2149 { 2150 *f = '('; 2151 f += 1 + sz1; 2152 *f++ = ')'; 2153 *f++ = ' '; 2154 *f++ = '^'; 2155 *f++ = ' '; 2156 *f = '('; 2157 f += 1 + sz2; 2158 *f = ')'; 2159 } 2160 return n1 + sz1 + sz2; 2161 } 2162 const ptrdiff_t n2 = sizeof("operator^") - 1; 2163 if (r >= n2) 2164 { 2165 *f++ = 'o'; 2166 *f++ = 'p'; 2167 *f++ = 'e'; 2168 *f++ = 'r'; 2169 *f++ = 'a'; 2170 *f++ = 't'; 2171 *f++ = 'o'; 2172 *f++ = 'r'; 2173 *f = '^'; 2174 } 2175 return n2; 2176 } 2177 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2178 { 2179 bool r = true; 2180 if (__left_) 2181 r = r && __left_->fix_forward_references(t_begin, t_end); 2182 if (__right_) 2183 r = r && __right_->fix_forward_references(t_begin, t_end); 2184 return r; 2185 } 2186 }; 2187 2188 class __operator_xor_equal 2189 : public __node 2190 { 2191 public: 2192 2193 __operator_xor_equal() {} 2194 __operator_xor_equal(__node* op1, __node* op2) 2195 { 2196 __left_ = op1; 2197 __right_ = op2; 2198 } 2199 virtual size_t first_size() const 2200 { 2201 if (__cached_size_ == -1) 2202 { 2203 if (__left_) 2204 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 2205 else 2206 const_cast<long&>(__cached_size_) = sizeof("operator^=") - 1; 2207 } 2208 return __cached_size_; 2209 } 2210 virtual char* first_demangled_name(char* buf) const 2211 { 2212 if (__left_) 2213 { 2214 *buf++ = '('; // strncpy(buf, "(", 1); 2215 buf = __left_->get_demangled_name(buf); 2216 strncpy(buf, ") ^= (", 6); 2217 buf += 6; 2218 buf = __right_->get_demangled_name(buf); 2219 *buf++ = ')'; 2220 } 2221 else 2222 { 2223 strncpy(buf, "operator^=", sizeof("operator^=") - 1); 2224 buf += sizeof("operator^=") - 1; 2225 } 2226 return buf; 2227 } 2228 virtual ptrdiff_t print_first(char* f, char* l) const 2229 { 2230 const ptrdiff_t r = l - f; 2231 if (__left_) 2232 { 2233 const ptrdiff_t n1 = 8; 2234 if (r < n1) 2235 return n1 + __left_->print(l, l) + __right_->print(l, l); 2236 ptrdiff_t sz1 = __left_->print(f+1, l); 2237 if (r < n1 + sz1) 2238 return n1 + sz1 + __right_->print(l, l); 2239 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2240 if (r >= n1 + sz1 + sz2) 2241 { 2242 *f = '('; 2243 f += 1 + sz1; 2244 *f++ = ')'; 2245 *f++ = ' '; 2246 *f++ = '^'; 2247 *f++ = '='; 2248 *f++ = ' '; 2249 *f = '('; 2250 f += 1 + sz2; 2251 *f = ')'; 2252 } 2253 return n1 + sz1 + sz2; 2254 } 2255 const ptrdiff_t n2 = sizeof("operator^=") - 1; 2256 if (r >= n2) 2257 { 2258 *f++ = 'o'; 2259 *f++ = 'p'; 2260 *f++ = 'e'; 2261 *f++ = 'r'; 2262 *f++ = 'a'; 2263 *f++ = 't'; 2264 *f++ = 'o'; 2265 *f++ = 'r'; 2266 *f++ = '^'; 2267 *f = '='; 2268 } 2269 return n2; 2270 } 2271 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2272 { 2273 bool r = true; 2274 if (__left_) 2275 r = r && __left_->fix_forward_references(t_begin, t_end); 2276 if (__right_) 2277 r = r && __right_->fix_forward_references(t_begin, t_end); 2278 return r; 2279 } 2280 }; 2281 2282 class __operator_equality 2283 : public __node 2284 { 2285 public: 2286 2287 __operator_equality() {} 2288 __operator_equality(__node* op1, __node* op2) 2289 { 2290 __left_ = op1; 2291 __right_ = op2; 2292 } 2293 virtual size_t first_size() const 2294 { 2295 if (__cached_size_ == -1) 2296 { 2297 if (__left_) 2298 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 2299 else 2300 const_cast<long&>(__cached_size_) = sizeof("operator==") - 1; 2301 } 2302 return __cached_size_; 2303 } 2304 virtual char* first_demangled_name(char* buf) const 2305 { 2306 if (__left_) 2307 { 2308 *buf++ = '('; 2309 buf = __left_->get_demangled_name(buf); 2310 strncpy(buf, ") == (", 6); 2311 buf += 6; 2312 buf = __right_->get_demangled_name(buf); 2313 *buf++ = ')'; 2314 } 2315 else 2316 { 2317 strncpy(buf, "operator==", sizeof("operator==") - 1); 2318 buf += sizeof("operator==") - 1; 2319 } 2320 return buf; 2321 } 2322 virtual ptrdiff_t print_first(char* f, char* l) const 2323 { 2324 const ptrdiff_t r = l - f; 2325 if (__left_) 2326 { 2327 const ptrdiff_t n1 = 8; 2328 if (r < n1) 2329 return n1 + __left_->print(l, l) + __right_->print(l, l); 2330 ptrdiff_t sz1 = __left_->print(f+1, l); 2331 if (r < n1 + sz1) 2332 return n1 + sz1 + __right_->print(l, l); 2333 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2334 if (r >= n1 + sz1 + sz2) 2335 { 2336 *f = '('; 2337 f += 1 + sz1; 2338 *f++ = ')'; 2339 *f++ = ' '; 2340 *f++ = '='; 2341 *f++ = '='; 2342 *f++ = ' '; 2343 *f = '('; 2344 f += 1 + sz2; 2345 *f = ')'; 2346 } 2347 return n1 + sz1 + sz2; 2348 } 2349 const ptrdiff_t n2 = sizeof("operator==") - 1; 2350 if (r >= n2) 2351 { 2352 *f++ = 'o'; 2353 *f++ = 'p'; 2354 *f++ = 'e'; 2355 *f++ = 'r'; 2356 *f++ = 'a'; 2357 *f++ = 't'; 2358 *f++ = 'o'; 2359 *f++ = 'r'; 2360 *f++ = '='; 2361 *f = '='; 2362 } 2363 return n2; 2364 } 2365 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2366 { 2367 bool r = true; 2368 if (__left_) 2369 r = r && __left_->fix_forward_references(t_begin, t_end); 2370 if (__right_) 2371 r = r && __right_->fix_forward_references(t_begin, t_end); 2372 return r; 2373 } 2374 }; 2375 2376 class __operator_greater_equal 2377 : public __node 2378 { 2379 public: 2380 2381 __operator_greater_equal() {} 2382 __operator_greater_equal(__node* op1, __node* op2) 2383 { 2384 __left_ = op1; 2385 __right_ = op2; 2386 } 2387 virtual size_t first_size() const 2388 { 2389 if (__cached_size_ == -1) 2390 { 2391 if (__left_) 2392 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 2393 else 2394 const_cast<long&>(__cached_size_) = sizeof("operator>=") - 1; 2395 } 2396 return __cached_size_; 2397 } 2398 virtual char* first_demangled_name(char* buf) const 2399 { 2400 if (__left_) 2401 { 2402 *buf++ = '('; 2403 buf = __left_->get_demangled_name(buf); 2404 strncpy(buf, ") >= (", 6); 2405 buf += 6; 2406 buf = __right_->get_demangled_name(buf); 2407 *buf++ = ')'; 2408 } 2409 else 2410 { 2411 strncpy(buf, "operator>=", sizeof("operator>=") - 1); 2412 buf += sizeof("operator>=") - 1; 2413 } 2414 return buf; 2415 } 2416 virtual ptrdiff_t print_first(char* f, char* l) const 2417 { 2418 const ptrdiff_t r = l - f; 2419 if (__left_) 2420 { 2421 const ptrdiff_t n1 = 8; 2422 if (r < n1) 2423 return n1 + __left_->print(l, l) + __right_->print(l, l); 2424 ptrdiff_t sz1 = __left_->print(f+1, l); 2425 if (r < n1 + sz1) 2426 return n1 + sz1 + __right_->print(l, l); 2427 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2428 if (r >= n1 + sz1 + sz2) 2429 { 2430 *f = '('; 2431 f += 1 + sz1; 2432 *f++ = ')'; 2433 *f++ = ' '; 2434 *f++ = '>'; 2435 *f++ = '='; 2436 *f++ = ' '; 2437 *f = '('; 2438 f += 1 + sz2; 2439 *f = ')'; 2440 } 2441 return n1 + sz1 + sz2; 2442 } 2443 const ptrdiff_t n2 = sizeof("operator>=") - 1; 2444 if (r >= n2) 2445 { 2446 *f++ = 'o'; 2447 *f++ = 'p'; 2448 *f++ = 'e'; 2449 *f++ = 'r'; 2450 *f++ = 'a'; 2451 *f++ = 't'; 2452 *f++ = 'o'; 2453 *f++ = 'r'; 2454 *f++ = '>'; 2455 *f = '='; 2456 } 2457 return n2; 2458 } 2459 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2460 { 2461 bool r = true; 2462 if (__left_) 2463 r = r && __left_->fix_forward_references(t_begin, t_end); 2464 if (__right_) 2465 r = r && __right_->fix_forward_references(t_begin, t_end); 2466 return r; 2467 } 2468 }; 2469 2470 class __operator_greater 2471 : public __node 2472 { 2473 public: 2474 2475 __operator_greater() {} 2476 __operator_greater(__node* op1, __node* op2) 2477 { 2478 __left_ = op1; 2479 __right_ = op2; 2480 } 2481 virtual size_t first_size() const 2482 { 2483 if (__cached_size_ == -1) 2484 { 2485 if (__left_) 2486 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size(); 2487 else 2488 const_cast<long&>(__cached_size_) = sizeof("operator>") - 1; 2489 } 2490 return __cached_size_; 2491 } 2492 virtual char* first_demangled_name(char* buf) const 2493 { 2494 if (__left_) 2495 { 2496 *buf++ = '('; 2497 *buf++ = '('; 2498 buf = __left_->get_demangled_name(buf); 2499 strncpy(buf, ") > (", 5); 2500 buf += 5; 2501 buf = __right_->get_demangled_name(buf); 2502 *buf++ = ')'; 2503 *buf++ = ')'; 2504 } 2505 else 2506 { 2507 strncpy(buf, "operator>", sizeof("operator>") - 1); 2508 buf += sizeof("operator>") - 1; 2509 } 2510 return buf; 2511 } 2512 virtual ptrdiff_t print_first(char* f, char* l) const 2513 { 2514 const ptrdiff_t r = l - f; 2515 if (__left_) 2516 { 2517 const ptrdiff_t n1 = 9; 2518 if (r < n1) 2519 return n1 + __left_->print(l, l) + __right_->print(l, l); 2520 ptrdiff_t sz1 = __left_->print(f+2, l); 2521 if (r < n1 + sz1) 2522 return n1 + sz1 + __right_->print(l, l); 2523 ptrdiff_t sz2 = __right_->print(f+(n1-2)+sz1, l); 2524 if (r >= n1 + sz1 + sz2) 2525 { 2526 *f++ = '('; 2527 *f = '('; 2528 f += 1 + sz1; 2529 *f++ = ')'; 2530 *f++ = ' '; 2531 *f++ = '>'; 2532 *f++ = ' '; 2533 *f = '('; 2534 f += 1 + sz2; 2535 *f++ = ')'; 2536 *f = ')'; 2537 } 2538 return n1 + sz1 + sz2; 2539 } 2540 const ptrdiff_t n2 = sizeof("operator>") - 1; 2541 if (r >= n2) 2542 { 2543 *f++ = 'o'; 2544 *f++ = 'p'; 2545 *f++ = 'e'; 2546 *f++ = 'r'; 2547 *f++ = 'a'; 2548 *f++ = 't'; 2549 *f++ = 'o'; 2550 *f++ = 'r'; 2551 *f = '>'; 2552 } 2553 return n2; 2554 } 2555 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2556 { 2557 bool r = true; 2558 if (__left_) 2559 r = r && __left_->fix_forward_references(t_begin, t_end); 2560 if (__right_) 2561 r = r && __right_->fix_forward_references(t_begin, t_end); 2562 return r; 2563 } 2564 }; 2565 2566 class __operator_brackets 2567 : public __node 2568 { 2569 public: 2570 2571 virtual size_t first_size() const {return sizeof("operator[]") - 1;} 2572 virtual char* first_demangled_name(char* buf) const 2573 { 2574 strncpy(buf, "operator[]", sizeof("operator[]") - 1); 2575 return buf + sizeof("operator[]") - 1; 2576 } 2577 virtual ptrdiff_t print_first(char* f, char* l) const 2578 { 2579 const ptrdiff_t r = l - f; 2580 const ptrdiff_t n = sizeof("operator[]") - 1; 2581 if (r >= n) 2582 { 2583 *f++ = 'o'; 2584 *f++ = 'p'; 2585 *f++ = 'e'; 2586 *f++ = 'r'; 2587 *f++ = 'a'; 2588 *f++ = 't'; 2589 *f++ = 'o'; 2590 *f++ = 'r'; 2591 *f++ = '['; 2592 *f = ']'; 2593 } 2594 return n; 2595 } 2596 }; 2597 2598 class __operator_less_equal 2599 : public __node 2600 { 2601 public: 2602 2603 __operator_less_equal() {} 2604 __operator_less_equal(__node* op1, __node* op2) 2605 { 2606 __left_ = op1; 2607 __right_ = op2; 2608 } 2609 virtual size_t first_size() const 2610 { 2611 if (__cached_size_ == -1) 2612 { 2613 if (__left_) 2614 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 2615 else 2616 const_cast<long&>(__cached_size_) = sizeof("operator<=") - 1; 2617 } 2618 return __cached_size_; 2619 } 2620 virtual char* first_demangled_name(char* buf) const 2621 { 2622 if (__left_) 2623 { 2624 *buf++ = '('; 2625 buf = __left_->get_demangled_name(buf); 2626 strncpy(buf, ") <= (", 6); 2627 buf += 6; 2628 buf = __right_->get_demangled_name(buf); 2629 *buf++ = ')'; 2630 } 2631 else 2632 { 2633 strncpy(buf, "operator<=", sizeof("operator<=") - 1); 2634 buf += sizeof("operator<=") - 1; 2635 } 2636 return buf; 2637 } 2638 virtual ptrdiff_t print_first(char* f, char* l) const 2639 { 2640 const ptrdiff_t r = l - f; 2641 if (__left_) 2642 { 2643 const ptrdiff_t n1 = 8; 2644 if (r < n1) 2645 return n1 + __left_->print(l, l) + __right_->print(l, l); 2646 ptrdiff_t sz1 = __left_->print(f+1, l); 2647 if (r < n1 + sz1) 2648 return n1 + sz1 + __right_->print(l, l); 2649 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2650 if (r >= n1 + sz1 + sz2) 2651 { 2652 *f = '('; 2653 f += 1 + sz1; 2654 *f++ = ')'; 2655 *f++ = ' '; 2656 *f++ = '<'; 2657 *f++ = '='; 2658 *f++ = ' '; 2659 *f = '('; 2660 f += 1 + sz2; 2661 *f = ')'; 2662 } 2663 return n1 + sz1 + sz2; 2664 } 2665 const ptrdiff_t n2 = sizeof("operator<=") - 1; 2666 if (r >= n2) 2667 { 2668 *f++ = 'o'; 2669 *f++ = 'p'; 2670 *f++ = 'e'; 2671 *f++ = 'r'; 2672 *f++ = 'a'; 2673 *f++ = 't'; 2674 *f++ = 'o'; 2675 *f++ = 'r'; 2676 *f++ = '<'; 2677 *f = '='; 2678 } 2679 return n2; 2680 } 2681 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2682 { 2683 bool r = true; 2684 if (__left_) 2685 r = r && __left_->fix_forward_references(t_begin, t_end); 2686 if (__right_) 2687 r = r && __right_->fix_forward_references(t_begin, t_end); 2688 return r; 2689 } 2690 }; 2691 2692 class __operator_less 2693 : public __node 2694 { 2695 public: 2696 2697 __operator_less() {} 2698 __operator_less(__node* op1, __node* op2) 2699 { 2700 __left_ = op1; 2701 __right_ = op2; 2702 } 2703 virtual size_t first_size() const 2704 { 2705 if (__cached_size_ == -1) 2706 { 2707 if (__left_) 2708 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 2709 else 2710 const_cast<long&>(__cached_size_) = sizeof("operator<") - 1; 2711 } 2712 return __cached_size_; 2713 } 2714 virtual char* first_demangled_name(char* buf) const 2715 { 2716 if (__left_) 2717 { 2718 *buf++ = '('; 2719 buf = __left_->get_demangled_name(buf); 2720 strncpy(buf, ") < (", 5); 2721 buf += 5; 2722 buf = __right_->get_demangled_name(buf); 2723 *buf++ = ')'; 2724 } 2725 else 2726 { 2727 strncpy(buf, "operator<", sizeof("operator<") - 1); 2728 buf += sizeof("operator<") - 1; 2729 } 2730 return buf; 2731 } 2732 virtual ptrdiff_t print_first(char* f, char* l) const 2733 { 2734 const ptrdiff_t r = l - f; 2735 if (__left_) 2736 { 2737 const ptrdiff_t n1 = 7; 2738 if (r < n1) 2739 return n1 + __left_->print(l, l) + __right_->print(l, l); 2740 ptrdiff_t sz1 = __left_->print(f+1, l); 2741 if (r < n1 + sz1) 2742 return n1 + sz1 + __right_->print(l, l); 2743 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2744 if (r >= n1 + sz1 + sz2) 2745 { 2746 *f = '('; 2747 f += 1 + sz1; 2748 *f++ = ')'; 2749 *f++ = ' '; 2750 *f++ = '<'; 2751 *f++ = ' '; 2752 *f = '('; 2753 f += 1 + sz2; 2754 *f = ')'; 2755 } 2756 return n1 + sz1 + sz2; 2757 } 2758 const ptrdiff_t n2 = sizeof("operator<") - 1; 2759 if (r >= n2) 2760 { 2761 *f++ = 'o'; 2762 *f++ = 'p'; 2763 *f++ = 'e'; 2764 *f++ = 'r'; 2765 *f++ = 'a'; 2766 *f++ = 't'; 2767 *f++ = 'o'; 2768 *f++ = 'r'; 2769 *f = '<'; 2770 } 2771 return n2; 2772 } 2773 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2774 { 2775 bool r = true; 2776 if (__left_) 2777 r = r && __left_->fix_forward_references(t_begin, t_end); 2778 if (__right_) 2779 r = r && __right_->fix_forward_references(t_begin, t_end); 2780 return r; 2781 } 2782 }; 2783 2784 class __operator_left_shift 2785 : public __node 2786 { 2787 public: 2788 2789 __operator_left_shift() {} 2790 __operator_left_shift(__node* op1, __node* op2) 2791 { 2792 __left_ = op1; 2793 __right_ = op2; 2794 } 2795 virtual size_t first_size() const 2796 { 2797 if (__cached_size_ == -1) 2798 { 2799 if (__left_) 2800 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 2801 else 2802 const_cast<long&>(__cached_size_) = sizeof("operator<<") - 1; 2803 } 2804 return __cached_size_; 2805 } 2806 virtual char* first_demangled_name(char* buf) const 2807 { 2808 if (__left_) 2809 { 2810 *buf++ = '('; 2811 buf = __left_->get_demangled_name(buf); 2812 strncpy(buf, ") << (", 6); 2813 buf += 6; 2814 buf = __right_->get_demangled_name(buf); 2815 *buf++ = ')'; 2816 } 2817 else 2818 { 2819 strncpy(buf, "operator<<", sizeof("operator<<") - 1); 2820 buf += sizeof("operator<<") - 1; 2821 } 2822 return buf; 2823 } 2824 virtual ptrdiff_t print_first(char* f, char* l) const 2825 { 2826 const ptrdiff_t r = l - f; 2827 if (__left_) 2828 { 2829 const ptrdiff_t n1 = 8; 2830 if (r < n1) 2831 return n1 + __left_->print(l, l) + __right_->print(l, l); 2832 ptrdiff_t sz1 = __left_->print(f+1, l); 2833 if (r < n1 + sz1) 2834 return n1 + sz1 + __right_->print(l, l); 2835 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2836 if (r >= n1 + sz1 + sz2) 2837 { 2838 *f = '('; 2839 f += 1 + sz1; 2840 *f++ = ')'; 2841 *f++ = ' '; 2842 *f++ = '<'; 2843 *f++ = '<'; 2844 *f++ = ' '; 2845 *f = '('; 2846 f += 1 + sz2; 2847 *f = ')'; 2848 } 2849 return n1 + sz1 + sz2; 2850 } 2851 const ptrdiff_t n2 = sizeof("operator<<") - 1; 2852 if (r >= n2) 2853 { 2854 *f++ = 'o'; 2855 *f++ = 'p'; 2856 *f++ = 'e'; 2857 *f++ = 'r'; 2858 *f++ = 'a'; 2859 *f++ = 't'; 2860 *f++ = 'o'; 2861 *f++ = 'r'; 2862 *f++ = '<'; 2863 *f = '<'; 2864 } 2865 return n2; 2866 } 2867 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2868 { 2869 bool r = true; 2870 if (__left_) 2871 r = r && __left_->fix_forward_references(t_begin, t_end); 2872 if (__right_) 2873 r = r && __right_->fix_forward_references(t_begin, t_end); 2874 return r; 2875 } 2876 }; 2877 2878 class __operator_left_shift_equal 2879 : public __node 2880 { 2881 public: 2882 2883 __operator_left_shift_equal() {} 2884 __operator_left_shift_equal(__node* op1, __node* op2) 2885 { 2886 __left_ = op1; 2887 __right_ = op2; 2888 } 2889 virtual size_t first_size() const 2890 { 2891 if (__cached_size_ == -1) 2892 { 2893 if (__left_) 2894 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size(); 2895 else 2896 const_cast<long&>(__cached_size_) = sizeof("operator<<=") - 1; 2897 } 2898 return __cached_size_; 2899 } 2900 virtual char* first_demangled_name(char* buf) const 2901 { 2902 if (__left_) 2903 { 2904 *buf++ = '('; 2905 buf = __left_->get_demangled_name(buf); 2906 strncpy(buf, ") <<= (", 7); 2907 buf += 7; 2908 buf = __right_->get_demangled_name(buf); 2909 *buf++ = ')'; 2910 } 2911 else 2912 { 2913 strncpy(buf, "operator<<=", sizeof("operator<<=") - 1); 2914 buf += sizeof("operator<<=") - 1; 2915 } 2916 return buf; 2917 } 2918 virtual ptrdiff_t print_first(char* f, char* l) const 2919 { 2920 const ptrdiff_t r = l - f; 2921 if (__left_) 2922 { 2923 const ptrdiff_t n1 = 9; 2924 if (r < n1) 2925 return n1 + __left_->print(l, l) + __right_->print(l, l); 2926 ptrdiff_t sz1 = __left_->print(f+1, l); 2927 if (r < n1 + sz1) 2928 return n1 + sz1 + __right_->print(l, l); 2929 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 2930 if (r >= n1 + sz1 + sz2) 2931 { 2932 *f = '('; 2933 f += 1 + sz1; 2934 *f++ = ')'; 2935 *f++ = ' '; 2936 *f++ = '<'; 2937 *f++ = '<'; 2938 *f++ = '='; 2939 *f++ = ' '; 2940 *f = '('; 2941 f += 1 + sz2; 2942 *f = ')'; 2943 } 2944 return n1 + sz1 + sz2; 2945 } 2946 const ptrdiff_t n2 = sizeof("operator<<=") - 1; 2947 if (r >= n2) 2948 { 2949 *f++ = 'o'; 2950 *f++ = 'p'; 2951 *f++ = 'e'; 2952 *f++ = 'r'; 2953 *f++ = 'a'; 2954 *f++ = 't'; 2955 *f++ = 'o'; 2956 *f++ = 'r'; 2957 *f++ = '<'; 2958 *f++ = '<'; 2959 *f = '='; 2960 } 2961 return n2; 2962 } 2963 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 2964 { 2965 bool r = true; 2966 if (__left_) 2967 r = r && __left_->fix_forward_references(t_begin, t_end); 2968 if (__right_) 2969 r = r && __right_->fix_forward_references(t_begin, t_end); 2970 return r; 2971 } 2972 }; 2973 2974 class __operator_minus 2975 : public __node 2976 { 2977 public: 2978 2979 __operator_minus() {} 2980 __operator_minus(__node* op1, __node* op2) 2981 { 2982 __left_ = op1; 2983 __right_ = op2; 2984 } 2985 virtual size_t first_size() const 2986 { 2987 if (__cached_size_ == -1) 2988 { 2989 if (__left_) 2990 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 2991 else 2992 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1; 2993 } 2994 return __cached_size_; 2995 } 2996 virtual char* first_demangled_name(char* buf) const 2997 { 2998 if (__left_) 2999 { 3000 *buf++ = '('; 3001 buf = __left_->get_demangled_name(buf); 3002 strncpy(buf, ") - (", 5); 3003 buf += 5; 3004 buf = __right_->get_demangled_name(buf); 3005 *buf++ = ')'; 3006 } 3007 else 3008 { 3009 strncpy(buf, "operator-", sizeof("operator-") - 1); 3010 buf += sizeof("operator-") - 1; 3011 } 3012 return buf; 3013 } 3014 virtual ptrdiff_t print_first(char* f, char* l) const 3015 { 3016 const ptrdiff_t r = l - f; 3017 if (__left_) 3018 { 3019 const ptrdiff_t n1 = 7; 3020 if (r < n1) 3021 return n1 + __left_->print(l, l) + __right_->print(l, l); 3022 ptrdiff_t sz1 = __left_->print(f+1, l); 3023 if (r < n1 + sz1) 3024 return n1 + sz1 + __right_->print(l, l); 3025 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3026 if (r >= n1 + sz1 + sz2) 3027 { 3028 *f = '('; 3029 f += 1 + sz1; 3030 *f++ = ')'; 3031 *f++ = ' '; 3032 *f++ = '-'; 3033 *f++ = ' '; 3034 *f = '('; 3035 f += 1 + sz2; 3036 *f = ')'; 3037 } 3038 return n1 + sz1 + sz2; 3039 } 3040 const ptrdiff_t n2 = sizeof("operator-") - 1; 3041 if (r >= n2) 3042 { 3043 *f++ = 'o'; 3044 *f++ = 'p'; 3045 *f++ = 'e'; 3046 *f++ = 'r'; 3047 *f++ = 'a'; 3048 *f++ = 't'; 3049 *f++ = 'o'; 3050 *f++ = 'r'; 3051 *f = '-'; 3052 } 3053 return n2; 3054 } 3055 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3056 { 3057 bool r = true; 3058 if (__left_) 3059 r = r && __left_->fix_forward_references(t_begin, t_end); 3060 if (__right_) 3061 r = r && __right_->fix_forward_references(t_begin, t_end); 3062 return r; 3063 } 3064 }; 3065 3066 class __operator_minus_equal 3067 : public __node 3068 { 3069 public: 3070 3071 __operator_minus_equal() {} 3072 __operator_minus_equal(__node* op1, __node* op2) 3073 { 3074 __left_ = op1; 3075 __right_ = op2; 3076 } 3077 virtual size_t first_size() const 3078 { 3079 if (__cached_size_ == -1) 3080 { 3081 if (__left_) 3082 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 3083 else 3084 const_cast<long&>(__cached_size_) = sizeof("operator-=") - 1; 3085 } 3086 return __cached_size_; 3087 } 3088 virtual char* first_demangled_name(char* buf) const 3089 { 3090 if (__left_) 3091 { 3092 *buf++ = '('; 3093 buf = __left_->get_demangled_name(buf); 3094 strncpy(buf, ") -= (", 6); 3095 buf += 6; 3096 buf = __right_->get_demangled_name(buf); 3097 *buf++ = ')'; 3098 } 3099 else 3100 { 3101 strncpy(buf, "operator-=", sizeof("operator-=") - 1); 3102 buf += sizeof("operator-=") - 1; 3103 } 3104 return buf; 3105 } 3106 virtual ptrdiff_t print_first(char* f, char* l) const 3107 { 3108 const ptrdiff_t r = l - f; 3109 if (__left_) 3110 { 3111 const ptrdiff_t n1 = 8; 3112 if (r < n1) 3113 return n1 + __left_->print(l, l) + __right_->print(l, l); 3114 ptrdiff_t sz1 = __left_->print(f+1, l); 3115 if (r < n1 + sz1) 3116 return n1 + sz1 + __right_->print(l, l); 3117 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3118 if (r >= n1 + sz1 + sz2) 3119 { 3120 *f = '('; 3121 f += 1 + sz1; 3122 *f++ = ')'; 3123 *f++ = ' '; 3124 *f++ = '-'; 3125 *f++ = '='; 3126 *f++ = ' '; 3127 *f = '('; 3128 f += 1 + sz2; 3129 *f = ')'; 3130 } 3131 return n1 + sz1 + sz2; 3132 } 3133 const ptrdiff_t n2 = sizeof("operator-=") - 1; 3134 if (r >= n2) 3135 { 3136 *f++ = 'o'; 3137 *f++ = 'p'; 3138 *f++ = 'e'; 3139 *f++ = 'r'; 3140 *f++ = 'a'; 3141 *f++ = 't'; 3142 *f++ = 'o'; 3143 *f++ = 'r'; 3144 *f++ = '-'; 3145 *f = '='; 3146 } 3147 return n2; 3148 } 3149 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3150 { 3151 bool r = true; 3152 if (__left_) 3153 r = r && __left_->fix_forward_references(t_begin, t_end); 3154 if (__right_) 3155 r = r && __right_->fix_forward_references(t_begin, t_end); 3156 return r; 3157 } 3158 }; 3159 3160 class __operator_times 3161 : public __node 3162 { 3163 public: 3164 3165 __operator_times() {} 3166 __operator_times(__node* op1, __node* op2) 3167 { 3168 __left_ = op1; 3169 __right_ = op2; 3170 } 3171 virtual size_t first_size() const 3172 { 3173 if (__cached_size_ == -1) 3174 { 3175 if (__left_) 3176 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 3177 else 3178 const_cast<long&>(__cached_size_) = sizeof("operator*") - 1; 3179 } 3180 return __cached_size_; 3181 } 3182 virtual char* first_demangled_name(char* buf) const 3183 { 3184 if (__left_) 3185 { 3186 *buf++ = '('; 3187 buf = __left_->get_demangled_name(buf); 3188 strncpy(buf, ") * (", 5); 3189 buf += 5; 3190 buf = __right_->get_demangled_name(buf); 3191 *buf++ = ')'; 3192 } 3193 else 3194 { 3195 strncpy(buf, "operator*", sizeof("operator*") - 1); 3196 buf += sizeof("operator*") - 1; 3197 } 3198 return buf; 3199 } 3200 virtual ptrdiff_t print_first(char* f, char* l) const 3201 { 3202 const ptrdiff_t r = l - f; 3203 if (__left_) 3204 { 3205 const ptrdiff_t n1 = 7; 3206 if (r < n1) 3207 return n1 + __left_->print(l, l) + __right_->print(l, l); 3208 ptrdiff_t sz1 = __left_->print(f+1, l); 3209 if (r < n1 + sz1) 3210 return n1 + sz1 + __right_->print(l, l); 3211 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3212 if (r >= n1 + sz1 + sz2) 3213 { 3214 *f = '('; 3215 f += 1 + sz1; 3216 *f++ = ')'; 3217 *f++ = ' '; 3218 *f++ = '*'; 3219 *f++ = ' '; 3220 *f = '('; 3221 f += 1 + sz2; 3222 *f = ')'; 3223 } 3224 return n1 + sz1 + sz2; 3225 } 3226 const ptrdiff_t n2 = sizeof("operator*") - 1; 3227 if (r >= n2) 3228 { 3229 *f++ = 'o'; 3230 *f++ = 'p'; 3231 *f++ = 'e'; 3232 *f++ = 'r'; 3233 *f++ = 'a'; 3234 *f++ = 't'; 3235 *f++ = 'o'; 3236 *f++ = 'r'; 3237 *f = '*'; 3238 } 3239 return n2; 3240 } 3241 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3242 { 3243 bool r = true; 3244 if (__left_) 3245 r = r && __left_->fix_forward_references(t_begin, t_end); 3246 if (__right_) 3247 r = r && __right_->fix_forward_references(t_begin, t_end); 3248 return r; 3249 } 3250 }; 3251 3252 class __operator_times_equal 3253 : public __node 3254 { 3255 public: 3256 3257 __operator_times_equal() {} 3258 __operator_times_equal(__node* op1, __node* op2) 3259 { 3260 __left_ = op1; 3261 __right_ = op2; 3262 } 3263 virtual size_t first_size() const 3264 { 3265 if (__cached_size_ == -1) 3266 { 3267 if (__left_) 3268 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 3269 else 3270 const_cast<long&>(__cached_size_) = sizeof("operator*=") - 1; 3271 } 3272 return __cached_size_; 3273 } 3274 virtual char* first_demangled_name(char* buf) const 3275 { 3276 if (__left_) 3277 { 3278 *buf++ = '('; 3279 buf = __left_->get_demangled_name(buf); 3280 strncpy(buf, ") *= (", 6); 3281 buf += 6; 3282 buf = __right_->get_demangled_name(buf); 3283 *buf++ = ')'; 3284 } 3285 else 3286 { 3287 strncpy(buf, "operator*=", sizeof("operator*=") - 1); 3288 buf += sizeof("operator*=") - 1; 3289 } 3290 return buf; 3291 } 3292 virtual ptrdiff_t print_first(char* f, char* l) const 3293 { 3294 const ptrdiff_t r = l - f; 3295 if (__left_) 3296 { 3297 const ptrdiff_t n1 = 8; 3298 if (r < n1) 3299 return n1 + __left_->print(l, l) + __right_->print(l, l); 3300 ptrdiff_t sz1 = __left_->print(f+1, l); 3301 if (r < n1 + sz1) 3302 return n1 + sz1 + __right_->print(l, l); 3303 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3304 if (r >= n1 + sz1 + sz2) 3305 { 3306 *f = '('; 3307 f += 1 + sz1; 3308 *f++ = ')'; 3309 *f++ = ' '; 3310 *f++ = '*'; 3311 *f++ = '='; 3312 *f++ = ' '; 3313 *f = '('; 3314 f += 1 + sz2; 3315 *f = ')'; 3316 } 3317 return n1 + sz1 + sz2; 3318 } 3319 const ptrdiff_t n2 = sizeof("operator*=") - 1; 3320 if (r >= n2) 3321 { 3322 *f++ = 'o'; 3323 *f++ = 'p'; 3324 *f++ = 'e'; 3325 *f++ = 'r'; 3326 *f++ = 'a'; 3327 *f++ = 't'; 3328 *f++ = 'o'; 3329 *f++ = 'r'; 3330 *f++ = '*'; 3331 *f = '='; 3332 } 3333 return n2; 3334 } 3335 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3336 { 3337 bool r = true; 3338 if (__left_) 3339 r = r && __left_->fix_forward_references(t_begin, t_end); 3340 if (__right_) 3341 r = r && __right_->fix_forward_references(t_begin, t_end); 3342 return r; 3343 } 3344 }; 3345 3346 class __operator_decrement 3347 : public __node 3348 { 3349 public: 3350 3351 __operator_decrement() {} 3352 explicit __operator_decrement(bool prefix, __node* op) 3353 { 3354 __size_ = prefix; 3355 __left_ = op; 3356 } 3357 virtual size_t first_size() const 3358 { 3359 if (__cached_size_ == -1) 3360 { 3361 if (__left_) 3362 const_cast<long&>(__cached_size_) = 4+__left_->size(); 3363 else 3364 const_cast<long&>(__cached_size_) = sizeof("operator--") - 1; 3365 } 3366 return __cached_size_; 3367 } 3368 virtual char* first_demangled_name(char* buf) const 3369 { 3370 if (__left_) 3371 { 3372 if (__size_) 3373 { 3374 *buf++ = '-'; 3375 *buf++ = '-'; 3376 *buf++ = '('; 3377 } 3378 else 3379 *buf++ = '('; 3380 buf = __left_->get_demangled_name(buf); 3381 if (__size_) 3382 *buf++ = ')'; 3383 else 3384 { 3385 *buf++ = ')'; 3386 *buf++ = '-'; 3387 *buf++ = '-'; 3388 } 3389 } 3390 else 3391 { 3392 strncpy(buf, "operator--", sizeof("operator--") - 1); 3393 buf += sizeof("operator--") - 1; 3394 } 3395 return buf; 3396 } 3397 virtual ptrdiff_t print_first(char* f, char* l) const 3398 { 3399 const ptrdiff_t r = l - f; 3400 if (__left_) 3401 { 3402 const ptrdiff_t n1 = 4; 3403 if (r < n1) 3404 return n1 + __left_->print(l, l); 3405 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l); 3406 if (r >= n1 + sz1) 3407 { 3408 if (__size_) 3409 { 3410 *f++ = '-'; 3411 *f++ = '-'; 3412 *f = '('; 3413 f += 1+sz1; 3414 *f = ')'; 3415 } 3416 else 3417 { 3418 *f = '('; 3419 f += 1+sz1; 3420 *f++ = ')'; 3421 *f++ = '-'; 3422 *f = '-'; 3423 } 3424 } 3425 return n1 + sz1; 3426 } 3427 const ptrdiff_t n2 = sizeof("operator--") - 1; 3428 if (r >= n2) 3429 { 3430 *f++ = 'o'; 3431 *f++ = 'p'; 3432 *f++ = 'e'; 3433 *f++ = 'r'; 3434 *f++ = 'a'; 3435 *f++ = 't'; 3436 *f++ = 'o'; 3437 *f++ = 'r'; 3438 *f++ = '-'; 3439 *f = '-'; 3440 } 3441 return n2; 3442 } 3443 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3444 { 3445 if (__left_) 3446 return __left_->fix_forward_references(t_begin, t_end); 3447 return true; 3448 } 3449 }; 3450 3451 class __operator_not_equal 3452 : public __node 3453 { 3454 public: 3455 3456 __operator_not_equal() {} 3457 __operator_not_equal(__node* op1, __node* op2) 3458 { 3459 __left_ = op1; 3460 __right_ = op2; 3461 } 3462 virtual size_t first_size() const 3463 { 3464 if (__cached_size_ == -1) 3465 { 3466 if (__left_) 3467 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 3468 else 3469 const_cast<long&>(__cached_size_) = sizeof("operator!=") - 1; 3470 } 3471 return __cached_size_; 3472 } 3473 virtual char* first_demangled_name(char* buf) const 3474 { 3475 if (__left_) 3476 { 3477 *buf++ = '('; 3478 buf = __left_->get_demangled_name(buf); 3479 strncpy(buf, ") != (", 6); 3480 buf += 6; 3481 buf = __right_->get_demangled_name(buf); 3482 *buf++ = ')'; 3483 } 3484 else 3485 { 3486 strncpy(buf, "operator!=", sizeof("operator!=") - 1); 3487 buf += sizeof("operator!=") - 1; 3488 } 3489 return buf; 3490 } 3491 virtual ptrdiff_t print_first(char* f, char* l) const 3492 { 3493 const ptrdiff_t r = l - f; 3494 if (__left_) 3495 { 3496 const ptrdiff_t n1 = 8; 3497 if (r < n1) 3498 return n1 + __left_->print(l, l) + __right_->print(l, l); 3499 ptrdiff_t sz1 = __left_->print(f+1, l); 3500 if (r < n1 + sz1) 3501 return n1 + sz1 + __right_->print(l, l); 3502 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3503 if (r >= n1 + sz1 + sz2) 3504 { 3505 *f = '('; 3506 f += 1 + sz1; 3507 *f++ = ')'; 3508 *f++ = ' '; 3509 *f++ = '!'; 3510 *f++ = '='; 3511 *f++ = ' '; 3512 *f = '('; 3513 f += 1 + sz2; 3514 *f = ')'; 3515 } 3516 return n1 + sz1 + sz2; 3517 } 3518 const ptrdiff_t n2 = sizeof("operator!=") - 1; 3519 if (r >= n2) 3520 { 3521 *f++ = 'o'; 3522 *f++ = 'p'; 3523 *f++ = 'e'; 3524 *f++ = 'r'; 3525 *f++ = 'a'; 3526 *f++ = 't'; 3527 *f++ = 'o'; 3528 *f++ = 'r'; 3529 *f++ = '!'; 3530 *f = '='; 3531 } 3532 return n2; 3533 } 3534 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3535 { 3536 bool r = true; 3537 if (__left_) 3538 r = r && __left_->fix_forward_references(t_begin, t_end); 3539 if (__right_) 3540 r = r && __right_->fix_forward_references(t_begin, t_end); 3541 return r; 3542 } 3543 }; 3544 3545 class __operator_negate 3546 : public __node 3547 { 3548 public: 3549 3550 __operator_negate() {} 3551 explicit __operator_negate(__node* op) 3552 { 3553 __left_ = op; 3554 } 3555 virtual size_t first_size() const 3556 { 3557 if (__cached_size_ == -1) 3558 { 3559 if (__left_) 3560 const_cast<long&>(__cached_size_) = 3+__left_->size(); 3561 else 3562 const_cast<long&>(__cached_size_) = sizeof("operator-") - 1; 3563 } 3564 return __cached_size_; 3565 } 3566 virtual char* first_demangled_name(char* buf) const 3567 { 3568 if (__left_) 3569 { 3570 *buf++ = '-'; 3571 *buf++ = '('; 3572 buf = __left_->get_demangled_name(buf); 3573 *buf++ = ')'; 3574 } 3575 else 3576 { 3577 strncpy(buf, "operator-", sizeof("operator-") - 1); 3578 buf += sizeof("operator-") - 1; 3579 } 3580 return buf; 3581 } 3582 virtual ptrdiff_t print_first(char* f, char* l) const 3583 { 3584 const ptrdiff_t r = l - f; 3585 if (__left_) 3586 { 3587 const ptrdiff_t n1 = 3; 3588 if (r < n1) 3589 return n1 + __left_->print(l, l); 3590 ptrdiff_t sz1 = __left_->print(f+2, l); 3591 if (r >= n1 + sz1) 3592 { 3593 *f++ = '-'; 3594 *f = '('; 3595 f += 1 + sz1; 3596 *f = ')'; 3597 } 3598 return n1 + sz1; 3599 } 3600 const ptrdiff_t n2 = sizeof("operator-") - 1; 3601 if (r >= n2) 3602 { 3603 *f++ = 'o'; 3604 *f++ = 'p'; 3605 *f++ = 'e'; 3606 *f++ = 'r'; 3607 *f++ = 'a'; 3608 *f++ = 't'; 3609 *f++ = 'o'; 3610 *f++ = 'r'; 3611 *f = '-'; 3612 } 3613 return n2; 3614 } 3615 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3616 { 3617 if (__left_) 3618 return __left_->fix_forward_references(t_begin, t_end); 3619 return true; 3620 } 3621 }; 3622 3623 class __operator_logical_not 3624 : public __node 3625 { 3626 public: 3627 3628 __operator_logical_not() {} 3629 explicit __operator_logical_not(__node* op) 3630 { 3631 __left_ = op; 3632 } 3633 virtual size_t first_size() const 3634 { 3635 if (__cached_size_ == -1) 3636 { 3637 if (__left_) 3638 const_cast<long&>(__cached_size_) = 3+__left_->size(); 3639 else 3640 const_cast<long&>(__cached_size_) = sizeof("operator!") - 1; 3641 } 3642 return __cached_size_; 3643 } 3644 virtual char* first_demangled_name(char* buf) const 3645 { 3646 if (__left_) 3647 { 3648 *buf++ = '!'; 3649 *buf++ = '('; 3650 buf = __left_->get_demangled_name(buf); 3651 *buf++ = ')'; 3652 } 3653 else 3654 { 3655 strncpy(buf, "operator!", sizeof("operator!") - 1); 3656 buf += sizeof("operator!") - 1; 3657 } 3658 return buf; 3659 } 3660 virtual ptrdiff_t print_first(char* f, char* l) const 3661 { 3662 const ptrdiff_t r = l - f; 3663 if (__left_) 3664 { 3665 const ptrdiff_t n1 = 3; 3666 if (r < n1) 3667 return n1 + __left_->print(l, l); 3668 ptrdiff_t sz1 = __left_->print(f+2, l); 3669 if (r >= n1 + sz1) 3670 { 3671 *f++ = '!'; 3672 *f = '('; 3673 f += 1 + sz1; 3674 *f = ')'; 3675 } 3676 return n1 + sz1; 3677 } 3678 const ptrdiff_t n2 = sizeof("operator!") - 1; 3679 if (r >= n2) 3680 { 3681 *f++ = 'o'; 3682 *f++ = 'p'; 3683 *f++ = 'e'; 3684 *f++ = 'r'; 3685 *f++ = 'a'; 3686 *f++ = 't'; 3687 *f++ = 'o'; 3688 *f++ = 'r'; 3689 *f = '!'; 3690 } 3691 return n2; 3692 } 3693 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3694 { 3695 if (__left_) 3696 return __left_->fix_forward_references(t_begin, t_end); 3697 return true; 3698 } 3699 }; 3700 3701 class __operator_logical_or 3702 : public __node 3703 { 3704 public: 3705 3706 __operator_logical_or() {} 3707 __operator_logical_or(__node* op1, __node* op2) 3708 { 3709 __left_ = op1; 3710 __right_ = op2; 3711 } 3712 virtual size_t first_size() const 3713 { 3714 if (__cached_size_ == -1) 3715 { 3716 if (__left_) 3717 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 3718 else 3719 const_cast<long&>(__cached_size_) = sizeof("operator||") - 1; 3720 } 3721 return __cached_size_; 3722 } 3723 virtual char* first_demangled_name(char* buf) const 3724 { 3725 if (__left_) 3726 { 3727 *buf++ = '('; 3728 buf = __left_->get_demangled_name(buf); 3729 strncpy(buf, ") || (", 6); 3730 buf += 6; 3731 buf = __right_->get_demangled_name(buf); 3732 *buf++ = ')'; 3733 } 3734 else 3735 { 3736 strncpy(buf, "operator||", sizeof("operator||") - 1); 3737 buf += sizeof("operator||") - 1; 3738 } 3739 return buf; 3740 } 3741 virtual ptrdiff_t print_first(char* f, char* l) const 3742 { 3743 const ptrdiff_t r = l - f; 3744 if (__left_) 3745 { 3746 const ptrdiff_t n1 = 8; 3747 if (r < n1) 3748 return n1 + __left_->print(l, l) + __right_->print(l, l); 3749 ptrdiff_t sz1 = __left_->print(f+1, l); 3750 if (r < n1 + sz1) 3751 return n1 + sz1 + __right_->print(l, l); 3752 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3753 if (r >= n1 + sz1 + sz2) 3754 { 3755 *f = '('; 3756 f += 1 + sz1; 3757 *f++ = ')'; 3758 *f++ = ' '; 3759 *f++ = '|'; 3760 *f++ = '|'; 3761 *f++ = ' '; 3762 *f = '('; 3763 f += 1 + sz2; 3764 *f = ')'; 3765 } 3766 return n1 + sz1 + sz2; 3767 } 3768 const ptrdiff_t n2 = sizeof("operator||") - 1; 3769 if (r >= n2) 3770 { 3771 *f++ = 'o'; 3772 *f++ = 'p'; 3773 *f++ = 'e'; 3774 *f++ = 'r'; 3775 *f++ = 'a'; 3776 *f++ = 't'; 3777 *f++ = 'o'; 3778 *f++ = 'r'; 3779 *f++ = '|'; 3780 *f = '|'; 3781 } 3782 return n2; 3783 } 3784 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3785 { 3786 bool r = true; 3787 if (__left_) 3788 r = r && __left_->fix_forward_references(t_begin, t_end); 3789 if (__right_) 3790 r = r && __right_->fix_forward_references(t_begin, t_end); 3791 return r; 3792 } 3793 }; 3794 3795 class __operator_bit_or 3796 : public __node 3797 { 3798 public: 3799 3800 __operator_bit_or() {} 3801 __operator_bit_or(__node* op1, __node* op2) 3802 { 3803 __left_ = op1; 3804 __right_ = op2; 3805 } 3806 virtual size_t first_size() const 3807 { 3808 if (__cached_size_ == -1) 3809 { 3810 if (__left_) 3811 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 3812 else 3813 const_cast<long&>(__cached_size_) = sizeof("operator|") - 1; 3814 } 3815 return __cached_size_; 3816 } 3817 virtual char* first_demangled_name(char* buf) const 3818 { 3819 if (__left_) 3820 { 3821 *buf++ = '('; 3822 buf = __left_->get_demangled_name(buf); 3823 strncpy(buf, ") | (", 5); 3824 buf += 5; 3825 buf = __right_->get_demangled_name(buf); 3826 *buf++ = ')'; 3827 } 3828 else 3829 { 3830 strncpy(buf, "operator|", sizeof("operator|") - 1); 3831 buf += sizeof("operator|") - 1; 3832 } 3833 return buf; 3834 } 3835 virtual ptrdiff_t print_first(char* f, char* l) const 3836 { 3837 const ptrdiff_t r = l - f; 3838 if (__left_) 3839 { 3840 const ptrdiff_t n1 = 7; 3841 if (r < n1) 3842 return n1 + __left_->print(l, l) + __right_->print(l, l); 3843 ptrdiff_t sz1 = __left_->print(f+1, l); 3844 if (r < n1 + sz1) 3845 return n1 + sz1 + __right_->print(l, l); 3846 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3847 if (r >= n1 + sz1 + sz2) 3848 { 3849 *f = '('; 3850 f += 1 + sz1; 3851 *f++ = ')'; 3852 *f++ = ' '; 3853 *f++ = '|'; 3854 *f++ = ' '; 3855 *f = '('; 3856 f += 1 + sz2; 3857 *f = ')'; 3858 } 3859 return n1 + sz1 + sz2; 3860 } 3861 const ptrdiff_t n2 = sizeof("operator|") - 1; 3862 if (r >= n2) 3863 { 3864 *f++ = 'o'; 3865 *f++ = 'p'; 3866 *f++ = 'e'; 3867 *f++ = 'r'; 3868 *f++ = 'a'; 3869 *f++ = 't'; 3870 *f++ = 'o'; 3871 *f++ = 'r'; 3872 *f = '|'; 3873 } 3874 return n2; 3875 } 3876 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3877 { 3878 bool r = true; 3879 if (__left_) 3880 r = r && __left_->fix_forward_references(t_begin, t_end); 3881 if (__right_) 3882 r = r && __right_->fix_forward_references(t_begin, t_end); 3883 return r; 3884 } 3885 }; 3886 3887 class __operator_or_equal 3888 : public __node 3889 { 3890 public: 3891 3892 __operator_or_equal() {} 3893 __operator_or_equal(__node* op1, __node* op2) 3894 { 3895 __left_ = op1; 3896 __right_ = op2; 3897 } 3898 virtual size_t first_size() const 3899 { 3900 if (__cached_size_ == -1) 3901 { 3902 if (__left_) 3903 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 3904 else 3905 const_cast<long&>(__cached_size_) = sizeof("operator|=") - 1; 3906 } 3907 return __cached_size_; 3908 } 3909 virtual char* first_demangled_name(char* buf) const 3910 { 3911 if (__left_) 3912 { 3913 *buf++ = '('; 3914 buf = __left_->get_demangled_name(buf); 3915 strncpy(buf, ") |= (", 6); 3916 buf += 6; 3917 buf = __right_->get_demangled_name(buf); 3918 *buf++ = ')'; 3919 } 3920 else 3921 { 3922 strncpy(buf, "operator|=", sizeof("operator|=") - 1); 3923 buf += sizeof("operator|=") - 1; 3924 } 3925 return buf; 3926 } 3927 virtual ptrdiff_t print_first(char* f, char* l) const 3928 { 3929 const ptrdiff_t r = l - f; 3930 if (__left_) 3931 { 3932 const ptrdiff_t n1 = 8; 3933 if (r < n1) 3934 return n1 + __left_->print(l, l) + __right_->print(l, l); 3935 ptrdiff_t sz1 = __left_->print(f+1, l); 3936 if (r < n1 + sz1) 3937 return n1 + sz1 + __right_->print(l, l); 3938 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 3939 if (r >= n1 + sz1 + sz2) 3940 { 3941 *f = '('; 3942 f += 1 + sz1; 3943 *f++ = ')'; 3944 *f++ = ' '; 3945 *f++ = '|'; 3946 *f++ = '='; 3947 *f++ = ' '; 3948 *f = '('; 3949 f += 1 + sz2; 3950 *f = ')'; 3951 } 3952 return n1 + sz1 + sz2; 3953 } 3954 const ptrdiff_t n2 = sizeof("operator|=") - 1; 3955 if (r >= n2) 3956 { 3957 *f++ = 'o'; 3958 *f++ = 'p'; 3959 *f++ = 'e'; 3960 *f++ = 'r'; 3961 *f++ = 'a'; 3962 *f++ = 't'; 3963 *f++ = 'o'; 3964 *f++ = 'r'; 3965 *f++ = '|'; 3966 *f = '='; 3967 } 3968 return n2; 3969 } 3970 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 3971 { 3972 bool r = true; 3973 if (__left_) 3974 r = r && __left_->fix_forward_references(t_begin, t_end); 3975 if (__right_) 3976 r = r && __right_->fix_forward_references(t_begin, t_end); 3977 return r; 3978 } 3979 }; 3980 3981 class __operator_pointer_to_member 3982 : public __node 3983 { 3984 public: 3985 3986 __operator_pointer_to_member() {} 3987 __operator_pointer_to_member(__node* op1, __node* op2) 3988 { 3989 __left_ = op1; 3990 __right_ = op2; 3991 } 3992 virtual size_t first_size() const 3993 { 3994 if (__cached_size_ == -1) 3995 { 3996 if (__left_) 3997 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size(); 3998 else 3999 const_cast<long&>(__cached_size_) = sizeof("operator->*") - 1; 4000 } 4001 return __cached_size_; 4002 } 4003 virtual char* first_demangled_name(char* buf) const 4004 { 4005 if (__left_) 4006 { 4007 *buf++ = '('; 4008 buf = __left_->get_demangled_name(buf); 4009 strncpy(buf, ") ->* (", 7); 4010 buf += 7; 4011 buf = __right_->get_demangled_name(buf); 4012 *buf++ = ')'; 4013 } 4014 else 4015 { 4016 strncpy(buf, "operator->*", sizeof("operator->*") - 1); 4017 buf += sizeof("operator->*") - 1; 4018 } 4019 return buf; 4020 } 4021 virtual ptrdiff_t print_first(char* f, char* l) const 4022 { 4023 const ptrdiff_t r = l - f; 4024 if (__left_) 4025 { 4026 const ptrdiff_t n1 = 9; 4027 if (r < n1) 4028 return n1 + __left_->print(l, l) + __right_->print(l, l); 4029 ptrdiff_t sz1 = __left_->print(f+1, l); 4030 if (r < n1 + sz1) 4031 return n1 + sz1 + __right_->print(l, l); 4032 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4033 if (r >= n1 + sz1 + sz2) 4034 { 4035 *f = '('; 4036 f += 1 + sz1; 4037 *f++ = ')'; 4038 *f++ = ' '; 4039 *f++ = '-'; 4040 *f++ = '>'; 4041 *f++ = '*'; 4042 *f++ = ' '; 4043 *f = '('; 4044 f += 1 + sz2; 4045 *f = ')'; 4046 } 4047 return n1 + sz1 + sz2; 4048 } 4049 const ptrdiff_t n2 = sizeof("operator->*") - 1; 4050 if (r >= n2) 4051 { 4052 *f++ = 'o'; 4053 *f++ = 'p'; 4054 *f++ = 'e'; 4055 *f++ = 'r'; 4056 *f++ = 'a'; 4057 *f++ = 't'; 4058 *f++ = 'o'; 4059 *f++ = 'r'; 4060 *f++ = '-'; 4061 *f++ = '>'; 4062 *f = '*'; 4063 } 4064 return n2; 4065 } 4066 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4067 { 4068 bool r = true; 4069 if (__left_) 4070 r = r && __left_->fix_forward_references(t_begin, t_end); 4071 if (__right_) 4072 r = r && __right_->fix_forward_references(t_begin, t_end); 4073 return r; 4074 } 4075 }; 4076 4077 class __operator_plus 4078 : public __node 4079 { 4080 public: 4081 4082 __operator_plus() {} 4083 __operator_plus(__node* op1, __node* op2) 4084 { 4085 __left_ = op1; 4086 __right_ = op2; 4087 } 4088 virtual size_t first_size() const 4089 { 4090 if (__cached_size_ == -1) 4091 { 4092 if (__left_) 4093 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 4094 else 4095 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1; 4096 } 4097 return __cached_size_; 4098 } 4099 virtual char* first_demangled_name(char* buf) const 4100 { 4101 if (__left_) 4102 { 4103 *buf++ = '('; 4104 buf = __left_->get_demangled_name(buf); 4105 strncpy(buf, ") + (", 5); 4106 buf += 5; 4107 buf = __right_->get_demangled_name(buf); 4108 *buf++ = ')'; 4109 } 4110 else 4111 { 4112 strncpy(buf, "operator+", sizeof("operator+") - 1); 4113 buf += sizeof("operator+") - 1; 4114 } 4115 return buf; 4116 } 4117 virtual ptrdiff_t print_first(char* f, char* l) const 4118 { 4119 const ptrdiff_t r = l - f; 4120 if (__left_) 4121 { 4122 const ptrdiff_t n1 = 7; 4123 if (r < n1) 4124 return n1 + __left_->print(l, l) + __right_->print(l, l); 4125 ptrdiff_t sz1 = __left_->print(f+1, l); 4126 if (r < n1 + sz1) 4127 return n1 + sz1 + __right_->print(l, l); 4128 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4129 if (r >= n1 + sz1 + sz2) 4130 { 4131 *f = '('; 4132 f += 1 + sz1; 4133 *f++ = ')'; 4134 *f++ = ' '; 4135 *f++ = '+'; 4136 *f++ = ' '; 4137 *f = '('; 4138 f += 1 + sz2; 4139 *f = ')'; 4140 } 4141 return n1 + sz1 + sz2; 4142 } 4143 const ptrdiff_t n2 = sizeof("operator+") - 1; 4144 if (r >= n2) 4145 { 4146 *f++ = 'o'; 4147 *f++ = 'p'; 4148 *f++ = 'e'; 4149 *f++ = 'r'; 4150 *f++ = 'a'; 4151 *f++ = 't'; 4152 *f++ = 'o'; 4153 *f++ = 'r'; 4154 *f = '+'; 4155 } 4156 return n2; 4157 } 4158 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4159 { 4160 bool r = true; 4161 if (__left_) 4162 r = r && __left_->fix_forward_references(t_begin, t_end); 4163 if (__right_) 4164 r = r && __right_->fix_forward_references(t_begin, t_end); 4165 return r; 4166 } 4167 }; 4168 4169 class __operator_plus_equal 4170 : public __node 4171 { 4172 public: 4173 4174 __operator_plus_equal() {} 4175 __operator_plus_equal(__node* op1, __node* op2) 4176 { 4177 __left_ = op1; 4178 __right_ = op2; 4179 } 4180 virtual size_t first_size() const 4181 { 4182 if (__cached_size_ == -1) 4183 { 4184 if (__left_) 4185 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 4186 else 4187 const_cast<long&>(__cached_size_) = sizeof("operator+=") - 1; 4188 } 4189 return __cached_size_; 4190 } 4191 virtual char* first_demangled_name(char* buf) const 4192 { 4193 if (__left_) 4194 { 4195 *buf++ = '('; 4196 buf = __left_->get_demangled_name(buf); 4197 strncpy(buf, ") += (", 6); 4198 buf += 6; 4199 buf = __right_->get_demangled_name(buf); 4200 *buf++ = ')'; 4201 } 4202 else 4203 { 4204 strncpy(buf, "operator+=", sizeof("operator+=") - 1); 4205 buf += sizeof("operator+=") - 1; 4206 } 4207 return buf; 4208 } 4209 virtual ptrdiff_t print_first(char* f, char* l) const 4210 { 4211 const ptrdiff_t r = l - f; 4212 if (__left_) 4213 { 4214 const ptrdiff_t n1 = 8; 4215 if (r < n1) 4216 return n1 + __left_->print(l, l) + __right_->print(l, l); 4217 ptrdiff_t sz1 = __left_->print(f+1, l); 4218 if (r < n1 + sz1) 4219 return n1 + sz1 + __right_->print(l, l); 4220 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4221 if (r >= n1 + sz1 + sz2) 4222 { 4223 *f = '('; 4224 f += 1 + sz1; 4225 *f++ = ')'; 4226 *f++ = ' '; 4227 *f++ = '+'; 4228 *f++ = '='; 4229 *f++ = ' '; 4230 *f = '('; 4231 f += 1 + sz2; 4232 *f = ')'; 4233 } 4234 return n1 + sz1 + sz2; 4235 } 4236 const ptrdiff_t n2 = sizeof("operator+=") - 1; 4237 if (r >= n2) 4238 { 4239 *f++ = 'o'; 4240 *f++ = 'p'; 4241 *f++ = 'e'; 4242 *f++ = 'r'; 4243 *f++ = 'a'; 4244 *f++ = 't'; 4245 *f++ = 'o'; 4246 *f++ = 'r'; 4247 *f++ = '+'; 4248 *f = '='; 4249 } 4250 return n2; 4251 } 4252 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4253 { 4254 bool r = true; 4255 if (__left_) 4256 r = r && __left_->fix_forward_references(t_begin, t_end); 4257 if (__right_) 4258 r = r && __right_->fix_forward_references(t_begin, t_end); 4259 return r; 4260 } 4261 }; 4262 4263 class __operator_increment 4264 : public __node 4265 { 4266 public: 4267 4268 __operator_increment() {} 4269 explicit __operator_increment(bool prefix, __node* op) 4270 { 4271 __size_ = prefix; 4272 __left_ = op; 4273 } 4274 virtual size_t first_size() const 4275 { 4276 if (__cached_size_ == -1) 4277 { 4278 if (__left_) 4279 const_cast<long&>(__cached_size_) = 4+__left_->size(); 4280 else 4281 const_cast<long&>(__cached_size_) = sizeof("operator++") - 1; 4282 } 4283 return __cached_size_; 4284 } 4285 virtual char* first_demangled_name(char* buf) const 4286 { 4287 if (__left_) 4288 { 4289 if (__size_) 4290 { 4291 *buf++ = '+'; 4292 *buf++ = '+'; 4293 *buf++ = '('; 4294 } 4295 else 4296 *buf++ = '('; 4297 buf = __left_->get_demangled_name(buf); 4298 if (__size_) 4299 *buf++ = ')'; 4300 else 4301 { 4302 *buf++ = ')'; 4303 *buf++ = '+'; 4304 *buf++ = '+'; 4305 } 4306 } 4307 else 4308 { 4309 strncpy(buf, "operator++", sizeof("operator++") - 1); 4310 buf += sizeof("operator++") - 1; 4311 } 4312 return buf; 4313 } 4314 virtual ptrdiff_t print_first(char* f, char* l) const 4315 { 4316 const ptrdiff_t r = l - f; 4317 if (__left_) 4318 { 4319 const ptrdiff_t n1 = 4; 4320 if (r < n1) 4321 return n1 + __left_->print(l, l); 4322 ptrdiff_t sz1 = __left_->print(f + (__size_ ? 3 : 1), l); 4323 if (r >= n1 + sz1) 4324 { 4325 if (__size_) 4326 { 4327 *f++ = '+'; 4328 *f++ = '+'; 4329 *f = '('; 4330 f += 1+sz1; 4331 *f = ')'; 4332 } 4333 else 4334 { 4335 *f = '('; 4336 f += 1+sz1; 4337 *f++ = ')'; 4338 *f++ = '+'; 4339 *f = '+'; 4340 } 4341 } 4342 return n1 + sz1; 4343 } 4344 const ptrdiff_t n2 = sizeof("operator++") - 1; 4345 if (r >= n2) 4346 { 4347 *f++ = 'o'; 4348 *f++ = 'p'; 4349 *f++ = 'e'; 4350 *f++ = 'r'; 4351 *f++ = 'a'; 4352 *f++ = 't'; 4353 *f++ = 'o'; 4354 *f++ = 'r'; 4355 *f++ = '+'; 4356 *f = '+'; 4357 } 4358 return n2; 4359 } 4360 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4361 { 4362 if (__left_) 4363 return __left_->fix_forward_references(t_begin, t_end); 4364 return true; 4365 } 4366 }; 4367 4368 class __operator_unary_plus 4369 : public __node 4370 { 4371 public: 4372 4373 __operator_unary_plus() {} 4374 explicit __operator_unary_plus(__node* op) 4375 { 4376 __left_ = op; 4377 } 4378 virtual size_t first_size() const 4379 { 4380 if (__cached_size_ == -1) 4381 { 4382 if (__left_) 4383 const_cast<long&>(__cached_size_) = 3+__left_->size(); 4384 else 4385 const_cast<long&>(__cached_size_) = sizeof("operator+") - 1; 4386 } 4387 return __cached_size_; 4388 } 4389 virtual char* first_demangled_name(char* buf) const 4390 { 4391 if (__left_) 4392 { 4393 *buf++ = '+'; 4394 *buf++ = '('; 4395 buf = __left_->get_demangled_name(buf); 4396 *buf++ = ')'; 4397 } 4398 else 4399 { 4400 strncpy(buf, "operator+", sizeof("operator+") - 1); 4401 buf += sizeof("operator+") - 1; 4402 } 4403 return buf; 4404 } 4405 virtual ptrdiff_t print_first(char* f, char* l) const 4406 { 4407 const ptrdiff_t r = l - f; 4408 if (__left_) 4409 { 4410 const ptrdiff_t n1 = 3; 4411 if (r < n1) 4412 return n1 + __left_->print(l, l); 4413 ptrdiff_t sz1 = __left_->print(f+2, l); 4414 if (r >= n1 + sz1) 4415 { 4416 *f++ = '+'; 4417 *f = '('; 4418 f += 1 + sz1; 4419 *f = ')'; 4420 } 4421 return n1 + sz1; 4422 } 4423 const ptrdiff_t n2 = sizeof("operator+") - 1; 4424 if (r >= n2) 4425 { 4426 *f++ = 'o'; 4427 *f++ = 'p'; 4428 *f++ = 'e'; 4429 *f++ = 'r'; 4430 *f++ = 'a'; 4431 *f++ = 't'; 4432 *f++ = 'o'; 4433 *f++ = 'r'; 4434 *f = '+'; 4435 } 4436 return n2; 4437 } 4438 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4439 { 4440 if (__left_) 4441 return __left_->fix_forward_references(t_begin, t_end); 4442 return true; 4443 } 4444 }; 4445 4446 class __operator_arrow 4447 : public __node 4448 { 4449 public: 4450 4451 __operator_arrow() {} 4452 __operator_arrow(__node* op1, __node* op2) 4453 { 4454 __left_ = op1; 4455 __right_ = op2; 4456 } 4457 virtual size_t first_size() const 4458 { 4459 if (__cached_size_ == -1) 4460 { 4461 if (__left_) 4462 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 4463 else 4464 const_cast<long&>(__cached_size_) = sizeof("operator->") - 1; 4465 } 4466 return __cached_size_; 4467 } 4468 virtual char* first_demangled_name(char* buf) const 4469 { 4470 if (__left_) 4471 { 4472 *buf++ = '('; 4473 buf = __left_->get_demangled_name(buf); 4474 strncpy(buf, ") -> (", 6); 4475 buf += 6; 4476 buf = __right_->get_demangled_name(buf); 4477 *buf++ = ')'; 4478 } 4479 else 4480 { 4481 strncpy(buf, "operator->", sizeof("operator->") - 1); 4482 buf += sizeof("operator->") - 1; 4483 } 4484 return buf; 4485 } 4486 virtual ptrdiff_t print_first(char* f, char* l) const 4487 { 4488 const ptrdiff_t r = l - f; 4489 if (__left_) 4490 { 4491 const ptrdiff_t n1 = 8; 4492 if (r < n1) 4493 return n1 + __left_->print(l, l) + __right_->print(l, l); 4494 ptrdiff_t sz1 = __left_->print(f+1, l); 4495 if (r < n1 + sz1) 4496 return n1 + sz1 + __right_->print(l, l); 4497 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4498 if (r >= n1 + sz1 + sz2) 4499 { 4500 *f = '('; 4501 f += 1 + sz1; 4502 *f++ = ')'; 4503 *f++ = ' '; 4504 *f++ = '-'; 4505 *f++ = '>'; 4506 *f++ = ' '; 4507 *f = '('; 4508 f += 1 + sz2; 4509 *f = ')'; 4510 } 4511 return n1 + sz1 + sz2; 4512 } 4513 const ptrdiff_t n2 = sizeof("operator->") - 1; 4514 if (r >= n2) 4515 { 4516 *f++ = 'o'; 4517 *f++ = 'p'; 4518 *f++ = 'e'; 4519 *f++ = 'r'; 4520 *f++ = 'a'; 4521 *f++ = 't'; 4522 *f++ = 'o'; 4523 *f++ = 'r'; 4524 *f++ = '-'; 4525 *f = '>'; 4526 } 4527 return n2; 4528 } 4529 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4530 { 4531 bool r = true; 4532 if (__left_) 4533 r = r && __left_->fix_forward_references(t_begin, t_end); 4534 if (__right_) 4535 r = r && __right_->fix_forward_references(t_begin, t_end); 4536 return r; 4537 } 4538 }; 4539 4540 class __operator_conditional 4541 : public __node 4542 { 4543 public: 4544 4545 __operator_conditional() {} 4546 __operator_conditional(__node* op1, __node* op2, __node* op3) 4547 { 4548 __name_ = (const char*)op1; 4549 __left_ = op2; 4550 __right_ = op3; 4551 } 4552 virtual size_t first_size() const 4553 { 4554 if (__cached_size_ == -1) 4555 { 4556 if (__left_) 4557 { 4558 __node* op1 = (__node*)__name_; 4559 const_cast<long&>(__cached_size_) = op1->size() + __left_->size() + 12 + __right_->size(); 4560 } 4561 else 4562 const_cast<long&>(__cached_size_) = sizeof("operator?") - 1; 4563 } 4564 return __cached_size_; 4565 } 4566 virtual char* first_demangled_name(char* buf) const 4567 { 4568 if (__left_) 4569 { 4570 __node* op1 = (__node*)__name_; 4571 *buf++ = '('; 4572 buf = op1->get_demangled_name(buf); 4573 strncpy(buf, ") ? (", 5); 4574 buf += 5; 4575 buf = __left_->get_demangled_name(buf); 4576 strncpy(buf, ") : (", 5); 4577 buf += 5; 4578 buf = __right_->get_demangled_name(buf); 4579 *buf++ = ')'; 4580 } 4581 else 4582 { 4583 strncpy(buf, "operator?", sizeof("operator?") - 1); 4584 buf += sizeof("operator?") - 1; 4585 } 4586 return buf; 4587 } 4588 virtual ptrdiff_t print_first(char* f, char* l) const 4589 { 4590 const ptrdiff_t r = l - f; 4591 if (__left_) 4592 { 4593 const ptrdiff_t n1 = 12; 4594 __node* op1 = (__node*)__name_; 4595 if (r < n1) 4596 return n1 + op1->print(l, l) + __left_->print(l, l) + 4597 __right_->print(l, l); 4598 ptrdiff_t sz1 = op1->print(f+1, l); 4599 if (r < n1 + sz1) 4600 return n1 + sz1 + __left_->print(l, l) + __right_->print(l, l); 4601 ptrdiff_t sz2 = __left_->print(f+6+sz1, l); 4602 if (r < n1 + sz1 + sz2) 4603 return n1 + sz1 + sz2 + __right_->print(l, l); 4604 ptrdiff_t sz3 = __right_->print(f+11+sz1+sz2, l); 4605 if (r >= n1 + sz1 + sz2 + sz3) 4606 { 4607 *f = '('; 4608 f += 1 + sz1; 4609 *f++ = ')'; 4610 *f++ = ' '; 4611 *f++ = '?'; 4612 *f++ = ' '; 4613 *f = '('; 4614 f += 1 + sz2; 4615 *f++ = ')'; 4616 *f++ = ' '; 4617 *f++ = ':'; 4618 *f++ = ' '; 4619 *f = '('; 4620 f += 1 + sz3; 4621 *f = ')'; 4622 } 4623 return n1 + sz1 + sz2 + sz3; 4624 } 4625 const ptrdiff_t n2 = sizeof("operator?") - 1; 4626 if (r >= n2) 4627 { 4628 *f++ = 'o'; 4629 *f++ = 'p'; 4630 *f++ = 'e'; 4631 *f++ = 'r'; 4632 *f++ = 'a'; 4633 *f++ = 't'; 4634 *f++ = 'o'; 4635 *f++ = 'r'; 4636 *f = '?'; 4637 } 4638 return n2; 4639 } 4640 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4641 { 4642 bool r = true; 4643 if (__name_) 4644 r = r && ((__node*)__name_)->fix_forward_references(t_begin, t_end); 4645 if (__left_) 4646 r = r && __left_->fix_forward_references(t_begin, t_end); 4647 if (__right_) 4648 r = r && __right_->fix_forward_references(t_begin, t_end); 4649 return r; 4650 } 4651 }; 4652 4653 class __operator_mod 4654 : public __node 4655 { 4656 public: 4657 4658 __operator_mod() {} 4659 __operator_mod(__node* op1, __node* op2) 4660 { 4661 __left_ = op1; 4662 __right_ = op2; 4663 } 4664 virtual size_t first_size() const 4665 { 4666 if (__cached_size_ == -1) 4667 { 4668 if (__left_) 4669 const_cast<long&>(__cached_size_) = __left_->size() + 7 + __right_->size(); 4670 else 4671 const_cast<long&>(__cached_size_) = sizeof("operator%") - 1; 4672 } 4673 return __cached_size_; 4674 } 4675 virtual char* first_demangled_name(char* buf) const 4676 { 4677 if (__left_) 4678 { 4679 *buf++ = '('; 4680 buf = __left_->get_demangled_name(buf); 4681 strncpy(buf, ") % (", 5); 4682 buf += 5; 4683 buf = __right_->get_demangled_name(buf); 4684 *buf++ = ')'; 4685 } 4686 else 4687 { 4688 strncpy(buf, "operator%", sizeof("operator%") - 1); 4689 buf += sizeof("operator%") - 1; 4690 } 4691 return buf; 4692 } 4693 virtual ptrdiff_t print_first(char* f, char* l) const 4694 { 4695 const ptrdiff_t r = l - f; 4696 if (__left_) 4697 { 4698 const ptrdiff_t n1 = 7; 4699 if (r < n1) 4700 return n1 + __left_->print(l, l) + __right_->print(l, l); 4701 ptrdiff_t sz1 = __left_->print(f+1, l); 4702 if (r < n1 + sz1) 4703 return n1 + sz1 + __right_->print(l, l); 4704 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4705 if (r >= n1 + sz1 + sz2) 4706 { 4707 *f = '('; 4708 f += 1 + sz1; 4709 *f++ = ')'; 4710 *f++ = ' '; 4711 *f++ = '%'; 4712 *f++ = ' '; 4713 *f = '('; 4714 f += 1 + sz2; 4715 *f = ')'; 4716 } 4717 return n1 + sz1 + sz2; 4718 } 4719 const ptrdiff_t n2 = sizeof("operator%") - 1; 4720 if (r >= n2) 4721 { 4722 *f++ = 'o'; 4723 *f++ = 'p'; 4724 *f++ = 'e'; 4725 *f++ = 'r'; 4726 *f++ = 'a'; 4727 *f++ = 't'; 4728 *f++ = 'o'; 4729 *f++ = 'r'; 4730 *f = '%'; 4731 } 4732 return n2; 4733 } 4734 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4735 { 4736 bool r = true; 4737 if (__left_) 4738 r = r && __left_->fix_forward_references(t_begin, t_end); 4739 if (__right_) 4740 r = r && __right_->fix_forward_references(t_begin, t_end); 4741 return r; 4742 } 4743 }; 4744 4745 class __operator_mod_equal 4746 : public __node 4747 { 4748 public: 4749 4750 __operator_mod_equal() {} 4751 __operator_mod_equal(__node* op1, __node* op2) 4752 { 4753 __left_ = op1; 4754 __right_ = op2; 4755 } 4756 virtual size_t first_size() const 4757 { 4758 if (__cached_size_ == -1) 4759 { 4760 if (__left_) 4761 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 4762 else 4763 const_cast<long&>(__cached_size_) = sizeof("operator%=") - 1; 4764 } 4765 return __cached_size_; 4766 } 4767 virtual char* first_demangled_name(char* buf) const 4768 { 4769 if (__left_) 4770 { 4771 *buf++ = '('; 4772 buf = __left_->get_demangled_name(buf); 4773 strncpy(buf, ") %= (", 6); 4774 buf += 6; 4775 buf = __right_->get_demangled_name(buf); 4776 *buf++ = ')'; 4777 } 4778 else 4779 { 4780 strncpy(buf, "operator%=", sizeof("operator%=") - 1); 4781 buf += sizeof("operator%=") - 1; 4782 } 4783 return buf; 4784 } 4785 virtual ptrdiff_t print_first(char* f, char* l) const 4786 { 4787 const ptrdiff_t r = l - f; 4788 if (__left_) 4789 { 4790 const ptrdiff_t n1 = 8; 4791 if (r < n1) 4792 return n1 + __left_->print(l, l) + __right_->print(l, l); 4793 ptrdiff_t sz1 = __left_->print(f+1, l); 4794 if (r < n1 + sz1) 4795 return n1 + sz1 + __right_->print(l, l); 4796 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4797 if (r >= n1 + sz1 + sz2) 4798 { 4799 *f = '('; 4800 f += 1 + sz1; 4801 *f++ = ')'; 4802 *f++ = ' '; 4803 *f++ = '%'; 4804 *f++ = '='; 4805 *f++ = ' '; 4806 *f = '('; 4807 f += 1 + sz2; 4808 *f = ')'; 4809 } 4810 return n1 + sz1 + sz2; 4811 } 4812 const ptrdiff_t n2 = sizeof("operator%=") - 1; 4813 if (r >= n2) 4814 { 4815 *f++ = 'o'; 4816 *f++ = 'p'; 4817 *f++ = 'e'; 4818 *f++ = 'r'; 4819 *f++ = 'a'; 4820 *f++ = 't'; 4821 *f++ = 'o'; 4822 *f++ = 'r'; 4823 *f++ = '%'; 4824 *f = '='; 4825 } 4826 return n2; 4827 } 4828 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4829 { 4830 bool r = true; 4831 if (__left_) 4832 r = r && __left_->fix_forward_references(t_begin, t_end); 4833 if (__right_) 4834 r = r && __right_->fix_forward_references(t_begin, t_end); 4835 return r; 4836 } 4837 }; 4838 4839 class __operator_right_shift 4840 : public __node 4841 { 4842 public: 4843 4844 __operator_right_shift() {} 4845 __operator_right_shift(__node* op1, __node* op2) 4846 { 4847 __left_ = op1; 4848 __right_ = op2; 4849 } 4850 virtual size_t first_size() const 4851 { 4852 if (__cached_size_ == -1) 4853 { 4854 if (__left_) 4855 const_cast<long&>(__cached_size_) = __left_->size() + 8 + __right_->size(); 4856 else 4857 const_cast<long&>(__cached_size_) = sizeof("operator>>") - 1; 4858 } 4859 return __cached_size_; 4860 } 4861 virtual char* first_demangled_name(char* buf) const 4862 { 4863 if (__left_) 4864 { 4865 *buf++ = '('; 4866 buf = __left_->get_demangled_name(buf); 4867 strncpy(buf, ") >> (", 6); 4868 buf += 6; 4869 buf = __right_->get_demangled_name(buf); 4870 *buf++ = ')'; 4871 } 4872 else 4873 { 4874 strncpy(buf, "operator>>", sizeof("operator>>") - 1); 4875 buf += sizeof("operator>>") - 1; 4876 } 4877 return buf; 4878 } 4879 virtual ptrdiff_t print_first(char* f, char* l) const 4880 { 4881 const ptrdiff_t r = l - f; 4882 if (__left_) 4883 { 4884 const ptrdiff_t n1 = 8; 4885 if (r < n1) 4886 return n1 + __left_->print(l, l) + __right_->print(l, l); 4887 ptrdiff_t sz1 = __left_->print(f+1, l); 4888 if (r < n1 + sz1) 4889 return n1 + sz1 + __right_->print(l, l); 4890 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4891 if (r >= n1 + sz1 + sz2) 4892 { 4893 *f = '('; 4894 f += 1 + sz1; 4895 *f++ = ')'; 4896 *f++ = ' '; 4897 *f++ = '>'; 4898 *f++ = '>'; 4899 *f++ = ' '; 4900 *f = '('; 4901 f += 1 + sz2; 4902 *f = ')'; 4903 } 4904 return n1 + sz1 + sz2; 4905 } 4906 const ptrdiff_t n2 = sizeof("operator>>") - 1; 4907 if (r >= n2) 4908 { 4909 *f++ = 'o'; 4910 *f++ = 'p'; 4911 *f++ = 'e'; 4912 *f++ = 'r'; 4913 *f++ = 'a'; 4914 *f++ = 't'; 4915 *f++ = 'o'; 4916 *f++ = 'r'; 4917 *f++ = '>'; 4918 *f = '>'; 4919 } 4920 return n2; 4921 } 4922 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 4923 { 4924 bool r = true; 4925 if (__left_) 4926 r = r && __left_->fix_forward_references(t_begin, t_end); 4927 if (__right_) 4928 r = r && __right_->fix_forward_references(t_begin, t_end); 4929 return r; 4930 } 4931 }; 4932 4933 class __operator_right_shift_equal 4934 : public __node 4935 { 4936 public: 4937 4938 __operator_right_shift_equal() {} 4939 __operator_right_shift_equal(__node* op1, __node* op2) 4940 { 4941 __left_ = op1; 4942 __right_ = op2; 4943 } 4944 virtual size_t first_size() const 4945 { 4946 if (__cached_size_ == -1) 4947 { 4948 if (__left_) 4949 const_cast<long&>(__cached_size_) = __left_->size() + 9 + __right_->size(); 4950 else 4951 const_cast<long&>(__cached_size_) = sizeof("operator>>=") - 1; 4952 } 4953 return __cached_size_; 4954 } 4955 virtual char* first_demangled_name(char* buf) const 4956 { 4957 if (__left_) 4958 { 4959 *buf++ = '('; 4960 buf = __left_->get_demangled_name(buf); 4961 strncpy(buf, ") >>= (", 7); 4962 buf += 7; 4963 buf = __right_->get_demangled_name(buf); 4964 *buf++ = ')'; 4965 } 4966 else 4967 { 4968 strncpy(buf, "operator>>=", sizeof("operator>>=") - 1); 4969 buf += sizeof("operator>>=") - 1; 4970 } 4971 return buf; 4972 } 4973 virtual ptrdiff_t print_first(char* f, char* l) const 4974 { 4975 const ptrdiff_t r = l - f; 4976 if (__left_) 4977 { 4978 const ptrdiff_t n1 = 9; 4979 if (r < n1) 4980 return n1 + __left_->print(l, l) + __right_->print(l, l); 4981 ptrdiff_t sz1 = __left_->print(f+1, l); 4982 if (r < n1 + sz1) 4983 return n1 + sz1 + __right_->print(l, l); 4984 ptrdiff_t sz2 = __right_->print(f+(n1-1)+sz1, l); 4985 if (r >= n1 + sz1 + sz2) 4986 { 4987 *f = '('; 4988 f += 1 + sz1; 4989 *f++ = ')'; 4990 *f++ = ' '; 4991 *f++ = '>'; 4992 *f++ = '>'; 4993 *f++ = '='; 4994 *f++ = ' '; 4995 *f = '('; 4996 f += 1 + sz2; 4997 *f = ')'; 4998 } 4999 return n1 + sz1 + sz2; 5000 } 5001 const ptrdiff_t n2 = sizeof("operator>>=") - 1; 5002 if (r >= n2) 5003 { 5004 *f++ = 'o'; 5005 *f++ = 'p'; 5006 *f++ = 'e'; 5007 *f++ = 'r'; 5008 *f++ = 'a'; 5009 *f++ = 't'; 5010 *f++ = 'o'; 5011 *f++ = 'r'; 5012 *f++ = '>'; 5013 *f++ = '>'; 5014 *f = '='; 5015 } 5016 return n2; 5017 } 5018 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5019 { 5020 bool r = true; 5021 if (__left_) 5022 r = r && __left_->fix_forward_references(t_begin, t_end); 5023 if (__right_) 5024 r = r && __right_->fix_forward_references(t_begin, t_end); 5025 return r; 5026 } 5027 }; 5028 5029 class __operator_sizeof_type 5030 : public __node 5031 { 5032 public: 5033 5034 __operator_sizeof_type() {} 5035 __operator_sizeof_type(__node* op) 5036 { 5037 __right_ = op; 5038 } 5039 virtual size_t first_size() const 5040 { 5041 if (__cached_size_ == -1) 5042 { 5043 if (__right_) 5044 const_cast<long&>(__cached_size_) = __right_->size() + 9; 5045 else 5046 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1; 5047 } 5048 return __cached_size_; 5049 } 5050 virtual char* first_demangled_name(char* buf) const 5051 { 5052 if (__right_) 5053 { 5054 strncpy(buf, "sizeof (", 8); 5055 buf += 8; 5056 buf = __right_->get_demangled_name(buf); 5057 *buf++ = ')'; 5058 } 5059 else 5060 { 5061 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1); 5062 buf += sizeof("operator sizeof") - 1; 5063 } 5064 return buf; 5065 } 5066 virtual ptrdiff_t print_first(char* f, char* l) const 5067 { 5068 const ptrdiff_t r = l - f; 5069 if (__right_) 5070 { 5071 const ptrdiff_t n1 = sizeof("sizeof ()") - 1; 5072 if (r < n1) 5073 return n1 + __right_->print(l, l); 5074 ptrdiff_t sz1 = __right_->print(f+(n1-1), l); 5075 if (r >= n1 + sz1) 5076 { 5077 *f++ = 's'; 5078 *f++ = 'i'; 5079 *f++ = 'z'; 5080 *f++ = 'e'; 5081 *f++ = 'o'; 5082 *f++ = 'f'; 5083 *f++ = ' '; 5084 *f = '('; 5085 f += 1 + sz1; 5086 *f = ')'; 5087 } 5088 return n1 + sz1; 5089 } 5090 const ptrdiff_t n2 = sizeof("operator sizeof") - 1; 5091 if (r >= n2) 5092 { 5093 *f++ = 'o'; 5094 *f++ = 'p'; 5095 *f++ = 'e'; 5096 *f++ = 'r'; 5097 *f++ = 'a'; 5098 *f++ = 't'; 5099 *f++ = 'o'; 5100 *f++ = 'r'; 5101 *f++ = ' '; 5102 *f++ = 's'; 5103 *f++ = 'i'; 5104 *f++ = 'z'; 5105 *f++ = 'e'; 5106 *f++ = 'o'; 5107 *f = 'f'; 5108 } 5109 return n2; 5110 } 5111 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5112 { 5113 if (__right_) 5114 return __right_->fix_forward_references(t_begin, t_end); 5115 return true; 5116 } 5117 }; 5118 5119 class __operator_sizeof_expression 5120 : public __node 5121 { 5122 public: 5123 5124 __operator_sizeof_expression() {} 5125 __operator_sizeof_expression(__node* op) 5126 { 5127 __right_ = op; 5128 } 5129 virtual size_t first_size() const 5130 { 5131 if (__cached_size_ == -1) 5132 { 5133 if (__right_) 5134 const_cast<long&>(__cached_size_) = __right_->size() + 9; 5135 else 5136 const_cast<long&>(__cached_size_) = sizeof("operator sizeof") - 1; 5137 } 5138 return __cached_size_; 5139 } 5140 virtual char* first_demangled_name(char* buf) const 5141 { 5142 if (__right_) 5143 { 5144 strncpy(buf, "sizeof (", 8); 5145 buf += 8; 5146 buf = __right_->get_demangled_name(buf); 5147 *buf++ = ')'; 5148 } 5149 else 5150 { 5151 strncpy(buf, "operator sizeof", sizeof("operator sizeof") - 1); 5152 buf += sizeof("operator sizeof") - 1; 5153 } 5154 return buf; 5155 } 5156 virtual ptrdiff_t print_first(char* f, char* l) const 5157 { 5158 const ptrdiff_t r = l - f; 5159 if (__right_) 5160 { 5161 const ptrdiff_t n1 = sizeof("sizeof ()") - 1; 5162 if (r < n1) 5163 return n1 + __right_->print(l, l); 5164 ptrdiff_t sz1 = __right_->print(f+(n1-1), l); 5165 if (r >= n1 + sz1) 5166 { 5167 *f++ = 's'; 5168 *f++ = 'i'; 5169 *f++ = 'z'; 5170 *f++ = 'e'; 5171 *f++ = 'o'; 5172 *f++ = 'f'; 5173 *f++ = ' '; 5174 *f = '('; 5175 f += 1 + sz1; 5176 *f = ')'; 5177 } 5178 return n1 + sz1; 5179 } 5180 const ptrdiff_t n2 = sizeof("operator sizeof") - 1; 5181 if (r >= n2) 5182 { 5183 *f++ = 'o'; 5184 *f++ = 'p'; 5185 *f++ = 'e'; 5186 *f++ = 'r'; 5187 *f++ = 'a'; 5188 *f++ = 't'; 5189 *f++ = 'o'; 5190 *f++ = 'r'; 5191 *f++ = ' '; 5192 *f++ = 's'; 5193 *f++ = 'i'; 5194 *f++ = 'z'; 5195 *f++ = 'e'; 5196 *f++ = 'o'; 5197 *f = 'f'; 5198 } 5199 return n2; 5200 } 5201 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5202 { 5203 if (__right_) 5204 return __right_->fix_forward_references(t_begin, t_end); 5205 return true; 5206 } 5207 }; 5208 5209 class __typeid 5210 : public __node 5211 { 5212 public: 5213 5214 __typeid(__node* op) 5215 { 5216 __right_ = op; 5217 } 5218 virtual size_t first_size() const 5219 { 5220 if (__cached_size_ == -1) 5221 const_cast<long&>(__cached_size_) = __right_->size() + 8; 5222 return __cached_size_; 5223 } 5224 virtual char* first_demangled_name(char* buf) const 5225 { 5226 strncpy(buf, "typeid(", 7); 5227 buf += 7; 5228 buf = __right_->get_demangled_name(buf); 5229 *buf++ = ')'; 5230 return buf; 5231 } 5232 virtual ptrdiff_t print_first(char* f, char* l) const 5233 { 5234 const ptrdiff_t r = l - f; 5235 const ptrdiff_t n1 = sizeof("typeid()") - 1; 5236 if (r < n1) 5237 return n1 + __right_->print(l, l); 5238 ptrdiff_t sz1 = __right_->print(f+(n1-1), l); 5239 if (r >= n1 + sz1) 5240 { 5241 *f++ = 't'; 5242 *f++ = 'y'; 5243 *f++ = 'p'; 5244 *f++ = 'e'; 5245 *f++ = 'i'; 5246 *f++ = 'd'; 5247 *f = '('; 5248 f += 1 + sz1; 5249 *f = ')'; 5250 } 5251 return n1 + sz1; 5252 } 5253 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5254 { 5255 return __right_->fix_forward_references(t_begin, t_end); 5256 } 5257 }; 5258 5259 class __throw 5260 : public __node 5261 { 5262 public: 5263 5264 __throw(__node* op) 5265 { 5266 __right_ = op; 5267 } 5268 virtual size_t first_size() const 5269 { 5270 if (__cached_size_ == -1) 5271 const_cast<long&>(__cached_size_) = __right_->size() + 6; 5272 return __cached_size_; 5273 } 5274 virtual char* first_demangled_name(char* buf) const 5275 { 5276 strncpy(buf, "throw ", 6); 5277 return __right_->get_demangled_name(buf+6); 5278 } 5279 virtual ptrdiff_t print_first(char* f, char* l) const 5280 { 5281 const ptrdiff_t r = l - f; 5282 const ptrdiff_t n1 = sizeof("throw ") - 1; 5283 if (r < n1) 5284 return n1 + __right_->print(l, l); 5285 ptrdiff_t sz1 = __right_->print(f+n1, l); 5286 if (r >= n1 + sz1) 5287 { 5288 *f++ = 't'; 5289 *f++ = 'h'; 5290 *f++ = 'r'; 5291 *f++ = 'o'; 5292 *f++ = 'w'; 5293 *f = ' '; 5294 } 5295 return n1 + sz1; 5296 } 5297 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5298 { 5299 return __right_->fix_forward_references(t_begin, t_end); 5300 } 5301 }; 5302 5303 class __rethrow 5304 : public __node 5305 { 5306 static const ptrdiff_t n = sizeof("throw") - 1; 5307 public: 5308 5309 virtual size_t first_size() const {return n;} 5310 virtual char* first_demangled_name(char* buf) const 5311 { 5312 strncpy(buf, "throw", n); 5313 return buf+n; 5314 } 5315 virtual ptrdiff_t print_first(char* f, char* l) const 5316 { 5317 const ptrdiff_t r = l - f; 5318 if (r >= n) 5319 { 5320 *f++ = 't'; 5321 *f++ = 'h'; 5322 *f++ = 'r'; 5323 *f++ = 'o'; 5324 *f = 'w'; 5325 } 5326 return n; 5327 } 5328 }; 5329 5330 class __operator_sizeof_param_pack 5331 : public __node 5332 { 5333 public: 5334 5335 __operator_sizeof_param_pack(__node* op) 5336 { 5337 __right_ = op; 5338 } 5339 virtual size_t first_size() const 5340 { 5341 if (__cached_size_ == -1) 5342 const_cast<long&>(__cached_size_) = __right_->size() + 11; 5343 return __cached_size_; 5344 } 5345 virtual char* first_demangled_name(char* buf) const 5346 { 5347 strncpy(buf, "sizeof...(", 10); 5348 buf += 10; 5349 buf = __right_->get_demangled_name(buf); 5350 *buf++ = ')'; 5351 return buf; 5352 } 5353 virtual ptrdiff_t print_first(char* f, char* l) const 5354 { 5355 const ptrdiff_t r = l - f; 5356 const ptrdiff_t n1 = sizeof("sizeof...()") - 1; 5357 if (r < n1) 5358 return n1 + __right_->print(l, l); 5359 ptrdiff_t sz1 = __right_->print(f+(n1-1), l); 5360 if (r >= n1 + sz1) 5361 { 5362 *f++ = 's'; 5363 *f++ = 'i'; 5364 *f++ = 'z'; 5365 *f++ = 'e'; 5366 *f++ = 'o'; 5367 *f++ = 'f'; 5368 *f++ = '.'; 5369 *f++ = '.'; 5370 *f++ = '.'; 5371 *f = '('; 5372 f += 1+sz1; 5373 *f = ')'; 5374 } 5375 return n1 + sz1; 5376 } 5377 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5378 { 5379 return __right_->fix_forward_references(t_begin, t_end); 5380 } 5381 }; 5382 5383 class __const_cast 5384 : public __node 5385 { 5386 public: 5387 5388 __const_cast(__node* op1, __node* op2) 5389 { 5390 __left_ = op1; 5391 __right_ = op2; 5392 } 5393 virtual size_t first_size() const 5394 { 5395 if (__cached_size_ == -1) 5396 const_cast<long&>(__cached_size_) = __left_->size() + 14 + __right_->size(); 5397 return __cached_size_; 5398 } 5399 virtual char* first_demangled_name(char* buf) const 5400 { 5401 strncpy(buf, "const_cast<", 11); 5402 buf += 11; 5403 buf = __left_->get_demangled_name(buf); 5404 *buf++ = '>'; 5405 *buf++ = '('; 5406 buf = __right_->get_demangled_name(buf); 5407 *buf++ = ')'; 5408 return buf; 5409 } 5410 virtual ptrdiff_t print_first(char* f, char* l) const 5411 { 5412 const ptrdiff_t r = l - f; 5413 const ptrdiff_t n1 = sizeof("const_cast<>()") - 1; 5414 if (r < n1) 5415 return n1 + __left_->print(l, l) + __right_->print(l, l); 5416 ptrdiff_t sz1 = __left_->print(f+(n1-3), l); 5417 if (r < n1 + sz1) 5418 return n1 + sz1 + __right_->print(l, l); 5419 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); 5420 if (r >= n1 + sz1 + sz2) 5421 { 5422 *f++ = 'c'; 5423 *f++ = 'o'; 5424 *f++ = 'n'; 5425 *f++ = 's'; 5426 *f++ = 't'; 5427 *f++ = '_'; 5428 *f++ = 'c'; 5429 *f++ = 'a'; 5430 *f++ = 's'; 5431 *f++ = 't'; 5432 *f = '<'; 5433 f += 1+sz1; 5434 *f++ = '>'; 5435 *f = '('; 5436 f += 1+sz2; 5437 *f = ')'; 5438 } 5439 return n1 + sz1 + sz2; 5440 } 5441 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5442 { 5443 return __left_->fix_forward_references(t_begin, t_end) && 5444 __right_->fix_forward_references(t_begin, t_end); 5445 } 5446 }; 5447 5448 class __dynamic_cast 5449 : public __node 5450 { 5451 public: 5452 5453 __dynamic_cast(__node* op1, __node* op2) 5454 { 5455 __left_ = op1; 5456 __right_ = op2; 5457 } 5458 virtual size_t first_size() const 5459 { 5460 if (__cached_size_ == -1) 5461 const_cast<long&>(__cached_size_) = __left_->size() + 16 + __right_->size(); 5462 return __cached_size_; 5463 } 5464 virtual char* first_demangled_name(char* buf) const 5465 { 5466 strncpy(buf, "dynamic_cast<", 13); 5467 buf += 13; 5468 buf = __left_->get_demangled_name(buf); 5469 *buf++ = '>'; 5470 *buf++ = '('; 5471 buf = __right_->get_demangled_name(buf); 5472 *buf++ = ')'; 5473 return buf; 5474 } 5475 virtual ptrdiff_t print_first(char* f, char* l) const 5476 { 5477 const ptrdiff_t r = l - f; 5478 const ptrdiff_t n1 = sizeof("dynamic_cast<>()") - 1; 5479 if (r < n1) 5480 return n1 + __left_->print(l, l) + __right_->print(l, l); 5481 ptrdiff_t sz1 = __left_->print(f+(n1-3), l); 5482 if (r < n1 + sz1) 5483 return n1 + sz1 + __right_->print(l, l); 5484 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); 5485 if (r >= n1 + sz1 + sz2) 5486 { 5487 *f++ = 'd'; 5488 *f++ = 'y'; 5489 *f++ = 'n'; 5490 *f++ = 'a'; 5491 *f++ = 'm'; 5492 *f++ = 'i'; 5493 *f++ = 'c'; 5494 *f++ = '_'; 5495 *f++ = 'c'; 5496 *f++ = 'a'; 5497 *f++ = 's'; 5498 *f++ = 't'; 5499 *f = '<'; 5500 f += 1+sz1; 5501 *f++ = '>'; 5502 *f = '('; 5503 f += 1+sz2; 5504 *f = ')'; 5505 } 5506 return n1 + sz1 + sz2; 5507 } 5508 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5509 { 5510 return __left_->fix_forward_references(t_begin, t_end) && 5511 __right_->fix_forward_references(t_begin, t_end); 5512 } 5513 }; 5514 5515 class __reinterpret_cast 5516 : public __node 5517 { 5518 public: 5519 5520 __reinterpret_cast(__node* op1, __node* op2) 5521 { 5522 __left_ = op1; 5523 __right_ = op2; 5524 } 5525 virtual size_t first_size() const 5526 { 5527 if (__cached_size_ == -1) 5528 const_cast<long&>(__cached_size_) = __left_->size() + 20 + __right_->size(); 5529 return __cached_size_; 5530 } 5531 virtual char* first_demangled_name(char* buf) const 5532 { 5533 strncpy(buf, "reinterpret_cast<", 17); 5534 buf += 17; 5535 buf = __left_->get_demangled_name(buf); 5536 *buf++ = '>'; 5537 *buf++ = '('; 5538 buf = __right_->get_demangled_name(buf); 5539 *buf++ = ')'; 5540 return buf; 5541 } 5542 virtual ptrdiff_t print_first(char* f, char* l) const 5543 { 5544 const ptrdiff_t r = l - f; 5545 const ptrdiff_t n1 = sizeof("reinterpret_cast<>()") - 1; 5546 if (r < n1) 5547 return n1 + __left_->print(l, l) + __right_->print(l, l); 5548 ptrdiff_t sz1 = __left_->print(f+(n1-3), l); 5549 if (r < n1 + sz1) 5550 return n1 + sz1 + __right_->print(l, l); 5551 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); 5552 if (r >= n1 + sz1 + sz2) 5553 { 5554 *f++ = 'r'; 5555 *f++ = 'e'; 5556 *f++ = 'i'; 5557 *f++ = 'n'; 5558 *f++ = 't'; 5559 *f++ = 'e'; 5560 *f++ = 'r'; 5561 *f++ = 'p'; 5562 *f++ = 'r'; 5563 *f++ = 'e'; 5564 *f++ = 't'; 5565 *f++ = '_'; 5566 *f++ = 'c'; 5567 *f++ = 'a'; 5568 *f++ = 's'; 5569 *f++ = 't'; 5570 *f = '<'; 5571 f += 1+sz1; 5572 *f++ = '>'; 5573 *f = '('; 5574 f += 1+sz2; 5575 *f = ')'; 5576 } 5577 return n1 + sz1 + sz2; 5578 } 5579 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5580 { 5581 return __left_->fix_forward_references(t_begin, t_end) && 5582 __right_->fix_forward_references(t_begin, t_end); 5583 } 5584 }; 5585 5586 class __static_cast 5587 : public __node 5588 { 5589 public: 5590 5591 __static_cast(__node* op1, __node* op2) 5592 { 5593 __left_ = op1; 5594 __right_ = op2; 5595 } 5596 virtual size_t first_size() const 5597 { 5598 if (__cached_size_ == -1) 5599 const_cast<long&>(__cached_size_) = __left_->size() + 15 + __right_->size(); 5600 return __cached_size_; 5601 } 5602 virtual char* first_demangled_name(char* buf) const 5603 { 5604 strncpy(buf, "static_cast<", 12); 5605 buf += 12; 5606 buf = __left_->get_demangled_name(buf); 5607 *buf++ = '>'; 5608 *buf++ = '('; 5609 buf = __right_->get_demangled_name(buf); 5610 *buf++ = ')'; 5611 return buf; 5612 } 5613 virtual ptrdiff_t print_first(char* f, char* l) const 5614 { 5615 const ptrdiff_t r = l - f; 5616 const ptrdiff_t n1 = sizeof("static_cast<>()") - 1; 5617 if (r < n1) 5618 return n1 + __left_->print(l, l) + __right_->print(l, l); 5619 ptrdiff_t sz1 = __left_->print(f+(n1-3), l); 5620 if (r < n1 + sz1) 5621 return n1 + sz1 + __right_->print(l, l); 5622 ptrdiff_t sz2 = __right_->print(f+sz1+(n1-1), l); 5623 if (r >= n1 + sz1 + sz2) 5624 { 5625 *f++ = 's'; 5626 *f++ = 't'; 5627 *f++ = 'a'; 5628 *f++ = 't'; 5629 *f++ = 'i'; 5630 *f++ = 'c'; 5631 *f++ = '_'; 5632 *f++ = 'c'; 5633 *f++ = 'a'; 5634 *f++ = 's'; 5635 *f++ = 't'; 5636 *f = '<'; 5637 f += 1+sz1; 5638 *f++ = '>'; 5639 *f = '('; 5640 f += 1+sz2; 5641 *f = ')'; 5642 } 5643 return n1 + sz1 + sz2; 5644 } 5645 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5646 { 5647 return __left_->fix_forward_references(t_begin, t_end) && 5648 __right_->fix_forward_references(t_begin, t_end); 5649 } 5650 }; 5651 5652 class __call_expr 5653 : public __node 5654 { 5655 public: 5656 5657 __call_expr(__node* op1, __node* op2) 5658 { 5659 __left_ = op1; 5660 __right_ = op2; 5661 } 5662 virtual size_t first_size() const 5663 { 5664 if (__cached_size_ == -1) 5665 { 5666 size_t off = __left_->size() + 2; 5667 if (__right_) 5668 off += __right_->size(); 5669 const_cast<long&>(__cached_size_) = off; 5670 } 5671 return __cached_size_; 5672 } 5673 virtual char* first_demangled_name(char* buf) const 5674 { 5675 buf = __left_->get_demangled_name(buf); 5676 *buf++ = '('; 5677 if (__right_) 5678 buf = __right_->get_demangled_name(buf); 5679 *buf++ = ')'; 5680 return buf; 5681 } 5682 virtual ptrdiff_t print_first(char* f, char* l) const 5683 { 5684 const ptrdiff_t r = l - f; 5685 const ptrdiff_t n1 = sizeof("()") - 1; 5686 if (r < n1) 5687 return n1 + __left_->print(l, l) + (__right_ ? __right_->print(l, l) : 0); 5688 ptrdiff_t sz1 = __left_->print(f, l); 5689 if (r < n1 + sz1) 5690 return n1 + sz1 + (__right_ ? __right_->print(l, l) : 0); 5691 ptrdiff_t sz2 = __right_ ? __right_->print(f+sz1+1, l) : 0; 5692 if (r >= n1 + sz1 + sz2) 5693 { 5694 f += sz1; 5695 *f = '('; 5696 f += 1+sz2; 5697 *f = ')'; 5698 } 5699 return n1 + sz1 + sz2; 5700 } 5701 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5702 { 5703 bool r = __left_->fix_forward_references(t_begin, t_end); 5704 if (__right_) 5705 r = r && __right_->fix_forward_references(t_begin, t_end); 5706 return r; 5707 } 5708 }; 5709 5710 class __delete_array_expr 5711 : public __node 5712 { 5713 public: 5714 5715 __delete_array_expr(bool global, __node* op) 5716 { 5717 __size_ = global; 5718 __right_ = op; 5719 } 5720 virtual size_t first_size() const 5721 { 5722 if (__cached_size_ == -1) 5723 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 9 + __right_->size(); 5724 return __cached_size_; 5725 } 5726 virtual char* first_demangled_name(char* buf) const 5727 { 5728 if (__size_) 5729 { 5730 *buf++ = ':'; 5731 *buf++ = ':'; 5732 } 5733 strncpy(buf, "delete[] ", 9); 5734 return __right_->get_demangled_name(buf+9); 5735 } 5736 virtual ptrdiff_t print_first(char* f, char* l) const 5737 { 5738 const ptrdiff_t r = l - f; 5739 const ptrdiff_t n1 = sizeof("delete[] ") - 1 + (__size_ ? 2 : 0); 5740 if (r < n1) 5741 return n1 + __right_->print(l, l); 5742 ptrdiff_t sz1 = __right_->print(f+n1, l); 5743 if (r >= n1 + sz1) 5744 { 5745 if (__size_) 5746 { 5747 *f++ = ':'; 5748 *f++ = ':'; 5749 } 5750 *f++ = 'd'; 5751 *f++ = 'e'; 5752 *f++ = 'l'; 5753 *f++ = 'e'; 5754 *f++ = 't'; 5755 *f++ = 'e'; 5756 *f++ = '['; 5757 *f++ = ']'; 5758 *f = ' '; 5759 } 5760 return n1 + sz1; 5761 } 5762 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5763 { 5764 return __right_->fix_forward_references(t_begin, t_end); 5765 } 5766 }; 5767 5768 class __delete_expr 5769 : public __node 5770 { 5771 public: 5772 5773 __delete_expr(bool global, __node* op) 5774 { 5775 __size_ = global; 5776 __right_ = op; 5777 } 5778 virtual size_t first_size() const 5779 { 5780 if (__cached_size_ == -1) 5781 const_cast<long&>(__cached_size_) = (__size_ ? 2 : 0) + 7 + __right_->size(); 5782 return __cached_size_; 5783 } 5784 virtual char* first_demangled_name(char* buf) const 5785 { 5786 if (__size_) 5787 { 5788 *buf++ = ':'; 5789 *buf++ = ':'; 5790 } 5791 strncpy(buf, "delete ", 7); 5792 return __right_->get_demangled_name(buf+7); 5793 } 5794 virtual ptrdiff_t print_first(char* f, char* l) const 5795 { 5796 const ptrdiff_t r = l - f; 5797 const ptrdiff_t n1 = sizeof("delete ") - 1 + (__size_ ? 2 : 0); 5798 if (r < n1) 5799 return n1 + __right_->print(l, l); 5800 ptrdiff_t sz1 = __right_->print(f+n1, l); 5801 if (r >= n1 + sz1) 5802 { 5803 if (__size_) 5804 { 5805 *f++ = ':'; 5806 *f++ = ':'; 5807 } 5808 *f++ = 'd'; 5809 *f++ = 'e'; 5810 *f++ = 'l'; 5811 *f++ = 'e'; 5812 *f++ = 't'; 5813 *f++ = 'e'; 5814 *f = ' '; 5815 } 5816 return n1 + sz1; 5817 } 5818 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5819 { 5820 return __right_->fix_forward_references(t_begin, t_end); 5821 } 5822 }; 5823 5824 class __new_expr 5825 : public __node 5826 { 5827 public: 5828 5829 __new_expr(bool global, bool is_array, bool has_init, 5830 __node* expr, __node* type, __node* init) 5831 { 5832 __size_ = (unsigned)global | 5833 ((unsigned)is_array << 1) | 5834 ((unsigned)has_init << 2); 5835 __left_ = expr; 5836 __name_ = (const char*)type; 5837 __right_ = init; 5838 } 5839 virtual size_t first_size() const 5840 { 5841 if (__cached_size_ == -1) 5842 { 5843 size_t off = 4; 5844 if (__size_ & 1) 5845 off += 2; 5846 if (__size_ & 2) 5847 off += 2; 5848 if (__left_) 5849 { 5850 off += 2; 5851 off += __left_->size(); 5852 } 5853 __node* type = (__node*)__name_; 5854 off += type->size(); 5855 if (__size_ & 4) 5856 { 5857 off += 2; 5858 if (__right_) 5859 off += __right_->size(); 5860 } 5861 const_cast<long&>(__cached_size_) = off; 5862 } 5863 return __cached_size_; 5864 } 5865 virtual char* first_demangled_name(char* buf) const 5866 { 5867 if (__size_ & 1) 5868 { 5869 *buf++ = ':'; 5870 *buf++ = ':'; 5871 } 5872 *buf++ = 'n'; 5873 *buf++ = 'e'; 5874 *buf++ = 'w'; 5875 if (__size_ & 2) 5876 { 5877 *buf++ = '['; 5878 *buf++ = ']'; 5879 } 5880 if (__left_) 5881 { 5882 *buf++ = '('; 5883 buf = __left_->get_demangled_name(buf); 5884 *buf++ = ')'; 5885 } 5886 *buf++ = ' '; 5887 __node* type = (__node*)__name_; 5888 buf = type->get_demangled_name(buf); 5889 if (__size_ & 4) 5890 { 5891 *buf++ = '('; 5892 if (__right_) 5893 buf = __right_->get_demangled_name(buf); 5894 *buf++ = ')'; 5895 } 5896 return buf; 5897 } 5898 virtual ptrdiff_t print_first(char* f, char* l) const 5899 { 5900 const ptrdiff_t r = l - f; 5901 const ptrdiff_t n1 = sizeof("new ") - 1 + (__size_ & 1 ? 2 : 0) + 5902 (__size_ & 2 ? 2 : 0) + (__left_ ? 2 : 0) + (__size_ & 4 ? 2 : 0); 5903 __node* type = (__node*)__name_; 5904 if (r < n1) 5905 return n1 + (__left_ ? __left_->print(l, l) : 0) + 5906 type->print(l, l) + 5907 (__right_ ? __right_->print(l, l) : 0); 5908 ptrdiff_t sz1 = __left_ ? __left_->print(f+4+ 5909 (__size_ & 1 ? 2 : 0) + 5910 (__size_ & 2 ? 2 : 0), l) : 0; 5911 if (r < n1 + sz1) 5912 return n1 + sz1 + type->print(l, l) + 5913 (__right_ ? __right_->print(l, l) : 0); 5914 ptrdiff_t sz2 = type->print(f+(n1-(__size_ & 4 ? 2 : 0)+sz1), l); 5915 if (r < n1 + sz1 + sz2) 5916 return n1 + sz1 + sz2 + (__right_ ? __right_->print(l, l) : 0); 5917 ptrdiff_t sz3 = __right_ ? __right_->print(f+(n1-1)+sz1+sz2, l) : 0; 5918 if (r >= n1 + sz1 + sz2 + sz3) 5919 { 5920 if (__size_ & 1) 5921 { 5922 *f++ = ':'; 5923 *f++ = ':'; 5924 } 5925 *f++ = 'n'; 5926 *f++ = 'e'; 5927 *f++ = 'w'; 5928 if (__size_ & 2) 5929 { 5930 *f++ = '['; 5931 *f++ = ']'; 5932 } 5933 if (__left_) 5934 { 5935 *f = '('; 5936 f += 1 + sz1; 5937 *f++ = ')'; 5938 } 5939 *f = ' '; 5940 if (__size_ & 4) 5941 { 5942 f += 1 + sz2; 5943 *f = '('; 5944 f += 1 + sz3; 5945 *f = ')'; 5946 } 5947 } 5948 return n1 + sz1 + sz2 + sz3; 5949 } 5950 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 5951 { 5952 __node* type = (__node*)__name_; 5953 bool r = type->fix_forward_references(t_begin, t_end); 5954 if (__left_) 5955 r = r && __left_->fix_forward_references(t_begin, t_end);; 5956 if (__right_) 5957 r = r && __right_->fix_forward_references(t_begin, t_end);; 5958 return r; 5959 } 5960 }; 5961 5962 class __dot_star_expr 5963 : public __node 5964 { 5965 public: 5966 5967 __dot_star_expr(__node* op1, __node* op2) 5968 { 5969 __left_ = op1; 5970 __right_ = op2; 5971 } 5972 virtual size_t first_size() const 5973 { 5974 if (__cached_size_ == -1) 5975 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size(); 5976 return __cached_size_; 5977 } 5978 virtual char* first_demangled_name(char* buf) const 5979 { 5980 buf = __left_->get_demangled_name(buf); 5981 *buf++ = '.'; 5982 *buf++ = '*'; 5983 return __right_->get_demangled_name(buf); 5984 } 5985 virtual ptrdiff_t print_first(char* f, char* l) const 5986 { 5987 const ptrdiff_t r = l - f; 5988 const ptrdiff_t n = sizeof(".*") - 1; 5989 if (r < n) 5990 return n + __left_->print(l, l) + __right_->print(l, l); 5991 ptrdiff_t sz1 = __left_->print(f, l); 5992 if (r < n + sz1) 5993 return n + sz1 + __right_->print(l, l); 5994 ptrdiff_t sz2 = __right_->print(f+sz1+n, l); 5995 if (r >= n + sz1 + sz2) 5996 { 5997 f += sz1; 5998 *f++ = '.'; 5999 *f = '*'; 6000 } 6001 return n + sz1 + sz2; 6002 } 6003 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6004 { 6005 return __left_->fix_forward_references(t_begin, t_end) && 6006 __right_->fix_forward_references(t_begin, t_end); 6007 } 6008 }; 6009 6010 class __dot_expr 6011 : public __node 6012 { 6013 public: 6014 6015 __dot_expr(__node* op1, __node* op2) 6016 { 6017 __left_ = op1; 6018 __right_ = op2; 6019 } 6020 virtual size_t first_size() const 6021 { 6022 if (__cached_size_ == -1) 6023 const_cast<long&>(__cached_size_) = __left_->size() + 1 + __right_->size(); 6024 return __cached_size_; 6025 } 6026 virtual char* first_demangled_name(char* buf) const 6027 { 6028 buf = __left_->get_demangled_name(buf); 6029 *buf++ = '.'; 6030 return __right_->get_demangled_name(buf); 6031 } 6032 virtual ptrdiff_t print_first(char* f, char* l) const 6033 { 6034 const ptrdiff_t r = l - f; 6035 const ptrdiff_t n = sizeof(".") - 1; 6036 if (r < n) 6037 return n + __left_->print(l, l) + __right_->print(l, l); 6038 ptrdiff_t sz1 = __left_->print(f, l); 6039 if (r < n + sz1) 6040 return n + sz1 + __right_->print(l, l); 6041 ptrdiff_t sz2 = __right_->print(f+sz1+n, l); 6042 if (r >= n + sz1 + sz2) 6043 f[sz1] = '.'; 6044 return n + sz1 + sz2; 6045 } 6046 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6047 { 6048 return __left_->fix_forward_references(t_begin, t_end) && 6049 __right_->fix_forward_references(t_begin, t_end); 6050 } 6051 }; 6052 6053 class __arrow_expr 6054 : public __node 6055 { 6056 public: 6057 6058 __arrow_expr(__node* op1, __node* op2) 6059 { 6060 __left_ = op1; 6061 __right_ = op2; 6062 } 6063 virtual size_t first_size() const 6064 { 6065 if (__cached_size_ == -1) 6066 const_cast<long&>(__cached_size_) = __left_->size() + 2 + __right_->size(); 6067 return __cached_size_; 6068 } 6069 virtual char* first_demangled_name(char* buf) const 6070 { 6071 buf = __left_->get_demangled_name(buf); 6072 *buf++ = '-'; 6073 *buf++ = '>'; 6074 return __right_->get_demangled_name(buf); 6075 } 6076 virtual ptrdiff_t print_first(char* f, char* l) const 6077 { 6078 const ptrdiff_t r = l - f; 6079 const ptrdiff_t n = sizeof("->") - 1; 6080 if (r < n) 6081 return n + __left_->print(l, l) + __right_->print(l, l); 6082 ptrdiff_t sz1 = __left_->print(f, l); 6083 if (r < n + sz1) 6084 return n + sz1 + __right_->print(l, l); 6085 ptrdiff_t sz2 = __right_->print(f+sz1+n, l); 6086 if (r >= n + sz1 + sz2) 6087 { 6088 f += sz1; 6089 *f++ = '-'; 6090 *f = '>'; 6091 } 6092 return n + sz1 + sz2; 6093 } 6094 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6095 { 6096 return __left_->fix_forward_references(t_begin, t_end) && 6097 __right_->fix_forward_references(t_begin, t_end); 6098 } 6099 }; 6100 6101 class __std_qualified_name 6102 : public __node 6103 { 6104 static const ptrdiff_t n = sizeof("std") - 1; 6105 public: 6106 6107 __std_qualified_name() 6108 { 6109 } 6110 virtual size_t first_size() const 6111 { 6112 return n; 6113 } 6114 6115 virtual char* first_demangled_name(char* buf) const 6116 { 6117 *buf++ = 's'; 6118 *buf++ = 't'; 6119 *buf++ = 'd'; 6120 return buf; 6121 } 6122 virtual ptrdiff_t print_first(char* f, char* l) const 6123 { 6124 const ptrdiff_t r = l - f; 6125 if (r >= n) 6126 { 6127 *f++ = 's'; 6128 *f++ = 't'; 6129 *f = 'd'; 6130 } 6131 return n; 6132 } 6133 }; 6134 6135 class __sub_allocator 6136 : public __node 6137 { 6138 static const ptrdiff_t n = sizeof("std::allocator") - 1; 6139 public: 6140 6141 virtual size_t first_size() const 6142 { 6143 return n; 6144 } 6145 virtual char* first_demangled_name(char* buf) const 6146 { 6147 strncpy(buf, "std::allocator", n); 6148 return buf + n; 6149 } 6150 virtual ptrdiff_t print_first(char* f, char* l) const 6151 { 6152 const ptrdiff_t r = l - f; 6153 if (r >= n) 6154 { 6155 *f++ = 's'; 6156 *f++ = 't'; 6157 *f++ = 'd'; 6158 *f++ = ':'; 6159 *f++ = ':'; 6160 *f++ = 'a'; 6161 *f++ = 'l'; 6162 *f++ = 'l'; 6163 *f++ = 'o'; 6164 *f++ = 'c'; 6165 *f++ = 'a'; 6166 *f++ = 't'; 6167 *f++ = 'o'; 6168 *f = 'r'; 6169 } 6170 return n; 6171 } 6172 }; 6173 6174 class __sub_basic_string 6175 : public __node 6176 { 6177 static const ptrdiff_t n = sizeof("std::basic_string") - 1; 6178 public: 6179 6180 virtual size_t first_size() const 6181 { 6182 return n; 6183 } 6184 virtual char* first_demangled_name(char* buf) const 6185 { 6186 strncpy(buf, "std::basic_string", n); 6187 return buf + n; 6188 } 6189 virtual ptrdiff_t print_first(char* f, char* l) const 6190 { 6191 const ptrdiff_t r = l - f; 6192 if (r >= n) 6193 { 6194 *f++ = 's'; 6195 *f++ = 't'; 6196 *f++ = 'd'; 6197 *f++ = ':'; 6198 *f++ = ':'; 6199 *f++ = 'b'; 6200 *f++ = 'a'; 6201 *f++ = 's'; 6202 *f++ = 'i'; 6203 *f++ = 'c'; 6204 *f++ = '_'; 6205 *f++ = 's'; 6206 *f++ = 't'; 6207 *f++ = 'r'; 6208 *f++ = 'i'; 6209 *f++ = 'n'; 6210 *f = 'g'; 6211 } 6212 return n; 6213 } 6214 }; 6215 6216 class __sub_string 6217 : public __node 6218 { 6219 static const size_t n = sizeof("std::string") - 1; 6220 static const size_t ne = sizeof("std::basic_string<char, std::char_traits<char>, std::allocator<char> >") - 1; 6221 public: 6222 6223 virtual size_t first_size() const 6224 { 6225 if (__size_) 6226 return ne; 6227 return n; 6228 } 6229 virtual char* first_demangled_name(char* buf) const 6230 { 6231 if (__size_) 6232 { 6233 strncpy(buf, "std::basic_string<char, std::char_traits<char>, std::allocator<char> >", ne); 6234 buf += ne; 6235 } 6236 else 6237 { 6238 strncpy(buf, "std::string", n); 6239 buf += n; 6240 } 6241 return buf; 6242 } 6243 6244 virtual ptrdiff_t print_first(char* f, char* l) const 6245 { 6246 const ptrdiff_t r = l - f; 6247 if (__size_) 6248 { 6249 const ptrdiff_t n1 = 6250 sizeof("std::basic_string<char, std::char_traits<char>," 6251 " std::allocator<char> >") - 1; 6252 if (r >= n1) 6253 strncpy(f, "std::basic_string<char, std::char_traits<char>," 6254 " std::allocator<char> >", n1); 6255 return n1; 6256 } 6257 const ptrdiff_t n2 = sizeof("std::string") - 1; 6258 if (r >= n2) 6259 { 6260 *f++ = 's'; 6261 *f++ = 't'; 6262 *f++ = 'd'; 6263 *f++ = ':'; 6264 *f++ = ':'; 6265 *f++ = 's'; 6266 *f++ = 't'; 6267 *f++ = 'r'; 6268 *f++ = 'i'; 6269 *f++ = 'n'; 6270 *f = 'g'; 6271 } 6272 return n2; 6273 } 6274 virtual size_t base_size() const 6275 { 6276 return 12; 6277 } 6278 virtual char* get_base_name(char* buf) const 6279 { 6280 strncpy(buf, "basic_string", 12); 6281 return buf + 12; 6282 } 6283 virtual ptrdiff_t print_base_name(char* f, char* l) const 6284 { 6285 const ptrdiff_t r = l - f; 6286 const ptrdiff_t n = sizeof("basic_string") - 1; 6287 if (r >= n) 6288 { 6289 *f++ = 'b'; 6290 *f++ = 'a'; 6291 *f++ = 's'; 6292 *f++ = 'i'; 6293 *f++ = 'c'; 6294 *f++ = '_'; 6295 *f++ = 's'; 6296 *f++ = 't'; 6297 *f++ = 'r'; 6298 *f++ = 'i'; 6299 *f++ = 'n'; 6300 *f = 'g'; 6301 } 6302 return n; 6303 } 6304 6305 virtual __node* base_name() const 6306 { 6307 const_cast<size_t&>(__size_) = true; 6308 return const_cast<__node*>(static_cast<const __node*>(this)); 6309 } 6310 }; 6311 6312 class __sub_istream 6313 : public __node 6314 { 6315 static const ptrdiff_t n = sizeof("std::istream") - 1; 6316 public: 6317 6318 virtual size_t first_size() const {return n;} 6319 virtual char* first_demangled_name(char* buf) const 6320 { 6321 strncpy(buf, "std::istream", n); 6322 return buf + n; 6323 } 6324 virtual ptrdiff_t print_first(char* f, char* l) const 6325 { 6326 const ptrdiff_t r = l - f; 6327 if (r >= n) 6328 { 6329 *f++ = 's'; 6330 *f++ = 't'; 6331 *f++ = 'd'; 6332 *f++ = ':'; 6333 *f++ = ':'; 6334 *f++ = 'i'; 6335 *f++ = 's'; 6336 *f++ = 't'; 6337 *f++ = 'r'; 6338 *f++ = 'e'; 6339 *f++ = 'a'; 6340 *f = 'm'; 6341 } 6342 return n; 6343 } 6344 }; 6345 6346 class __sub_ostream 6347 : public __node 6348 { 6349 static const ptrdiff_t n = sizeof("std::ostream") - 1; 6350 public: 6351 6352 virtual size_t first_size() const {return n;} 6353 virtual char* first_demangled_name(char* buf) const 6354 { 6355 strncpy(buf, "std::ostream", n); 6356 return buf + n; 6357 } 6358 virtual ptrdiff_t print_first(char* f, char* l) const 6359 { 6360 const ptrdiff_t r = l - f; 6361 if (r >= n) 6362 { 6363 *f++ = 's'; 6364 *f++ = 't'; 6365 *f++ = 'd'; 6366 *f++ = ':'; 6367 *f++ = ':'; 6368 *f++ = 'o'; 6369 *f++ = 's'; 6370 *f++ = 't'; 6371 *f++ = 'r'; 6372 *f++ = 'e'; 6373 *f++ = 'a'; 6374 *f = 'm'; 6375 } 6376 return n; 6377 } 6378 }; 6379 6380 class __sub_iostream 6381 : public __node 6382 { 6383 static const ptrdiff_t n = sizeof("std::iostream") - 1; 6384 public: 6385 6386 virtual size_t first_size() const {return n;} 6387 virtual char* first_demangled_name(char* buf) const 6388 { 6389 strncpy(buf, "std::iostream", n); 6390 return buf + n; 6391 } 6392 virtual ptrdiff_t print_first(char* f, char* l) const 6393 { 6394 const ptrdiff_t r = l - f; 6395 if (r >= n) 6396 { 6397 *f++ = 's'; 6398 *f++ = 't'; 6399 *f++ = 'd'; 6400 *f++ = ':'; 6401 *f++ = ':'; 6402 *f++ = 'i'; 6403 *f++ = 'o'; 6404 *f++ = 's'; 6405 *f++ = 't'; 6406 *f++ = 'r'; 6407 *f++ = 'e'; 6408 *f++ = 'a'; 6409 *f = 'm'; 6410 } 6411 return n; 6412 } 6413 }; 6414 6415 class __sub 6416 : public __node 6417 { 6418 public: 6419 6420 explicit __sub(__node* arg) 6421 { 6422 __left_ = arg; 6423 } 6424 explicit __sub(size_t arg) 6425 { 6426 __size_ = arg; 6427 } 6428 virtual size_t first_size() const 6429 { 6430 return __left_->first_size(); 6431 } 6432 virtual char* first_demangled_name(char* buf) const 6433 { 6434 return __left_->first_demangled_name(buf); 6435 } 6436 virtual size_t second_size() const 6437 { 6438 return __left_->second_size(); 6439 } 6440 virtual char* second_demangled_name(char* buf) const 6441 { 6442 return __left_->second_demangled_name(buf); 6443 } 6444 virtual ptrdiff_t print_first(char* f, char* l) const 6445 { 6446 return __left_->print_first(f, l); 6447 } 6448 virtual ptrdiff_t print_second(char* f, char* l) const 6449 { 6450 return __left_->print_second(f, l); 6451 } 6452 virtual bool ends_with_template() const 6453 { 6454 return __left_->ends_with_template(); 6455 } 6456 virtual __node* base_name() const 6457 { 6458 return __left_->base_name(); 6459 } 6460 virtual bool is_reference_or_pointer_to_function_or_array() const 6461 { 6462 return __left_->is_reference_or_pointer_to_function_or_array(); 6463 } 6464 virtual bool is_function() const 6465 { 6466 return __left_->is_function(); 6467 } 6468 virtual bool is_cv_qualifer() const 6469 { 6470 return __left_->is_cv_qualifer(); 6471 } 6472 virtual bool is_ctor_dtor_conv() const 6473 { 6474 return __left_->is_ctor_dtor_conv(); 6475 } 6476 virtual bool is_array() const 6477 { 6478 return __left_->is_array(); 6479 } 6480 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6481 { 6482 if (__left_ == 0) 6483 { 6484 if (__size_ < t_end - t_begin) 6485 { 6486 __left_ = t_begin[__size_]; 6487 __size_ = 0; 6488 } 6489 else 6490 return false; 6491 } 6492 return true; 6493 } 6494 virtual size_t list_len() const 6495 { 6496 return __left_->list_len(); 6497 } 6498 virtual bool is_sub() const 6499 { 6500 return true; 6501 } 6502 }; 6503 6504 class __unscoped_template_name 6505 : public __node 6506 { 6507 public: 6508 __unscoped_template_name(__node* name, __node* args) 6509 {__left_ = name; __right_ = args;} 6510 6511 virtual size_t first_size() const 6512 { 6513 if (__cached_size_ == -1) 6514 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size(); 6515 return __cached_size_; 6516 } 6517 virtual char* first_demangled_name(char* buf) const 6518 { 6519 buf = __left_->get_demangled_name(buf); 6520 return __right_->get_demangled_name(buf); 6521 } 6522 virtual ptrdiff_t print_first(char* f, char* l) const 6523 { 6524 const ptrdiff_t r = l - f; 6525 ptrdiff_t sz1 = __left_->print(f, l); 6526 if (r < sz1) 6527 return sz1 + __right_->print(l, l); 6528 return sz1 + __right_->print(f + sz1, l); 6529 } 6530 virtual bool ends_with_template() const 6531 { 6532 return __right_->ends_with_template(); 6533 } 6534 virtual __node* base_name() const 6535 { 6536 return __left_->base_name(); 6537 } 6538 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6539 { 6540 return __left_->fix_forward_references(t_begin, t_end) && 6541 __right_->fix_forward_references(t_begin, t_end); 6542 } 6543 }; 6544 6545 // length == 0: __left_ == NULL 6546 // length == 1: __left_ != NULL, __right_ == NULL 6547 // length > 1: __left_ != NULL, __right_ != NULL 6548 class __list 6549 : public __node 6550 { 6551 public: 6552 explicit __list(__node* type) 6553 {__left_ = type;} 6554 6555 virtual size_t first_size() const 6556 { 6557 if (__cached_size_ == -1) 6558 { 6559 if (__left_ == NULL) 6560 const_cast<long&>(__cached_size_) = 0; 6561 else if (__right_ == NULL) 6562 const_cast<long&>(__cached_size_) = __left_->size(); 6563 else 6564 { 6565 size_t off = __right_->size(); 6566 if (off > 0) 6567 off += 2; 6568 const_cast<long&>(__cached_size_) = __left_->size() + off; 6569 } 6570 } 6571 return __cached_size_; 6572 } 6573 virtual char* first_demangled_name(char* buf) const 6574 { 6575 if (__left_ != NULL) 6576 { 6577 char* t = __left_->get_demangled_name(buf + (__size_ ? 2 : 0)); 6578 if (__size_ == 0) 6579 buf = t; 6580 else if (t != buf+2) 6581 { 6582 *buf++ = ','; 6583 *buf++ = ' '; 6584 buf = t; 6585 } 6586 if (__right_) 6587 buf = __right_->get_demangled_name(buf); 6588 } 6589 return buf; 6590 } 6591 virtual ptrdiff_t print_first(char* f, char* l) const 6592 { 6593 if (__left_ == 0) 6594 return 0; 6595 const ptrdiff_t r = l - f; 6596 ptrdiff_t n = 0; 6597 if (__size_) 6598 { 6599 n = 2; 6600 if (r < n) 6601 { 6602 ptrdiff_t sz1 = __left_->print(l, l); 6603 if (sz1 == 0) 6604 n = 0; 6605 return n + sz1 + (__right_ ? __right_->print(l, l) : 0); 6606 } 6607 } 6608 const ptrdiff_t sz1 = __left_->print(f+n, l); 6609 if (sz1 == 0) 6610 n = 0; 6611 else if (n != 0) 6612 { 6613 f[0] = ','; 6614 f[1] = ' '; 6615 } 6616 const ptrdiff_t sz2 = __right_ ? __right_->print(f+std::min(n+sz1, r), l) : 0; 6617 return n + sz1 + sz2; 6618 } 6619 virtual bool ends_with_template() const 6620 { 6621 if (__right_ != NULL) 6622 return __right_->ends_with_template(); 6623 if (__left_ != NULL) 6624 return __left_->ends_with_template(); 6625 return false; 6626 } 6627 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6628 { 6629 bool r = true; 6630 if (__left_) 6631 r = r && __left_->fix_forward_references(t_begin, t_end); 6632 if (__right_) 6633 r = r && __right_->fix_forward_references(t_begin, t_end); 6634 return r; 6635 } 6636 virtual size_t list_len() const 6637 { 6638 if (!__left_) 6639 return 0; 6640 if (!__right_) 6641 return 1; 6642 return 1 + __right_->list_len(); 6643 } 6644 }; 6645 6646 class __template_args 6647 : public __node 6648 { 6649 public: 6650 __template_args(__node* name, __node* list) 6651 { 6652 __left_ = name; 6653 __right_ = list; 6654 } 6655 6656 virtual size_t first_size() const 6657 { 6658 if (__cached_size_ == -1) 6659 { 6660 size_t off = 2; 6661 if (__right_) 6662 { 6663 if (__right_->ends_with_template()) 6664 ++off; 6665 off += __right_->size(); 6666 } 6667 const_cast<long&>(__cached_size_) = __left_->size() + off; 6668 } 6669 return __cached_size_; 6670 } 6671 virtual char* first_demangled_name(char* buf) const 6672 { 6673 buf = __left_->get_demangled_name(buf); 6674 *buf++ = '<'; 6675 if (__right_) 6676 { 6677 buf = __right_->get_demangled_name(buf); 6678 if (buf[-1] == '>') 6679 *buf++ = ' '; 6680 } 6681 *buf++ = '>'; 6682 return buf; 6683 } 6684 virtual ptrdiff_t print_first(char* f, char* l) const 6685 { 6686 const ptrdiff_t r = l - f; 6687 const ptrdiff_t sz1 = __left_->print(f, l); 6688 ptrdiff_t sz2 = 0; 6689 ptrdiff_t n = 2; 6690 if (__right_) 6691 { 6692 sz2 = __right_->print(f+std::min(sz1+1, r), l); 6693 if (r >= sz1 + sz2 + 2) 6694 { 6695 if (f[sz1+sz2] == '>') 6696 { 6697 f[sz1+sz2+1] = ' '; 6698 ++n; 6699 } 6700 } 6701 else if (__right_->ends_with_template()) 6702 ++n; 6703 } 6704 if (r >= sz1 + sz2 + n) 6705 { 6706 f[sz1] = '<'; 6707 f[sz1+sz2+n-1] = '>'; 6708 } 6709 return n + sz1 + sz2; 6710 } 6711 6712 virtual bool ends_with_template() const 6713 { 6714 return true; 6715 } 6716 virtual __node* base_name() const 6717 { 6718 return __left_->base_name(); 6719 } 6720 virtual bool is_ctor_dtor_conv() const 6721 { 6722 return __left_->is_ctor_dtor_conv(); 6723 } 6724 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6725 { 6726 bool r = __left_->fix_forward_references(t_begin, t_end); 6727 if (__right_) 6728 r = r && __right_->fix_forward_references(t_begin, t_end); 6729 return r; 6730 } 6731 }; 6732 6733 class __function_args 6734 : public __node 6735 { 6736 public: 6737 __function_args(__node* list) 6738 {__right_ = list;} 6739 6740 virtual size_t first_size() const 6741 { 6742 if (__cached_size_ == -1) 6743 const_cast<long&>(__cached_size_) = 2 + __right_->size(); 6744 return __cached_size_; 6745 } 6746 virtual char* first_demangled_name(char* buf) const 6747 { 6748 *buf++ = '('; 6749 buf = __right_->get_demangled_name(buf); 6750 *buf++ = ')'; 6751 return buf; 6752 } 6753 virtual ptrdiff_t print_first(char* f, char* l) const 6754 { 6755 const ptrdiff_t r = l - f; 6756 const ptrdiff_t n = 2; 6757 if (r < n) 6758 return n + __right_->print(l, l); 6759 ptrdiff_t sz1 = __right_->print(f+1, l); 6760 if (r >= n + sz1) 6761 { 6762 *f = '('; 6763 f += 1 + sz1; 6764 *f = ')'; 6765 } 6766 return n + sz1; 6767 } 6768 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 6769 { 6770 return __right_->fix_forward_references(t_begin, t_end); 6771 } 6772 }; 6773 6774 class __cv_qualifiers 6775 : public __node 6776 { 6777 public: 6778 __cv_qualifiers(size_t cv, __node* type) 6779 { 6780 __left_ = type; 6781 __size_ = __left_->is_function() ? cv << 5 : cv; 6782 } 6783 6784 virtual size_t first_size() const 6785 { 6786 size_t s = __left_->first_size(); 6787 if (__size_ & 4) 6788 s += sizeof(" restrict")-1; 6789 if (__size_ & 2) 6790 s += sizeof(" volatile")-1; 6791 if (__size_ & 1) 6792 s += sizeof(" const")-1; 6793 if (__size_ & 8) 6794 s += sizeof(" &")-1; 6795 if (__size_ & 16) 6796 s += sizeof(" &&")-1; 6797 return s; 6798 } 6799 virtual char* first_demangled_name(char* buf) const 6800 { 6801 buf = __left_->first_demangled_name(buf); 6802 if (__size_ & 1) 6803 { 6804 const size_t n = sizeof(" const")-1; 6805 strncpy(buf, " const", n); 6806 buf += n; 6807 } 6808 if (__size_ & 2) 6809 { 6810 const size_t n = sizeof(" volatile")-1; 6811 strncpy(buf, " volatile", n); 6812 buf += n; 6813 } 6814 if (__size_ & 4) 6815 { 6816 const size_t n = sizeof(" restrict")-1; 6817 strncpy(buf, " restrict", n); 6818 buf += n; 6819 } 6820 if (__size_ & 8) 6821 { 6822 *buf++ = ' '; 6823 *buf++ = '&'; 6824 } 6825 if (__size_ & 16) 6826 { 6827 *buf++ = ' '; 6828 *buf++ = '&'; 6829 *buf++ = '&'; 6830 } 6831 return buf; 6832 } 6833 virtual ptrdiff_t print_first(char* f, char* l) const 6834 { 6835 const ptrdiff_t r = l - f; 6836 const ptrdiff_t sz = __left_->print_first(f, l); 6837 ptrdiff_t n = 0; 6838 if (__size_ & 0x1F) 6839 { 6840 if (__size_ & 1) 6841 { 6842 const ptrdiff_t d = sizeof(" const")-1; 6843 if (r >= sz + n + d) 6844 { 6845 char* t = f + sz + n; 6846 *t++ = ' '; 6847 *t++ = 'c'; 6848 *t++ = 'o'; 6849 *t++ = 'n'; 6850 *t++ = 's'; 6851 *t = 't'; 6852 } 6853 n += d; 6854 } 6855 if (__size_ & 2) 6856 { 6857 const ptrdiff_t d = sizeof(" volatile")-1; 6858 if (r >= sz + n + d) 6859 { 6860 char* t = f + sz + n; 6861 *t++ = ' '; 6862 *t++ = 'v'; 6863 *t++ = 'o'; 6864 *t++ = 'l'; 6865 *t++ = 'a'; 6866 *t++ = 't'; 6867 *t++ = 'i'; 6868 *t++ = 'l'; 6869 *t = 'e'; 6870 } 6871 n += d; 6872 } 6873 if (__size_ & 4) 6874 { 6875 const ptrdiff_t d = sizeof(" restrict")-1; 6876 if (r >= sz + n + d) 6877 { 6878 char* t = f + sz + n; 6879 *t++ = ' '; 6880 *t++ = 'r'; 6881 *t++ = 'e'; 6882 *t++ = 's'; 6883 *t++ = 't'; 6884 *t++ = 'r'; 6885 *t++ = 'i'; 6886 *t++ = 'c'; 6887 *t = 't'; 6888 } 6889 n += d; 6890 } 6891 if (__size_ & 8) 6892 { 6893 const ptrdiff_t d = sizeof(" &")-1; 6894 if (r >= sz + n + d) 6895 { 6896 char* t = f + sz + n; 6897 *t++ = ' '; 6898 *t = '&'; 6899 } 6900 n += d; 6901 } 6902 if (__size_ & 16) 6903 { 6904 const ptrdiff_t d = sizeof(" &&")-1; 6905 if (r >= sz + n + d) 6906 { 6907 char* t = f + sz + n; 6908 *t++ = ' '; 6909 *t++ = '&'; 6910 *t = '&'; 6911 } 6912 n += d; 6913 } 6914 } 6915 return n + sz; 6916 } 6917 virtual size_t second_size() const 6918 { 6919 size_t s = __left_->second_size(); 6920 if (__size_ & 128) 6921 s += sizeof(" restrict")-1; 6922 if (__size_ & 64) 6923 s += sizeof(" volatile")-1; 6924 if (__size_ & 32) 6925 s += sizeof(" const")-1; 6926 if (__size_ & 256) 6927 s += sizeof(" &")-1; 6928 if (__size_ & 512) 6929 s += sizeof(" &&")-1; 6930 return s; 6931 } 6932 virtual char* second_demangled_name(char* buf) const 6933 { 6934 buf = __left_->second_demangled_name(buf); 6935 if (__size_ & 32) 6936 { 6937 const size_t n = sizeof(" const")-1; 6938 strncpy(buf, " const", n); 6939 buf += n; 6940 } 6941 if (__size_ & 64) 6942 { 6943 const size_t n = sizeof(" volatile")-1; 6944 strncpy(buf, " volatile", n); 6945 buf += n; 6946 } 6947 if (__size_ & 128) 6948 { 6949 const size_t n = sizeof(" restrict")-1; 6950 strncpy(buf, " restrict", n); 6951 buf += n; 6952 } 6953 if (__size_ & 256) 6954 { 6955 *buf++ = ' '; 6956 *buf++ = '&'; 6957 } 6958 if (__size_ & 512) 6959 { 6960 *buf++ = ' '; 6961 *buf++ = '&'; 6962 *buf++ = '&'; 6963 } 6964 return buf; 6965 } 6966 virtual ptrdiff_t print_second(char* f, char* l) const 6967 { 6968 const ptrdiff_t r = l - f; 6969 const ptrdiff_t sz = __left_->print_second(f, l); 6970 ptrdiff_t n = 0; 6971 if (__size_ & 0x3E0) 6972 { 6973 if (__size_ & 32) 6974 { 6975 const ptrdiff_t d = sizeof(" const")-1; 6976 if (r >= sz + n + d) 6977 { 6978 char* t = f + sz + n; 6979 *t++ = ' '; 6980 *t++ = 'c'; 6981 *t++ = 'o'; 6982 *t++ = 'n'; 6983 *t++ = 's'; 6984 *t = 't'; 6985 } 6986 n += d; 6987 } 6988 if (__size_ & 64) 6989 { 6990 const ptrdiff_t d = sizeof(" volatile")-1; 6991 if (r >= sz + n + d) 6992 { 6993 char* t = f + sz + n; 6994 *t++ = ' '; 6995 *t++ = 'v'; 6996 *t++ = 'o'; 6997 *t++ = 'l'; 6998 *t++ = 'a'; 6999 *t++ = 't'; 7000 *t++ = 'i'; 7001 *t++ = 'l'; 7002 *t = 'e'; 7003 } 7004 n += d; 7005 } 7006 if (__size_ & 128) 7007 { 7008 const ptrdiff_t d = sizeof(" restrict")-1; 7009 if (r >= sz + n + d) 7010 { 7011 char* t = f + sz + n; 7012 *t++ = ' '; 7013 *t++ = 'r'; 7014 *t++ = 'e'; 7015 *t++ = 's'; 7016 *t++ = 't'; 7017 *t++ = 'r'; 7018 *t++ = 'i'; 7019 *t++ = 'c'; 7020 *t = 't'; 7021 } 7022 n += d; 7023 } 7024 if (__size_ & 256) 7025 { 7026 const ptrdiff_t d = sizeof(" &")-1; 7027 if (r >= sz + n + d) 7028 { 7029 char* t = f + sz + n; 7030 *t++ = ' '; 7031 *t = '&'; 7032 } 7033 n += d; 7034 } 7035 if (__size_ & 512) 7036 { 7037 const ptrdiff_t d = sizeof(" &&")-1; 7038 if (r >= sz + n + d) 7039 { 7040 char* t = f + sz + n; 7041 *t++ = ' '; 7042 *t++ = '&'; 7043 *t = '&'; 7044 } 7045 n += d; 7046 } 7047 } 7048 return n + sz; 7049 } 7050 virtual __node* base_name() const 7051 { 7052 return __left_->base_name(); 7053 } 7054 virtual bool is_reference_or_pointer_to_function_or_array() const 7055 { 7056 return __left_->is_reference_or_pointer_to_function_or_array(); 7057 } 7058 virtual bool is_function() const 7059 { 7060 return __left_->is_function(); 7061 } 7062 virtual bool is_cv_qualifer() const 7063 { 7064 return true; 7065 } 7066 virtual __node* extract_cv(__node*& rt) const 7067 { 7068 if (rt == this) 7069 { 7070 rt = __left_; 7071 return const_cast<__node*>(static_cast<const __node*>(this)); 7072 } 7073 return 0; 7074 } 7075 virtual bool ends_with_template() const 7076 { 7077 return __left_->ends_with_template(); 7078 } 7079 virtual bool is_ctor_dtor_conv() const 7080 { 7081 return __left_->is_ctor_dtor_conv(); 7082 } 7083 virtual bool is_array() const 7084 { 7085 return __left_->is_array(); 7086 } 7087 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7088 { 7089 return __left_->fix_forward_references(t_begin, t_end); 7090 } 7091 virtual size_t list_len() const 7092 { 7093 return __left_->list_len(); 7094 } 7095 }; 7096 7097 class __extended_qualifier 7098 : public __node 7099 { 7100 public: 7101 __extended_qualifier(__node* name, __node* type) 7102 { 7103 __left_ = type; 7104 __right_ = name; 7105 __size_ = __left_->is_function() ? 1 : 0; 7106 } 7107 7108 virtual size_t first_size() const 7109 { 7110 size_t s = __left_->first_size(); 7111 if (__size_ == 0) 7112 s += __right_->size() + 1; 7113 return s; 7114 } 7115 virtual char* first_demangled_name(char* buf) const 7116 { 7117 buf = __left_->first_demangled_name(buf); 7118 if (__size_ == 0) 7119 { 7120 *buf++ = ' '; 7121 buf = __right_->get_demangled_name(buf); 7122 } 7123 return buf; 7124 } 7125 virtual ptrdiff_t print_first(char* f, char* l) const 7126 { 7127 const ptrdiff_t r = l - f; 7128 const ptrdiff_t sz1 = __left_->print_first(f, l); 7129 ptrdiff_t sz2 = 0; 7130 ptrdiff_t n = 0; 7131 if (__size_ == 0) 7132 { 7133 if (r < sz1 + 1) 7134 return sz1 + 1 + __right_->print(l, l); 7135 sz2 = __right_->print(f+1+sz1, l); 7136 n = 1; 7137 f[sz1] = ' '; 7138 } 7139 return n + sz1 + sz2; 7140 } 7141 virtual size_t second_size() const 7142 { 7143 size_t s = __left_->second_size(); 7144 if (__size_ == 1) 7145 s += __right_->size() + 1; 7146 return s; 7147 } 7148 virtual char* second_demangled_name(char* buf) const 7149 { 7150 buf = __left_->second_demangled_name(buf); 7151 if (__size_ == 1) 7152 { 7153 *buf++ = ' '; 7154 buf = __right_->get_demangled_name(buf); 7155 } 7156 return buf; 7157 } 7158 virtual ptrdiff_t print_second(char* f, char* l) const 7159 { 7160 const ptrdiff_t r = l - f; 7161 const ptrdiff_t sz1 = __left_->print_second(f, l); 7162 ptrdiff_t sz2 = 0; 7163 ptrdiff_t n = 0; 7164 if (__size_ == 1) 7165 { 7166 if (r < sz1 + 1) 7167 return sz1 + 1 + __right_->print(l, l); 7168 sz2 = __right_->print(f+1+sz1, l); 7169 n = 1; 7170 f[sz1] = ' '; 7171 } 7172 return n + sz1 + sz2; 7173 } 7174 virtual __node* base_name() const 7175 { 7176 return __left_->base_name(); 7177 } 7178 virtual bool is_reference_or_pointer_to_function_or_array() const 7179 { 7180 return __left_->is_reference_or_pointer_to_function_or_array(); 7181 } 7182 virtual bool is_function() const 7183 { 7184 return __left_->is_function(); 7185 } 7186 virtual bool is_cv_qualifer() const 7187 { 7188 return true; 7189 } 7190 virtual __node* extract_cv(__node*& rt) const 7191 { 7192 if (rt == this) 7193 { 7194 rt = __left_; 7195 return const_cast<__node*>(static_cast<const __node*>(this)); 7196 } 7197 return 0; 7198 } 7199 virtual bool ends_with_template() const 7200 { 7201 return __left_->ends_with_template(); 7202 } 7203 virtual bool is_ctor_dtor_conv() const 7204 { 7205 return __left_->is_ctor_dtor_conv(); 7206 } 7207 virtual bool is_array() const 7208 { 7209 return __left_->is_array(); 7210 } 7211 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7212 { 7213 return __left_->fix_forward_references(t_begin, t_end); 7214 } 7215 virtual size_t list_len() const 7216 { 7217 return __left_->list_len(); 7218 } 7219 }; 7220 7221 class __function 7222 : public __node 7223 { 7224 public: 7225 7226 __function(__node* name, __node* signature, size_t ret_goes_first = true) 7227 { 7228 __size_ = ret_goes_first; 7229 __left_ = name; 7230 __right_ = signature; 7231 } 7232 7233 virtual size_t first_size() const 7234 { 7235 size_t off = 0; 7236 if (__size_) 7237 { 7238 off = __right_->first_size(); 7239 if (off > 0 && (__left_ == NULL || 7240 !__right_->__left_->is_reference_or_pointer_to_function_or_array())) 7241 ++off; 7242 } 7243 else 7244 off = 5; 7245 if (__left_) 7246 off += __left_->first_size(); 7247 else 7248 ++off; 7249 return off; 7250 } 7251 7252 virtual size_t second_size() const 7253 { 7254 size_t off = 0; 7255 if (__left_ == NULL) 7256 off = 1; 7257 off += __right_->second_size(); 7258 if (!__size_) 7259 { 7260 off += 2; 7261 off += __right_->first_size(); 7262 } 7263 return off; 7264 } 7265 7266 virtual char* first_demangled_name(char* buf) const 7267 { 7268 if (__size_) 7269 { 7270 const char* t = buf; 7271 buf = __right_->first_demangled_name(buf); 7272 if (buf != t && (__left_ == NULL || 7273 !__right_->__left_->is_reference_or_pointer_to_function_or_array())) 7274 *buf++ = ' '; 7275 } 7276 else 7277 { 7278 strncpy(buf, "auto ", 5); 7279 buf += 5; 7280 } 7281 if (__left_) 7282 buf = __left_->first_demangled_name(buf); 7283 else 7284 *buf++ = '('; 7285 return buf; 7286 } 7287 virtual ptrdiff_t print_first(char* f, char* l) const 7288 { 7289 const ptrdiff_t r = l - f; 7290 ptrdiff_t n = 0; 7291 ptrdiff_t sz1 = 0; 7292 ptrdiff_t sz2 = 0; 7293 if (__size_) 7294 { 7295 sz1 = __right_->print_first(f, l); 7296 if (sz1 != 0 && (__left_ == NULL || 7297 !__right_->__left_->is_reference_or_pointer_to_function_or_array())) 7298 { 7299 ++n; 7300 if (r >= sz1 + 1) 7301 f[sz1] = ' '; 7302 } 7303 } 7304 else 7305 { 7306 n = 5; 7307 if (r >= 5) 7308 { 7309 char* t = f; 7310 *t++ = 'a'; 7311 *t++ = 'u'; 7312 *t++ = 't'; 7313 *t++ = 'o'; 7314 *t++ = ' '; 7315 } 7316 } 7317 if (__left_) 7318 sz2 = __left_->print_first(f + std::min(n + sz1, r), l); 7319 else 7320 { 7321 ++n; 7322 if (r >= n + sz1) 7323 f[n+sz1-1] = '('; 7324 } 7325 return n + sz1 + sz2; 7326 } 7327 7328 virtual char* second_demangled_name(char* buf) const 7329 { 7330 if (__left_ == NULL) 7331 *buf++ = ')'; 7332 buf = __right_->second_demangled_name(buf); 7333 if (!__size_) 7334 { 7335 *buf++ = '-'; 7336 *buf++ = '>'; 7337 buf = __right_->first_demangled_name(buf); 7338 } 7339 return buf; 7340 } 7341 virtual ptrdiff_t print_second(char* f, char* l) const 7342 { 7343 const ptrdiff_t r = l - f; 7344 ptrdiff_t n = 0; 7345 ptrdiff_t sz1 = 0; 7346 ptrdiff_t sz2 = 0; 7347 if (__left_ == NULL) 7348 { 7349 n = 1; 7350 if (r >= 1) 7351 *f = ')'; 7352 } 7353 sz1 = __right_->print_second(f+std::min(r, n), l); 7354 if (!__size_) 7355 { 7356 if (r > n+sz1+1) 7357 { 7358 f[n+sz1] = '-'; 7359 f[n+sz1+1] = '>'; 7360 } 7361 n += 2; 7362 sz2 = __right_->print_first(f+std::min(r, n+sz1), l); 7363 } 7364 return n + sz1 + sz2; 7365 } 7366 7367 virtual char* get_demangled_name(char* buf) const 7368 { 7369 if (__size_) 7370 { 7371 const char* t = buf; 7372 buf = __right_->first_demangled_name(buf); 7373 if (buf != t && (__left_ == NULL || 7374 !__right_->__left_->is_reference_or_pointer_to_function_or_array())) 7375 *buf++ = ' '; 7376 } 7377 else 7378 { 7379 strncpy(buf, "auto ", 5); 7380 buf += 5; 7381 } 7382 if (__left_) 7383 buf = __left_->first_demangled_name(buf); 7384 buf = __right_->second_demangled_name(buf); 7385 if (!__size_) 7386 { 7387 *buf++ = '-'; 7388 *buf++ = '>'; 7389 buf = __right_->first_demangled_name(buf); 7390 } 7391 return buf; 7392 } 7393 7394 virtual size_t size() const 7395 { 7396 if (__cached_size_ == -1) 7397 { 7398 size_t off = 0; 7399 if (__size_) 7400 { 7401 off = __right_->first_size(); 7402 if (off > 0 && (__left_ == NULL || 7403 !__right_->__left_->is_reference_or_pointer_to_function_or_array())) 7404 ++off; 7405 } 7406 else 7407 off = 5; 7408 if (__left_) 7409 off += __left_->first_size(); 7410 off += __right_->second_size(); 7411 if (!__size_) 7412 { 7413 off += 2; 7414 off += __right_->first_size(); 7415 } 7416 const_cast<long&>(__cached_size_) = off; 7417 } 7418 return __cached_size_; 7419 } 7420 7421 virtual ptrdiff_t print(char* f, char* l) const 7422 { 7423 const ptrdiff_t r = l - f; 7424 ptrdiff_t n = 0; 7425 ptrdiff_t sz1 = 0; 7426 ptrdiff_t sz2 = 0; 7427 if (__size_) 7428 { 7429 sz1 = __right_->print_first(f, l); 7430 if (sz1 != 0 && (__left_ == NULL || 7431 !__right_->__left_->is_reference_or_pointer_to_function_or_array())) 7432 { 7433 ++n; 7434 if (r >= sz1 + 1) 7435 f[sz1] = ' '; 7436 } 7437 } 7438 else 7439 { 7440 n = 5; 7441 if (r >= 5) 7442 { 7443 char* t = f; 7444 *t++ = 'a'; 7445 *t++ = 'u'; 7446 *t++ = 't'; 7447 *t++ = 'o'; 7448 *t++ = ' '; 7449 } 7450 } 7451 if (__left_) 7452 sz2 = __left_->print_first(f + std::min(n + sz1, r), l); 7453 n += sz1 + sz2; 7454 sz2 = 0; 7455 sz1 = __right_->print_second(f+std::min(r, n), l); 7456 if (!__size_) 7457 { 7458 if (r > n+sz1+1) 7459 { 7460 f[n+sz1] = '-'; 7461 f[n+sz1+1] = '>'; 7462 } 7463 n += 2; 7464 sz2 = __right_->print_first(f+std::min(r, n+sz1), l); 7465 } 7466 return n + sz1 + sz2; 7467 } 7468 7469 virtual bool is_function() const 7470 { 7471 return true; 7472 } 7473 virtual bool is_ctor_dtor_conv() const 7474 { 7475 return __left_->is_ctor_dtor_conv(); 7476 } 7477 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7478 { 7479 bool r = true; 7480 if (__left_) 7481 r = r && __left_->fix_forward_references(t_begin, t_end); 7482 r = r && __right_->fix_forward_references(t_begin, t_end); 7483 return r; 7484 } 7485 }; 7486 7487 class __function_signature 7488 : public __node 7489 { 7490 public: 7491 __function_signature(__node* ret, __node* args) 7492 { 7493 __left_ = ret; 7494 __right_ = args; 7495 } 7496 virtual size_t first_size() const 7497 { 7498 return __left_ ? __left_->first_size() : 0; 7499 } 7500 7501 virtual size_t second_size() const 7502 { 7503 return 2 + (__right_ ? __right_->size() : 0) 7504 + (__left_ ? __left_->second_size() : 0); 7505 } 7506 7507 virtual char* first_demangled_name(char* buf) const 7508 { 7509 if (__left_) 7510 buf = __left_->first_demangled_name(buf); 7511 return buf; 7512 } 7513 virtual ptrdiff_t print_first(char* f, char* l) const 7514 { 7515 return __left_ ? __left_->print_first(f, l) : 0; 7516 } 7517 7518 virtual char* second_demangled_name(char* buf) const 7519 { 7520 *buf++ = '('; 7521 if (__right_) 7522 buf = __right_->get_demangled_name(buf); 7523 *buf++ = ')'; 7524 if (__left_) 7525 buf = __left_->second_demangled_name(buf); 7526 return buf; 7527 } 7528 virtual ptrdiff_t print_second(char* f, char* l) const 7529 { 7530 const ptrdiff_t r = l - f; 7531 const ptrdiff_t sz1 = __right_ ? __right_->print(f+std::min<ptrdiff_t>(1, r), l) : 0; 7532 const ptrdiff_t sz2 = __left_ ? __left_->print_second(f+std::min(2+sz1, r), l) : 0; 7533 if (r >= 2 + sz1 + sz2) 7534 { 7535 *f = '('; 7536 f += 1 + sz1; 7537 *f = ')'; 7538 } 7539 return 2 + sz1 + sz2; 7540 } 7541 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7542 { 7543 bool r = true; 7544 if (__left_) 7545 r = r && __left_->fix_forward_references(t_begin, t_end); 7546 if (__right_) 7547 r = r && __right_->fix_forward_references(t_begin, t_end); 7548 return r; 7549 } 7550 }; 7551 7552 class __pointer_to 7553 : public __node 7554 { 7555 public: 7556 7557 explicit __pointer_to(__node* type) 7558 { 7559 __left_ = type; 7560 } 7561 virtual size_t first_size() const 7562 { 7563 return __left_->first_size() + (__left_->is_array() ? 3 : 1); 7564 } 7565 virtual size_t second_size() const 7566 { 7567 return __left_->second_size() + (__left_->is_array() ? 1 : 0); 7568 } 7569 virtual char* first_demangled_name(char* buf) const 7570 { 7571 buf = __left_->first_demangled_name(buf); 7572 if (__left_->is_array()) 7573 { 7574 *buf++ = ' '; 7575 *buf++ = '('; 7576 *buf++ = '*'; 7577 } 7578 else 7579 *buf++ = '*'; 7580 return buf; 7581 } 7582 virtual ptrdiff_t print_first(char* f, char* l) const 7583 { 7584 const ptrdiff_t r = l - f; 7585 const ptrdiff_t sz = __left_->print_first(f, l); 7586 ptrdiff_t n; 7587 if (__left_->is_array()) 7588 { 7589 n = 3; 7590 if (r >= sz + n) 7591 { 7592 f += sz; 7593 *f++ = ' '; 7594 *f++ = '('; 7595 *f = '*'; 7596 } 7597 } 7598 else 7599 { 7600 n = 1; 7601 if (r >= sz + n) 7602 f[sz] = '*'; 7603 } 7604 return sz + n; 7605 } 7606 virtual char* second_demangled_name(char* buf) const 7607 { 7608 if (__left_->is_array()) 7609 *buf++ = ')'; 7610 return __left_->second_demangled_name(buf); 7611 } 7612 virtual ptrdiff_t print_second(char* f, char* l) const 7613 { 7614 const ptrdiff_t r = l - f; 7615 ptrdiff_t n = 0; 7616 if (__left_->is_array()) 7617 { 7618 n = 1; 7619 if (r > n) 7620 *f = ')'; 7621 } 7622 return __left_->print_second(f + std::min(n, r), l) + n; 7623 } 7624 virtual __node* base_name() const 7625 { 7626 return __left_->base_name(); 7627 } 7628 virtual bool is_reference_or_pointer_to_function_or_array() const 7629 { 7630 return __left_->is_function() || 7631 __left_->is_reference_or_pointer_to_function_or_array(); 7632 } 7633 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7634 { 7635 return __left_->fix_forward_references(t_begin, t_end); 7636 } 7637 virtual size_t list_len() const 7638 { 7639 return __left_->list_len(); 7640 } 7641 }; 7642 7643 class __lvalue_reference_to 7644 : public __node 7645 { 7646 public: 7647 7648 explicit __lvalue_reference_to(__node* type) 7649 { 7650 __left_ = type; 7651 } 7652 virtual size_t first_size() const 7653 { 7654 return __left_->first_size() + (__left_->is_array() ? 3 : 1); 7655 } 7656 virtual size_t second_size() const 7657 { 7658 return __left_->second_size() + (__left_->is_array() ? 1 : 0); 7659 } 7660 virtual char* first_demangled_name(char* buf) const 7661 { 7662 buf = __left_->first_demangled_name(buf); 7663 if (__left_->is_array()) 7664 { 7665 *buf++ = ' '; 7666 *buf++ = '('; 7667 *buf++ = '&'; 7668 } 7669 else 7670 *buf++ = '&'; 7671 return buf; 7672 } 7673 virtual ptrdiff_t print_first(char* f, char* l) const 7674 { 7675 const ptrdiff_t r = l - f; 7676 const ptrdiff_t sz = __left_->print_first(f, l); 7677 ptrdiff_t n; 7678 if (__left_->is_array()) 7679 { 7680 n = 3; 7681 if (r >= sz + n) 7682 { 7683 f += sz; 7684 *f++ = ' '; 7685 *f++ = '('; 7686 *f = '&'; 7687 } 7688 } 7689 else 7690 { 7691 n = 1; 7692 if (r >= sz + n) 7693 f[sz] = '&'; 7694 } 7695 return sz + n; 7696 } 7697 virtual char* second_demangled_name(char* buf) const 7698 { 7699 if (__left_->is_array()) 7700 *buf++ = ')'; 7701 return __left_->second_demangled_name(buf); 7702 } 7703 virtual ptrdiff_t print_second(char* f, char* l) const 7704 { 7705 const ptrdiff_t r = l - f; 7706 ptrdiff_t n = 0; 7707 if (__left_->is_array()) 7708 { 7709 n = 1; 7710 if (r > n) 7711 *f = ')'; 7712 } 7713 return __left_->print_second(f + std::min(n, r), l) + n; 7714 } 7715 virtual __node* base_name() const 7716 { 7717 return __left_->base_name(); 7718 } 7719 virtual bool is_reference_or_pointer_to_function_or_array() const 7720 { 7721 return __left_->is_function(); 7722 } 7723 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7724 { 7725 return __left_->fix_forward_references(t_begin, t_end); 7726 } 7727 virtual size_t list_len() const 7728 { 7729 return __left_->list_len(); 7730 } 7731 }; 7732 7733 class __rvalue_reference_to 7734 : public __node 7735 { 7736 public: 7737 7738 explicit __rvalue_reference_to(__node* type) 7739 { 7740 __left_ = type; 7741 } 7742 virtual size_t first_size() const 7743 { 7744 return __left_->first_size() + (__left_->is_array() ? 4 : 2); 7745 } 7746 virtual size_t second_size() const 7747 { 7748 return __left_->second_size() + (__left_->is_array() ? 1 : 0); 7749 } 7750 virtual char* first_demangled_name(char* buf) const 7751 { 7752 buf = __left_->first_demangled_name(buf); 7753 if (__left_->is_array()) 7754 { 7755 strncpy(buf, " (&&", 4); 7756 buf += 4; 7757 } 7758 else 7759 { 7760 *buf++ = '&'; 7761 *buf++ = '&'; 7762 } 7763 return buf; 7764 } 7765 virtual ptrdiff_t print_first(char* f, char* l) const 7766 { 7767 const ptrdiff_t r = l - f; 7768 const ptrdiff_t sz = __left_->print_first(f, l); 7769 ptrdiff_t n; 7770 if (__left_->is_array()) 7771 { 7772 n = 4; 7773 if (r >= sz + n) 7774 { 7775 f += sz; 7776 *f++ = ' '; 7777 *f++ = '('; 7778 *f++ = '&'; 7779 *f = '&'; 7780 } 7781 } 7782 else 7783 { 7784 n = 2; 7785 if (r >= sz + n) 7786 { 7787 f += sz; 7788 *f++ = '&'; 7789 *f = '&'; 7790 } 7791 } 7792 return sz + n; 7793 } 7794 virtual char* second_demangled_name(char* buf) const 7795 { 7796 if (__left_->is_array()) 7797 *buf++ = ')'; 7798 return __left_->second_demangled_name(buf); 7799 } 7800 virtual ptrdiff_t print_second(char* f, char* l) const 7801 { 7802 const ptrdiff_t r = l - f; 7803 ptrdiff_t n = 0; 7804 if (__left_->is_array()) 7805 { 7806 n = 1; 7807 if (r > n) 7808 *f = ')'; 7809 } 7810 return __left_->print_second(f + std::min(n, r), l) + n; 7811 } 7812 virtual __node* base_name() const 7813 { 7814 return __left_->base_name(); 7815 } 7816 virtual bool is_reference_or_pointer_to_function_or_array() const 7817 { 7818 return __left_->is_function(); 7819 } 7820 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7821 { 7822 return __left_->fix_forward_references(t_begin, t_end); 7823 } 7824 virtual size_t list_len() const 7825 { 7826 return __left_->list_len(); 7827 } 7828 }; 7829 7830 class __d_complex 7831 : public __node 7832 { 7833 static const size_t n = sizeof(" complex") - 1; 7834 public: 7835 7836 explicit __d_complex(__node* type) 7837 { 7838 __left_ = type; 7839 } 7840 virtual size_t first_size() const 7841 { 7842 if (__cached_size_ == -1) 7843 const_cast<long&>(__cached_size_) = n + __left_->size(); 7844 return __cached_size_; 7845 } 7846 virtual char* first_demangled_name(char* buf) const 7847 { 7848 buf = __left_->get_demangled_name(buf); 7849 strncpy(buf, " complex", n); 7850 return buf + n; 7851 } 7852 virtual ptrdiff_t print_first(char* f, char* l) const 7853 { 7854 const ptrdiff_t r = l - f; 7855 const ptrdiff_t sz = __left_->print(f, l); 7856 const ptrdiff_t n = sizeof(" complex") - 1; 7857 if (r >= sz + n) 7858 { 7859 f += sz; 7860 *f++ = ' '; 7861 *f++ = 'c'; 7862 *f++ = 'o'; 7863 *f++ = 'm'; 7864 *f++ = 'p'; 7865 *f++ = 'l'; 7866 *f++ = 'e'; 7867 *f = 'x'; 7868 } 7869 return sz + n; 7870 } 7871 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7872 { 7873 return __left_->fix_forward_references(t_begin, t_end); 7874 } 7875 }; 7876 7877 class __imaginary 7878 : public __node 7879 { 7880 static const size_t n = sizeof(" imaginary") - 1; 7881 public: 7882 7883 explicit __imaginary(__node* type) 7884 { 7885 __left_ = type; 7886 } 7887 virtual size_t first_size() const 7888 { 7889 if (__cached_size_ == -1) 7890 const_cast<long&>(__cached_size_) = n + __left_->size(); 7891 return __cached_size_; 7892 } 7893 virtual char* first_demangled_name(char* buf) const 7894 { 7895 buf = __left_->get_demangled_name(buf); 7896 strncpy(buf, " imaginary", n); 7897 return buf + n; 7898 } 7899 virtual ptrdiff_t print_first(char* f, char* l) const 7900 { 7901 const ptrdiff_t r = l - f; 7902 const ptrdiff_t sz = __left_->print(f, l); 7903 const ptrdiff_t n = sizeof(" imaginary") - 1; 7904 if (r >= sz + n) 7905 { 7906 f += sz; 7907 *f++ = ' '; 7908 *f++ = 'i'; 7909 *f++ = 'm'; 7910 *f++ = 'a'; 7911 *f++ = 'g'; 7912 *f++ = 'i'; 7913 *f++ = 'n'; 7914 *f++ = 'a'; 7915 *f++ = 'r'; 7916 *f = 'y'; 7917 } 7918 return sz + n; 7919 } 7920 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 7921 { 7922 return __left_->fix_forward_references(t_begin, t_end); 7923 } 7924 }; 7925 7926 class __pack_expansion 7927 : public __node 7928 { 7929 public: 7930 7931 explicit __pack_expansion(__node* type) 7932 { 7933 __left_ = type; 7934 } 7935 virtual size_t first_size() const 7936 { 7937 if (__cached_size_ == -1) 7938 { 7939 size_t len = __left_->list_len(); 7940 size_t off = 0; 7941 if (len != 0) 7942 { 7943 if (__left_->is_sub() || len == 1) 7944 off = __left_->size(); 7945 else 7946 { 7947 __node* top = __left_; 7948 __node* bottom = top; 7949 while (!bottom->__left_->is_sub()) 7950 bottom = bottom->__left_; 7951 __node* sub = bottom->__left_; 7952 __node* i = sub->__left_; 7953 bool first = true; 7954 top->reset_cached_size(); 7955 while (i) 7956 { 7957 if (!first) 7958 off += 2; 7959 bottom->__left_ = i->__left_; 7960 off += top->size(); 7961 top->reset_cached_size(); 7962 i = i->__right_; 7963 first = false; 7964 } 7965 bottom->__left_ = sub; 7966 } 7967 } 7968 const_cast<long&>(__cached_size_) = off; 7969 } 7970 return __cached_size_; 7971 } 7972 virtual char* first_demangled_name(char* buf) const 7973 { 7974 size_t len = __left_->list_len(); 7975 if (len != 0) 7976 { 7977 if (__left_->is_sub() || len == 1) 7978 buf = __left_->get_demangled_name(buf); 7979 else 7980 { 7981 __node* top = __left_; 7982 __node* bottom = top; 7983 while (!bottom->__left_->is_sub()) 7984 bottom = bottom->__left_; 7985 __node* sub = bottom->__left_; 7986 __node* i = sub->__left_; 7987 bool first = true; 7988 top->reset_cached_size(); 7989 while (i) 7990 { 7991 if (!first) 7992 { 7993 *buf++ = ','; 7994 *buf++ = ' '; 7995 } 7996 bottom->__left_ = i->__left_; 7997 buf = top->get_demangled_name(buf); 7998 top->reset_cached_size(); 7999 i = i->__right_; 8000 first = false; 8001 } 8002 bottom->__left_ = sub; 8003 } 8004 } 8005 return buf; 8006 } 8007 virtual ptrdiff_t print_first(char* f, char* l) const 8008 { 8009 const ptrdiff_t r = l - f; 8010 const ptrdiff_t len = __left_->list_len(); 8011 ptrdiff_t sz = 0; 8012 if (len != 0) 8013 { 8014 if (__left_->is_sub() || len == 1) 8015 sz = __left_->print(f, l); 8016 else 8017 { 8018 __node* top = __left_; 8019 __node* bottom = top; 8020 while (!bottom->__left_->is_sub()) 8021 bottom = bottom->__left_; 8022 __node* sub = bottom->__left_; 8023 __node* i = sub->__left_; 8024 bool first = true; 8025 while (i) 8026 { 8027 if (!first) 8028 { 8029 if (r >= sz+2) 8030 { 8031 f[sz] = ','; 8032 f[sz+1] = ' '; 8033 } 8034 sz += 2; 8035 } 8036 bottom->__left_ = i->__left_; 8037 sz += top->print(f+std::min(sz, r), l); 8038 i = i->__right_; 8039 first = false; 8040 } 8041 bottom->__left_ = sub; 8042 } 8043 } 8044 return sz; 8045 } 8046 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 8047 { 8048 return __left_->fix_forward_references(t_begin, t_end); 8049 } 8050 }; 8051 8052 class __void 8053 : public __node 8054 { 8055 static const size_t n = sizeof("void") - 1; 8056 public: 8057 8058 virtual size_t first_size() const {return n;} 8059 virtual char* first_demangled_name(char* buf) const 8060 { 8061 strncpy(buf, "void", n); 8062 return buf + n; 8063 } 8064 virtual ptrdiff_t print_first(char* f, char* l) const 8065 { 8066 const ptrdiff_t r = l - f; 8067 if (r >= n) 8068 { 8069 *f++ = 'v'; 8070 *f++ = 'o'; 8071 *f++ = 'i'; 8072 *f = 'd'; 8073 } 8074 return n; 8075 } 8076 }; 8077 8078 class __wchar_t 8079 : public __node 8080 { 8081 static const size_t n = sizeof("wchar_t") - 1; 8082 public: 8083 8084 virtual size_t first_size() const {return n;} 8085 virtual char* first_demangled_name(char* buf) const 8086 { 8087 strncpy(buf, "wchar_t", n); 8088 return buf + n; 8089 } 8090 virtual ptrdiff_t print_first(char* f, char* l) const 8091 { 8092 const ptrdiff_t r = l - f; 8093 if (r >= n) 8094 { 8095 *f++ = 'w'; 8096 *f++ = 'c'; 8097 *f++ = 'h'; 8098 *f++ = 'a'; 8099 *f++ = 'r'; 8100 *f++ = '_'; 8101 *f = 't'; 8102 } 8103 return n; 8104 } 8105 }; 8106 8107 class __wchar_t_literal 8108 : public __node 8109 { 8110 public: 8111 explicit __wchar_t_literal(const char* __first, const char* __last) 8112 { 8113 __name_ = __first; 8114 __size_ = __last - __first; 8115 } 8116 8117 virtual size_t first_size() const 8118 { 8119 return __size_+9; 8120 } 8121 virtual char* first_demangled_name(char* buf) const 8122 { 8123 strncpy(buf, "(wchar_t)", 9); 8124 buf += 9; 8125 strncpy(buf, __name_, __size_); 8126 return buf + __size_; 8127 } 8128 virtual ptrdiff_t print_first(char* f, char* l) const 8129 { 8130 const ptrdiff_t r = l - f; 8131 const ptrdiff_t n = sizeof("(wchar_t)") - 1; 8132 if (r >= n + __size_) 8133 { 8134 *f++ = '('; 8135 *f++ = 'w'; 8136 *f++ = 'c'; 8137 *f++ = 'h'; 8138 *f++ = 'a'; 8139 *f++ = 'r'; 8140 *f++ = '_'; 8141 *f++ = 't'; 8142 *f++ = ')'; 8143 strncpy(f, __name_, __size_); 8144 } 8145 return n + __size_; 8146 } 8147 }; 8148 8149 class __bool 8150 : public __node 8151 { 8152 static const size_t n = sizeof("bool") - 1; 8153 public: 8154 8155 virtual size_t first_size() const {return n;} 8156 virtual char* first_demangled_name(char* buf) const 8157 { 8158 strncpy(buf, "bool", n); 8159 return buf + n; 8160 } 8161 virtual ptrdiff_t print_first(char* f, char* l) const 8162 { 8163 const ptrdiff_t r = l - f; 8164 if (r >= n) 8165 { 8166 *f++ = 'b'; 8167 *f++ = 'o'; 8168 *f++ = 'o'; 8169 *f = 'l'; 8170 } 8171 return n; 8172 } 8173 }; 8174 8175 class __bool_literal 8176 : public __node 8177 { 8178 public: 8179 explicit __bool_literal(const char* __name, unsigned __size) 8180 { 8181 __name_ = __name; 8182 __size_ = __size; 8183 } 8184 8185 virtual size_t first_size() const 8186 { 8187 return __size_; 8188 } 8189 virtual char* first_demangled_name(char* buf) const 8190 { 8191 strncpy(buf, __name_, __size_); 8192 return buf + __size_; 8193 } 8194 virtual ptrdiff_t print_first(char* f, char* l) const 8195 { 8196 const ptrdiff_t r = l - f; 8197 if (r >= __size_) 8198 strncpy(f, __name_, __size_); 8199 return __size_; 8200 } 8201 }; 8202 8203 class __char 8204 : public __node 8205 { 8206 static const size_t n = sizeof("char") - 1; 8207 public: 8208 8209 virtual size_t first_size() const {return n;} 8210 virtual char* first_demangled_name(char* buf) const 8211 { 8212 strncpy(buf, "char", n); 8213 return buf + n; 8214 } 8215 virtual ptrdiff_t print_first(char* f, char* l) const 8216 { 8217 const ptrdiff_t r = l - f; 8218 if (r >= n) 8219 { 8220 *f++ = 'c'; 8221 *f++ = 'h'; 8222 *f++ = 'a'; 8223 *f = 'r'; 8224 } 8225 return n; 8226 } 8227 }; 8228 8229 class __char_literal 8230 : public __node 8231 { 8232 public: 8233 explicit __char_literal(const char* __first, const char* __last) 8234 { 8235 __name_ = __first; 8236 __size_ = __last - __first; 8237 } 8238 8239 virtual size_t first_size() const 8240 { 8241 return __size_+6; 8242 } 8243 virtual char* first_demangled_name(char* buf) const 8244 { 8245 strncpy(buf, "(char)", 6); 8246 buf += 6; 8247 if (*__name_ == 'n') 8248 { 8249 *buf++ = '-'; // strncpy(buf+6, "-", 1); 8250 strncpy(buf, __name_+1, __size_-1); 8251 buf += __size_ - 1; 8252 } 8253 else 8254 { 8255 strncpy(buf, __name_, __size_); 8256 buf += __size_; 8257 } 8258 return buf; 8259 } 8260 virtual ptrdiff_t print_first(char* f, char* l) const 8261 { 8262 const ptrdiff_t r = l - f; 8263 const ptrdiff_t n = sizeof("(char)") - 1; 8264 if (r >= __size_ + n) 8265 { 8266 *f++ = '('; 8267 *f++ = 'c'; 8268 *f++ = 'h'; 8269 *f++ = 'a'; 8270 *f++ = 'r'; 8271 *f++ = ')'; 8272 if (*__name_ == 'n') 8273 { 8274 *f++ = '-'; 8275 strncpy(f, __name_+1, __size_-1); 8276 } 8277 else 8278 strncpy(f, __name_, __size_); 8279 } 8280 return __size_ + n; 8281 } 8282 }; 8283 8284 class __signed_char 8285 : public __node 8286 { 8287 static const size_t n = sizeof("signed char") - 1; 8288 public: 8289 8290 virtual size_t first_size() const {return n;} 8291 virtual char* first_demangled_name(char* buf) const 8292 { 8293 strncpy(buf, "signed char", n); 8294 return buf + n; 8295 } 8296 virtual ptrdiff_t print_first(char* f, char* l) const 8297 { 8298 const ptrdiff_t r = l - f; 8299 if (r >= n) 8300 { 8301 *f++ = 's'; 8302 *f++ = 'i'; 8303 *f++ = 'g'; 8304 *f++ = 'n'; 8305 *f++ = 'e'; 8306 *f++ = 'd'; 8307 *f++ = ' '; 8308 *f++ = 'c'; 8309 *f++ = 'h'; 8310 *f++ = 'a'; 8311 *f = 'r'; 8312 } 8313 return n; 8314 } 8315 }; 8316 8317 class __signed_char_literal 8318 : public __node 8319 { 8320 public: 8321 explicit __signed_char_literal(const char* __first, const char* __last) 8322 { 8323 __name_ = __first; 8324 __size_ = __last - __first; 8325 } 8326 8327 virtual size_t first_size() const 8328 { 8329 return __size_+13; 8330 } 8331 virtual char* first_demangled_name(char* buf) const 8332 { 8333 strncpy(buf, "(signed char)", 13); 8334 buf += 13; 8335 if (*__name_ == 'n') 8336 { 8337 *buf++ = '-'; 8338 strncpy(buf, __name_+1, __size_-1); 8339 buf += __size_ - 1; 8340 } 8341 else 8342 { 8343 strncpy(buf, __name_, __size_); 8344 buf += __size_; 8345 } 8346 return buf; 8347 } 8348 virtual ptrdiff_t print_first(char* f, char* l) const 8349 { 8350 const ptrdiff_t r = l - f; 8351 const ptrdiff_t n = sizeof("(signed char)") - 1; 8352 if (r >= __size_ + n) 8353 { 8354 *f++ = '('; 8355 *f++ = 's'; 8356 *f++ = 'i'; 8357 *f++ = 'g'; 8358 *f++ = 'n'; 8359 *f++ = 'e'; 8360 *f++ = 'd'; 8361 *f++ = ' '; 8362 *f++ = 'c'; 8363 *f++ = 'h'; 8364 *f++ = 'a'; 8365 *f++ = 'r'; 8366 *f++ = ')'; 8367 if (*__name_ == 'n') 8368 { 8369 *f++ = '-'; 8370 strncpy(f, __name_+1, __size_-1); 8371 } 8372 else 8373 strncpy(f, __name_, __size_); 8374 } 8375 return __size_ + n; 8376 } 8377 }; 8378 8379 class __unsigned_char 8380 : public __node 8381 { 8382 static const size_t n = sizeof("unsigned char") - 1; 8383 public: 8384 8385 virtual size_t first_size() const {return n;} 8386 virtual char* first_demangled_name(char* buf) const 8387 { 8388 strncpy(buf, "unsigned char", n); 8389 return buf + n; 8390 } 8391 virtual ptrdiff_t print_first(char* f, char* l) const 8392 { 8393 const ptrdiff_t r = l - f; 8394 if (r >= n) 8395 { 8396 *f++ = 'u'; 8397 *f++ = 'n'; 8398 *f++ = 's'; 8399 *f++ = 'i'; 8400 *f++ = 'g'; 8401 *f++ = 'n'; 8402 *f++ = 'e'; 8403 *f++ = 'd'; 8404 *f++ = ' '; 8405 *f++ = 'c'; 8406 *f++ = 'h'; 8407 *f++ = 'a'; 8408 *f = 'r'; 8409 } 8410 return n; 8411 } 8412 }; 8413 8414 class __unsigned_char_literal 8415 : public __node 8416 { 8417 public: 8418 explicit __unsigned_char_literal(const char* __first, const char* __last) 8419 { 8420 __name_ = __first; 8421 __size_ = __last - __first; 8422 } 8423 8424 virtual size_t first_size() const 8425 { 8426 return __size_+15; 8427 } 8428 virtual char* first_demangled_name(char* buf) const 8429 { 8430 strncpy(buf, "(unsigned char)", 15); 8431 buf += 15; 8432 strncpy(buf, __name_, __size_); 8433 return buf + __size_; 8434 } 8435 virtual ptrdiff_t print_first(char* f, char* l) const 8436 { 8437 const ptrdiff_t r = l - f; 8438 const ptrdiff_t n = sizeof("(unsigned char)") - 1; 8439 if (r >= __size_ + n) 8440 { 8441 *f++ = '('; 8442 *f++ = 'u'; 8443 *f++ = 'n'; 8444 *f++ = 's'; 8445 *f++ = 'i'; 8446 *f++ = 'g'; 8447 *f++ = 'n'; 8448 *f++ = 'e'; 8449 *f++ = 'd'; 8450 *f++ = ' '; 8451 *f++ = 'c'; 8452 *f++ = 'h'; 8453 *f++ = 'a'; 8454 *f++ = 'r'; 8455 *f++ = ')'; 8456 strncpy(f, __name_, __size_); 8457 } 8458 return __size_ + n; 8459 } 8460 }; 8461 8462 class __short 8463 : public __node 8464 { 8465 static const size_t n = sizeof("short") - 1; 8466 public: 8467 8468 virtual size_t first_size() const {return n;} 8469 virtual char* first_demangled_name(char* buf) const 8470 { 8471 strncpy(buf, "short", n); 8472 return buf + n; 8473 } 8474 virtual ptrdiff_t print_first(char* f, char* l) const 8475 { 8476 const ptrdiff_t r = l - f; 8477 if (r >= n) 8478 { 8479 *f++ = 's'; 8480 *f++ = 'h'; 8481 *f++ = 'o'; 8482 *f++ = 'r'; 8483 *f = 't'; 8484 } 8485 return n; 8486 } 8487 }; 8488 8489 class __short_literal 8490 : public __node 8491 { 8492 public: 8493 explicit __short_literal(const char* __first, const char* __last) 8494 { 8495 __name_ = __first; 8496 __size_ = __last - __first; 8497 } 8498 8499 virtual size_t first_size() const 8500 { 8501 return __size_+7; 8502 } 8503 virtual char* first_demangled_name(char* buf) const 8504 { 8505 strncpy(buf, "(short)", 7); 8506 buf += 7; 8507 if (*__name_ == 'n') 8508 { 8509 *buf++ = '-'; 8510 strncpy(buf, __name_+1, __size_-1); 8511 buf += __size_ - 1; 8512 } 8513 else 8514 { 8515 strncpy(buf, __name_, __size_); 8516 buf += __size_; 8517 } 8518 return buf; 8519 } 8520 virtual ptrdiff_t print_first(char* f, char* l) const 8521 { 8522 const ptrdiff_t r = l - f; 8523 const ptrdiff_t n = sizeof("(short)") - 1; 8524 if (r >= __size_ + n) 8525 { 8526 *f++ = '('; 8527 *f++ = 's'; 8528 *f++ = 'h'; 8529 *f++ = 'o'; 8530 *f++ = 'r'; 8531 *f++ = 't'; 8532 *f++ = ')'; 8533 if (*__name_ == 'n') 8534 { 8535 *f++ = '-'; 8536 strncpy(f, __name_+1, __size_-1); 8537 } 8538 else 8539 strncpy(f, __name_, __size_); 8540 } 8541 return __size_ + n; 8542 } 8543 }; 8544 8545 class __unsigned_short 8546 : public __node 8547 { 8548 static const size_t n = sizeof("unsigned short") - 1; 8549 public: 8550 8551 virtual size_t first_size() const {return n;} 8552 virtual char* first_demangled_name(char* buf) const 8553 { 8554 strncpy(buf, "unsigned short", n); 8555 return buf + n; 8556 } 8557 virtual ptrdiff_t print_first(char* f, char* l) const 8558 { 8559 const ptrdiff_t r = l - f; 8560 if (r >= n) 8561 { 8562 *f++ = 'u'; 8563 *f++ = 'n'; 8564 *f++ = 's'; 8565 *f++ = 'i'; 8566 *f++ = 'g'; 8567 *f++ = 'n'; 8568 *f++ = 'e'; 8569 *f++ = 'd'; 8570 *f++ = ' '; 8571 *f++ = 's'; 8572 *f++ = 'h'; 8573 *f++ = 'o'; 8574 *f++ = 'r'; 8575 *f = 't'; 8576 } 8577 return n; 8578 } 8579 }; 8580 8581 class __unsigned_short_literal 8582 : public __node 8583 { 8584 public: 8585 explicit __unsigned_short_literal(const char* __first, const char* __last) 8586 { 8587 __name_ = __first; 8588 __size_ = __last - __first; 8589 } 8590 8591 virtual size_t first_size() const 8592 { 8593 return __size_+16; 8594 } 8595 virtual char* first_demangled_name(char* buf) const 8596 { 8597 strncpy(buf, "(unsigned short)", 16); 8598 buf += 16; 8599 strncpy(buf, __name_, __size_); 8600 return buf + __size_; 8601 } 8602 virtual ptrdiff_t print_first(char* f, char* l) const 8603 { 8604 const ptrdiff_t r = l - f; 8605 const ptrdiff_t n = sizeof("(unsigned short)") - 1; 8606 if (r >= __size_ + n) 8607 { 8608 *f++ = '('; 8609 *f++ = 'u'; 8610 *f++ = 'n'; 8611 *f++ = 's'; 8612 *f++ = 'i'; 8613 *f++ = 'g'; 8614 *f++ = 'n'; 8615 *f++ = 'e'; 8616 *f++ = 'd'; 8617 *f++ = ' '; 8618 *f++ = 's'; 8619 *f++ = 'h'; 8620 *f++ = 'o'; 8621 *f++ = 'r'; 8622 *f++ = 't'; 8623 *f++ = ')'; 8624 strncpy(f, __name_, __size_); 8625 } 8626 return __size_ + n; 8627 } 8628 }; 8629 8630 class __int 8631 : public __node 8632 { 8633 static const size_t n = sizeof("int") - 1; 8634 public: 8635 8636 virtual size_t first_size() const {return n;} 8637 virtual char* first_demangled_name(char* buf) const 8638 { 8639 *buf++ = 'i'; 8640 *buf++ = 'n'; 8641 *buf++ = 't'; 8642 return buf; 8643 } 8644 virtual ptrdiff_t print_first(char* f, char* l) const 8645 { 8646 const ptrdiff_t r = l - f; 8647 if (r >= n) 8648 { 8649 *f++ = 'i'; 8650 *f++ = 'n'; 8651 *f = 't'; 8652 } 8653 return n; 8654 } 8655 }; 8656 8657 class __int_literal 8658 : public __node 8659 { 8660 public: 8661 explicit __int_literal(const char* __first, const char* __last) 8662 { 8663 __name_ = __first; 8664 __size_ = __last - __first; 8665 } 8666 8667 virtual size_t first_size() const 8668 { 8669 return __size_; 8670 } 8671 virtual char* first_demangled_name(char* buf) const 8672 { 8673 if (*__name_ == 'n') 8674 { 8675 *buf++ = '-'; 8676 strncpy(buf, __name_+1, __size_-1); 8677 buf += __size_ - 1; 8678 } 8679 else 8680 { 8681 strncpy(buf, __name_, __size_); 8682 buf += __size_; 8683 } 8684 return buf; 8685 } 8686 virtual ptrdiff_t print_first(char* f, char* l) const 8687 { 8688 const ptrdiff_t r = l - f; 8689 if (r >= __size_) 8690 { 8691 if (*__name_ == 'n') 8692 { 8693 *f++ = '-'; 8694 strncpy(f, __name_+1, __size_-1); 8695 } 8696 else 8697 strncpy(f, __name_, __size_); 8698 } 8699 return __size_; 8700 } 8701 }; 8702 8703 class __unsigned_int 8704 : public __node 8705 { 8706 static const size_t n = sizeof("unsigned int") - 1; 8707 public: 8708 8709 virtual size_t first_size() const {return n;} 8710 virtual char* first_demangled_name(char* buf) const 8711 { 8712 strncpy(buf, "unsigned int", n); 8713 return buf + n; 8714 } 8715 virtual ptrdiff_t print_first(char* f, char* l) const 8716 { 8717 const ptrdiff_t r = l - f; 8718 if (r >= n) 8719 { 8720 *f++ = 'u'; 8721 *f++ = 'n'; 8722 *f++ = 's'; 8723 *f++ = 'i'; 8724 *f++ = 'g'; 8725 *f++ = 'n'; 8726 *f++ = 'e'; 8727 *f++ = 'd'; 8728 *f++ = ' '; 8729 *f++ = 'i'; 8730 *f++ = 'n'; 8731 *f = 't'; 8732 } 8733 return n; 8734 } 8735 }; 8736 8737 class __unsigned_int_literal 8738 : public __node 8739 { 8740 public: 8741 explicit __unsigned_int_literal(const char* __first, const char* __last) 8742 { 8743 __name_ = __first; 8744 __size_ = __last - __first; 8745 } 8746 8747 virtual size_t first_size() const 8748 { 8749 return __size_+1; 8750 } 8751 virtual char* first_demangled_name(char* buf) const 8752 { 8753 strncpy(buf, __name_, __size_); 8754 buf += __size_; 8755 *buf++ = 'u'; 8756 return buf; 8757 } 8758 virtual ptrdiff_t print_first(char* f, char* l) const 8759 { 8760 const ptrdiff_t r = l - f; 8761 const ptrdiff_t n = sizeof("u") - 1; 8762 if (r >= __size_ + n) 8763 { 8764 strncpy(f, __name_, __size_); 8765 f[__size_] = 'u'; 8766 } 8767 return __size_ + n; 8768 } 8769 }; 8770 8771 class __long 8772 : public __node 8773 { 8774 static const size_t n = sizeof("long") - 1; 8775 public: 8776 8777 virtual size_t first_size() const {return n;} 8778 virtual char* first_demangled_name(char* buf) const 8779 { 8780 strncpy(buf, "long", n); 8781 return buf + n; 8782 } 8783 virtual ptrdiff_t print_first(char* f, char* l) const 8784 { 8785 const ptrdiff_t r = l - f; 8786 if (r >= n) 8787 { 8788 *f++ = 'l'; 8789 *f++ = 'o'; 8790 *f++ = 'n'; 8791 *f = 'g'; 8792 } 8793 return n; 8794 } 8795 }; 8796 8797 class __long_literal 8798 : public __node 8799 { 8800 public: 8801 explicit __long_literal(const char* __first, const char* __last) 8802 { 8803 __name_ = __first; 8804 __size_ = __last - __first; 8805 } 8806 8807 virtual size_t first_size() const 8808 { 8809 return __size_+1; 8810 } 8811 virtual char* first_demangled_name(char* buf) const 8812 { 8813 if (*__name_ == 'n') 8814 { 8815 *buf++ = '-'; // strncpy(buf, "-", 1); 8816 strncpy(buf, __name_+1, __size_-1); 8817 buf += __size_ - 1; 8818 } 8819 else 8820 { 8821 strncpy(buf, __name_, __size_); 8822 buf += __size_; 8823 } 8824 *buf++ = 'l'; 8825 return buf; 8826 } 8827 virtual ptrdiff_t print_first(char* f, char* l) const 8828 { 8829 const ptrdiff_t r = l - f; 8830 const ptrdiff_t n = sizeof("l") - 1; 8831 if (r >= __size_ + n) 8832 { 8833 if (*__name_ == 'n') 8834 { 8835 *f++ = '-'; 8836 strncpy(f, __name_+1, __size_-1); 8837 f += __size_-1; 8838 } 8839 else 8840 { 8841 strncpy(f, __name_, __size_); 8842 f += __size_; 8843 } 8844 *f = 'l'; 8845 } 8846 return __size_ + n; 8847 } 8848 }; 8849 8850 class __unsigned_long 8851 : public __node 8852 { 8853 static const size_t n = sizeof("unsigned long") - 1; 8854 public: 8855 8856 virtual size_t first_size() const {return n;} 8857 virtual char* first_demangled_name(char* buf) const 8858 { 8859 strncpy(buf, "unsigned long", n); 8860 return buf + n; 8861 } 8862 virtual ptrdiff_t print_first(char* f, char* l) const 8863 { 8864 const ptrdiff_t r = l - f; 8865 if (r >= n) 8866 { 8867 *f++ = 'u'; 8868 *f++ = 'n'; 8869 *f++ = 's'; 8870 *f++ = 'i'; 8871 *f++ = 'g'; 8872 *f++ = 'n'; 8873 *f++ = 'e'; 8874 *f++ = 'd'; 8875 *f++ = ' '; 8876 *f++ = 'l'; 8877 *f++ = 'o'; 8878 *f++ = 'n'; 8879 *f = 'g'; 8880 } 8881 return n; 8882 } 8883 }; 8884 8885 class __unsigned_long_literal 8886 : public __node 8887 { 8888 public: 8889 explicit __unsigned_long_literal(const char* __first, const char* __last) 8890 { 8891 __name_ = __first; 8892 __size_ = __last - __first; 8893 } 8894 8895 virtual size_t first_size() const 8896 { 8897 return __size_+2; 8898 } 8899 virtual char* first_demangled_name(char* buf) const 8900 { 8901 strncpy(buf, __name_, __size_); 8902 buf += __size_; 8903 *buf++ = 'u'; 8904 *buf++ = 'l'; 8905 return buf; 8906 } 8907 virtual ptrdiff_t print_first(char* f, char* l) const 8908 { 8909 const ptrdiff_t r = l - f; 8910 const ptrdiff_t n = sizeof("ul") - 1; 8911 if (r >= __size_ + n) 8912 { 8913 strncpy(f, __name_, __size_); 8914 f += __size_; 8915 *f++ = 'u'; 8916 *f = 'l'; 8917 } 8918 return __size_ + n; 8919 } 8920 }; 8921 8922 class __long_long 8923 : public __node 8924 { 8925 static const size_t n = sizeof("long long") - 1; 8926 public: 8927 8928 virtual size_t first_size() const {return n;} 8929 virtual char* first_demangled_name(char* buf) const 8930 { 8931 strncpy(buf, "long long", n); 8932 return buf + n; 8933 } 8934 virtual ptrdiff_t print_first(char* f, char* l) const 8935 { 8936 const ptrdiff_t r = l - f; 8937 if (r >= n) 8938 { 8939 *f++ = 'l'; 8940 *f++ = 'o'; 8941 *f++ = 'n'; 8942 *f++ = 'g'; 8943 *f++ = ' '; 8944 *f++ = 'l'; 8945 *f++ = 'o'; 8946 *f++ = 'n'; 8947 *f = 'g'; 8948 } 8949 return n; 8950 } 8951 }; 8952 8953 class __long_long_literal 8954 : public __node 8955 { 8956 public: 8957 explicit __long_long_literal(const char* __first, const char* __last) 8958 { 8959 __name_ = __first; 8960 __size_ = __last - __first; 8961 } 8962 8963 virtual size_t first_size() const 8964 { 8965 return __size_+2; 8966 } 8967 virtual char* first_demangled_name(char* buf) const 8968 { 8969 if (*__name_ == 'n') 8970 { 8971 *buf++ = '-'; 8972 strncpy(buf, __name_+1, __size_-1); 8973 buf += __size_ - 1; 8974 } 8975 else 8976 { 8977 strncpy(buf, __name_, __size_); 8978 buf += __size_; 8979 } 8980 *buf++ = 'l'; 8981 *buf++ = 'l'; 8982 return buf; 8983 } 8984 virtual ptrdiff_t print_first(char* f, char* l) const 8985 { 8986 const ptrdiff_t r = l - f; 8987 const ptrdiff_t n = sizeof("ll") - 1; 8988 if (r >= __size_ + n) 8989 { 8990 if (*__name_ == 'n') 8991 { 8992 *f++ = '-'; 8993 strncpy(f, __name_+1, __size_-1); 8994 f += __size_-1; 8995 } 8996 else 8997 { 8998 strncpy(f, __name_, __size_); 8999 f += __size_; 9000 } 9001 *f++ = 'l'; 9002 *f = 'l'; 9003 } 9004 return __size_ + n; 9005 } 9006 }; 9007 9008 class __unsigned_long_long 9009 : public __node 9010 { 9011 static const size_t n = sizeof("unsigned long long") - 1; 9012 public: 9013 9014 virtual size_t first_size() const {return n;} 9015 virtual char* first_demangled_name(char* buf) const 9016 { 9017 strncpy(buf, "unsigned long long", n); 9018 return buf + n; 9019 } 9020 virtual ptrdiff_t print_first(char* f, char* l) const 9021 { 9022 const ptrdiff_t r = l - f; 9023 if (r >= n) 9024 { 9025 *f++ = 'u'; 9026 *f++ = 'n'; 9027 *f++ = 's'; 9028 *f++ = 'i'; 9029 *f++ = 'g'; 9030 *f++ = 'n'; 9031 *f++ = 'e'; 9032 *f++ = 'd'; 9033 *f++ = ' '; 9034 *f++ = 'l'; 9035 *f++ = 'o'; 9036 *f++ = 'n'; 9037 *f++ = 'g'; 9038 *f++ = ' '; 9039 *f++ = 'l'; 9040 *f++ = 'o'; 9041 *f++ = 'n'; 9042 *f = 'g'; 9043 } 9044 return n; 9045 } 9046 }; 9047 9048 class __unsigned_long_long_literal 9049 : public __node 9050 { 9051 public: 9052 explicit __unsigned_long_long_literal(const char* __first, const char* __last) 9053 { 9054 __name_ = __first; 9055 __size_ = __last - __first; 9056 } 9057 9058 virtual size_t first_size() const 9059 { 9060 return __size_+3; 9061 } 9062 virtual char* first_demangled_name(char* buf) const 9063 { 9064 strncpy(buf, __name_, __size_); 9065 buf += __size_; 9066 *buf++ = 'u'; 9067 *buf++ = 'l'; 9068 *buf++ = 'l'; 9069 return buf; 9070 } 9071 virtual ptrdiff_t print_first(char* f, char* l) const 9072 { 9073 const ptrdiff_t r = l - f; 9074 const ptrdiff_t n = sizeof("ull") - 1; 9075 if (r >= __size_ + n) 9076 { 9077 strncpy(f, __name_, __size_); 9078 f += __size_; 9079 *f++ = 'u'; 9080 *f++ = 'l'; 9081 *f = 'l'; 9082 } 9083 return __size_ + n; 9084 } 9085 }; 9086 9087 class __int128 9088 : public __node 9089 { 9090 static const size_t n = sizeof("__int128") - 1; 9091 public: 9092 9093 virtual size_t first_size() const {return n;} 9094 virtual char* first_demangled_name(char* buf) const 9095 { 9096 strncpy(buf, "__int128", n); 9097 return buf + n; 9098 } 9099 virtual ptrdiff_t print_first(char* f, char* l) const 9100 { 9101 const ptrdiff_t r = l - f; 9102 if (r >= n) 9103 { 9104 *f++ = '_'; 9105 *f++ = '_'; 9106 *f++ = 'i'; 9107 *f++ = 'n'; 9108 *f++ = 't'; 9109 *f++ = '1'; 9110 *f++ = '2'; 9111 *f = '8'; 9112 } 9113 return n; 9114 } 9115 }; 9116 9117 class __int128_literal 9118 : public __node 9119 { 9120 public: 9121 explicit __int128_literal(const char* __first, const char* __last) 9122 { 9123 __name_ = __first; 9124 __size_ = __last - __first; 9125 } 9126 9127 virtual size_t first_size() const 9128 { 9129 return __size_+10; 9130 } 9131 virtual char* first_demangled_name(char* buf) const 9132 { 9133 strncpy(buf, "(__int128)", 10); 9134 buf += 10; 9135 if (*__name_ == 'n') 9136 { 9137 *buf++ = '-'; 9138 strncpy(buf, __name_+1, __size_-1); 9139 buf += __size_ - 1; 9140 } 9141 else 9142 { 9143 strncpy(buf, __name_, __size_); 9144 buf += __size_; 9145 } 9146 return buf; 9147 } 9148 virtual ptrdiff_t print_first(char* f, char* l) const 9149 { 9150 const ptrdiff_t r = l - f; 9151 const ptrdiff_t n = sizeof("(__int128)") - 1; 9152 if (r >= __size_ + n) 9153 { 9154 *f++ = '('; 9155 *f++ = '_'; 9156 *f++ = '_'; 9157 *f++ = 'i'; 9158 *f++ = 'n'; 9159 *f++ = 't'; 9160 *f++ = '1'; 9161 *f++ = '2'; 9162 *f++ = '8'; 9163 *f = ')'; 9164 if (*__name_ == 'n') 9165 { 9166 *f++ = '-'; 9167 strncpy(f, __name_+1, __size_-1); 9168 } 9169 else 9170 strncpy(f, __name_, __size_); 9171 } 9172 return __size_ + n; 9173 } 9174 }; 9175 9176 class __unsigned_int128 9177 : public __node 9178 { 9179 static const size_t n = sizeof("unsigned __int128") - 1; 9180 public: 9181 9182 virtual size_t first_size() const {return n;} 9183 virtual char* first_demangled_name(char* buf) const 9184 { 9185 strncpy(buf, "unsigned __int128", n); 9186 return buf + n; 9187 } 9188 virtual ptrdiff_t print_first(char* f, char* l) const 9189 { 9190 const ptrdiff_t r = l - f; 9191 if (r >= n) 9192 { 9193 *f++ = 'u'; 9194 *f++ = 'n'; 9195 *f++ = 's'; 9196 *f++ = 'i'; 9197 *f++ = 'g'; 9198 *f++ = 'n'; 9199 *f++ = 'e'; 9200 *f++ = 'd'; 9201 *f++ = ' '; 9202 *f++ = '_'; 9203 *f++ = '_'; 9204 *f++ = 'i'; 9205 *f++ = 'n'; 9206 *f++ = 't'; 9207 *f++ = '1'; 9208 *f++ = '2'; 9209 *f = '8'; 9210 } 9211 return n; 9212 } 9213 }; 9214 9215 class __unsigned_int128_literal 9216 : public __node 9217 { 9218 public: 9219 explicit __unsigned_int128_literal(const char* __first, const char* __last) 9220 { 9221 __name_ = __first; 9222 __size_ = __last - __first; 9223 } 9224 9225 virtual size_t first_size() const 9226 { 9227 return __size_+19; 9228 } 9229 virtual char* first_demangled_name(char* buf) const 9230 { 9231 strncpy(buf, "(unsigned __int128)", 19); 9232 buf += 19; 9233 strncpy(buf, __name_, __size_); 9234 return buf + __size_; 9235 } 9236 virtual ptrdiff_t print_first(char* f, char* l) const 9237 { 9238 const ptrdiff_t r = l - f; 9239 const ptrdiff_t n = sizeof("(unsigned __int128)") - 1; 9240 if (r >= __size_ + n) 9241 { 9242 *f++ = '('; 9243 *f++ = 'u'; 9244 *f++ = 'n'; 9245 *f++ = 's'; 9246 *f++ = 'i'; 9247 *f++ = 'g'; 9248 *f++ = 'n'; 9249 *f++ = 'e'; 9250 *f++ = 'd'; 9251 *f++ = ' '; 9252 *f++ = '_'; 9253 *f++ = '_'; 9254 *f++ = 'i'; 9255 *f++ = 'n'; 9256 *f++ = 't'; 9257 *f++ = '1'; 9258 *f++ = '2'; 9259 *f++ = '8'; 9260 *f = ')'; 9261 strncpy(f, __name_, __size_); 9262 } 9263 return __size_ + n; 9264 } 9265 }; 9266 9267 class __float_literal 9268 : public __node 9269 { 9270 public: 9271 explicit __float_literal(float value) 9272 { 9273 __value_ = value; 9274 } 9275 9276 virtual size_t first_size() const 9277 { 9278 if (__cached_size_ == -1) 9279 { 9280 char num[20] = {0}; 9281 float v = static_cast<float>(__value_); 9282 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v)+1; 9283 } 9284 return __cached_size_; 9285 } 9286 virtual char* first_demangled_name(char* buf) const 9287 { 9288 char num[20] = {0}; 9289 float v = static_cast<float>(__value_); 9290 int n = sprintf(num, "%a", v); 9291 strncpy(buf, num, n); 9292 buf += n; 9293 *buf++ = 'f'; 9294 return buf; 9295 } 9296 virtual ptrdiff_t print_first(char* f, char* l) const 9297 { 9298 const ptrdiff_t r = l - f; 9299 char num[20] = {0}; 9300 float v = static_cast<float>(__value_); 9301 ptrdiff_t n = sprintf(num, "%a", v); 9302 if (r >= n+1) 9303 { 9304 strncpy(f, num, n); 9305 f[n] = 'f'; 9306 } 9307 ++n; 9308 return n; 9309 } 9310 }; 9311 9312 class __float 9313 : public __node 9314 { 9315 static const size_t n = sizeof("float") - 1; 9316 public: 9317 9318 virtual size_t first_size() const {return n;} 9319 virtual char* first_demangled_name(char* buf) const 9320 { 9321 strncpy(buf, "float", n); 9322 return buf + n; 9323 } 9324 virtual ptrdiff_t print_first(char* f, char* l) const 9325 { 9326 const ptrdiff_t r = l - f; 9327 if (r >= n) 9328 { 9329 *f++ = 'f'; 9330 *f++ = 'l'; 9331 *f++ = 'o'; 9332 *f++ = 'a'; 9333 *f = 't'; 9334 } 9335 return n; 9336 } 9337 }; 9338 9339 class __double_literal 9340 : public __node 9341 { 9342 public: 9343 explicit __double_literal(double value) 9344 { 9345 __value_ = value; 9346 } 9347 9348 virtual size_t first_size() const 9349 { 9350 if (__cached_size_ == -1) 9351 { 9352 char num[30] = {0}; 9353 double v = static_cast<double>(__value_); 9354 const_cast<long&>(__cached_size_) = sprintf(num, "%a", v); 9355 } 9356 return __cached_size_; 9357 } 9358 virtual char* first_demangled_name(char* buf) const 9359 { 9360 char num[30] = {0}; 9361 double v = static_cast<double>(__value_); 9362 int n = sprintf(num, "%a", v); 9363 strncpy(buf, num, n); 9364 return buf + n; 9365 } 9366 virtual ptrdiff_t print_first(char* f, char* l) const 9367 { 9368 const ptrdiff_t r = l - f; 9369 char num[30] = {0}; 9370 double v = static_cast<double>(__value_); 9371 const ptrdiff_t n = sprintf(num, "%a", v); 9372 if (r >= n) 9373 strncpy(f, num, n); 9374 return n; 9375 } 9376 }; 9377 9378 class __double 9379 : public __node 9380 { 9381 static const size_t n = sizeof("double") - 1; 9382 public: 9383 9384 virtual size_t first_size() const {return n;} 9385 virtual char* first_demangled_name(char* buf) const 9386 { 9387 strncpy(buf, "double", n); 9388 return buf + n; 9389 } 9390 virtual ptrdiff_t print_first(char* f, char* l) const 9391 { 9392 const ptrdiff_t r = l - f; 9393 if (r >= n) 9394 { 9395 *f++ = 'd'; 9396 *f++ = 'o'; 9397 *f++ = 'u'; 9398 *f++ = 'b'; 9399 *f++ = 'l'; 9400 *f = 'e'; 9401 } 9402 return n; 9403 } 9404 }; 9405 9406 class __long_double 9407 : public __node 9408 { 9409 static const size_t n = sizeof("long double") - 1; 9410 public: 9411 9412 virtual size_t first_size() const {return n;} 9413 virtual char* first_demangled_name(char* buf) const 9414 { 9415 strncpy(buf, "long double", n); 9416 return buf + n; 9417 } 9418 virtual ptrdiff_t print_first(char* f, char* l) const 9419 { 9420 const ptrdiff_t r = l - f; 9421 if (r >= n) 9422 { 9423 *f++ = 'l'; 9424 *f++ = 'o'; 9425 *f++ = 'n'; 9426 *f++ = 'g'; 9427 *f++ = ' '; 9428 *f++ = 'd'; 9429 *f++ = 'o'; 9430 *f++ = 'u'; 9431 *f++ = 'b'; 9432 *f++ = 'l'; 9433 *f = 'e'; 9434 } 9435 return n; 9436 } 9437 }; 9438 9439 class __float128 9440 : public __node 9441 { 9442 static const size_t n = sizeof("__float128") - 1; 9443 public: 9444 9445 virtual size_t first_size() const {return n;} 9446 virtual char* first_demangled_name(char* buf) const 9447 { 9448 strncpy(buf, "__float128", n); 9449 return buf + n; 9450 } 9451 virtual ptrdiff_t print_first(char* f, char* l) const 9452 { 9453 const ptrdiff_t r = l - f; 9454 if (r >= n) 9455 { 9456 *f++ = '_'; 9457 *f++ = '_'; 9458 *f++ = 'f'; 9459 *f++ = 'l'; 9460 *f++ = 'o'; 9461 *f++ = 'a'; 9462 *f++ = 't'; 9463 *f++ = '1'; 9464 *f++ = '2'; 9465 *f = '8'; 9466 } 9467 return n; 9468 } 9469 }; 9470 9471 class __ellipsis 9472 : public __node 9473 { 9474 static const size_t n = sizeof("...") - 1; 9475 public: 9476 9477 virtual size_t first_size() const {return n;} 9478 virtual char* first_demangled_name(char* buf) const 9479 { 9480 *buf++ = '.'; 9481 *buf++ = '.'; 9482 *buf++ = '.'; 9483 return buf; 9484 } 9485 virtual ptrdiff_t print_first(char* f, char* l) const 9486 { 9487 const ptrdiff_t r = l - f; 9488 if (r >= n) 9489 { 9490 *f++ = '.'; 9491 *f++ = '.'; 9492 *f = '.'; 9493 } 9494 return n; 9495 } 9496 }; 9497 9498 class __decimal64 9499 : public __node 9500 { 9501 static const size_t n = sizeof("decimal64") - 1; 9502 public: 9503 9504 virtual size_t first_size() const {return n;} 9505 virtual char* first_demangled_name(char* buf) const 9506 { 9507 strncpy(buf, "decimal64", n); 9508 return buf + n; 9509 } 9510 virtual ptrdiff_t print_first(char* f, char* l) const 9511 { 9512 const ptrdiff_t r = l - f; 9513 if (r >= n) 9514 { 9515 *f++ = 'd'; 9516 *f++ = 'e'; 9517 *f++ = 'c'; 9518 *f++ = 'i'; 9519 *f++ = 'm'; 9520 *f++ = 'a'; 9521 *f++ = 'l'; 9522 *f++ = '6'; 9523 *f = '4'; 9524 } 9525 return n; 9526 } 9527 }; 9528 9529 class __decimal128 9530 : public __node 9531 { 9532 static const size_t n = sizeof("decimal128") - 1; 9533 public: 9534 9535 virtual size_t first_size() const {return n;} 9536 virtual char* first_demangled_name(char* buf) const 9537 { 9538 strncpy(buf, "decimal128", n); 9539 return buf + n; 9540 } 9541 virtual ptrdiff_t print_first(char* f, char* l) const 9542 { 9543 const ptrdiff_t r = l - f; 9544 if (r >= n) 9545 { 9546 *f++ = 'd'; 9547 *f++ = 'e'; 9548 *f++ = 'c'; 9549 *f++ = 'i'; 9550 *f++ = 'm'; 9551 *f++ = 'a'; 9552 *f++ = 'l'; 9553 *f++ = '1'; 9554 *f++ = '2'; 9555 *f = '8'; 9556 } 9557 return n; 9558 } 9559 }; 9560 9561 class __decimal32 9562 : public __node 9563 { 9564 static const size_t n = sizeof("decimal32") - 1; 9565 public: 9566 9567 virtual size_t first_size() const {return n;} 9568 virtual char* first_demangled_name(char* buf) const 9569 { 9570 strncpy(buf, "decimal32", n); 9571 return buf + n; 9572 } 9573 virtual ptrdiff_t print_first(char* f, char* l) const 9574 { 9575 const ptrdiff_t r = l - f; 9576 if (r >= n) 9577 { 9578 *f++ = 'd'; 9579 *f++ = 'e'; 9580 *f++ = 'c'; 9581 *f++ = 'i'; 9582 *f++ = 'm'; 9583 *f++ = 'a'; 9584 *f++ = 'l'; 9585 *f++ = '3'; 9586 *f = '2'; 9587 } 9588 return n; 9589 } 9590 }; 9591 9592 class __decimal16 9593 : public __node 9594 { 9595 static const size_t n = sizeof("decimal16") - 1; 9596 public: 9597 9598 virtual size_t first_size() const {return n;} 9599 virtual char* first_demangled_name(char* buf) const 9600 { 9601 strncpy(buf, "decimal16", n); 9602 return buf + n; 9603 } 9604 virtual ptrdiff_t print_first(char* f, char* l) const 9605 { 9606 const ptrdiff_t r = l - f; 9607 if (r >= n) 9608 { 9609 *f++ = 'd'; 9610 *f++ = 'e'; 9611 *f++ = 'c'; 9612 *f++ = 'i'; 9613 *f++ = 'm'; 9614 *f++ = 'a'; 9615 *f++ = 'l'; 9616 *f++ = '1'; 9617 *f = '6'; 9618 } 9619 return n; 9620 } 9621 }; 9622 9623 class __d_char32_t 9624 : public __node 9625 { 9626 static const size_t n = sizeof("char32_t") - 1; 9627 public: 9628 9629 virtual size_t first_size() const {return n;} 9630 virtual char* first_demangled_name(char* buf) const 9631 { 9632 strncpy(buf, "char32_t", n); 9633 return buf + n; 9634 } 9635 virtual ptrdiff_t print_first(char* f, char* l) const 9636 { 9637 const ptrdiff_t r = l - f; 9638 if (r >= n) 9639 { 9640 *f++ = 'c'; 9641 *f++ = 'h'; 9642 *f++ = 'a'; 9643 *f++ = 'r'; 9644 *f++ = '3'; 9645 *f++ = '2'; 9646 *f++ = '_'; 9647 *f = 't'; 9648 } 9649 return n; 9650 } 9651 }; 9652 9653 class __d_char16_t 9654 : public __node 9655 { 9656 static const size_t n = sizeof("char16_t") - 1; 9657 public: 9658 9659 virtual size_t first_size() const {return n;} 9660 virtual char* first_demangled_name(char* buf) const 9661 { 9662 strncpy(buf, "char16_t", n); 9663 return buf + n; 9664 } 9665 virtual ptrdiff_t print_first(char* f, char* l) const 9666 { 9667 const ptrdiff_t r = l - f; 9668 if (r >= n) 9669 { 9670 *f++ = 'c'; 9671 *f++ = 'h'; 9672 *f++ = 'a'; 9673 *f++ = 'r'; 9674 *f++ = '1'; 9675 *f++ = '6'; 9676 *f++ = '_'; 9677 *f = 't'; 9678 } 9679 return n; 9680 } 9681 }; 9682 9683 class __auto 9684 : public __node 9685 { 9686 static const size_t n = sizeof("auto") - 1; 9687 public: 9688 9689 virtual size_t first_size() const {return n;} 9690 virtual char* first_demangled_name(char* buf) const 9691 { 9692 strncpy(buf, "auto", n); 9693 return buf + n; 9694 } 9695 virtual ptrdiff_t print_first(char* f, char* l) const 9696 { 9697 const ptrdiff_t r = l - f; 9698 if (r >= n) 9699 { 9700 *f++ = 'a'; 9701 *f++ = 'u'; 9702 *f++ = 't'; 9703 *f = 'o'; 9704 } 9705 return n; 9706 } 9707 }; 9708 9709 class __nullptr_t 9710 : public __node 9711 { 9712 static const size_t n = sizeof("std::nullptr_t") - 1; 9713 public: 9714 9715 virtual size_t first_size() const {return n;} 9716 virtual char* first_demangled_name(char* buf) const 9717 { 9718 strncpy(buf, "std::nullptr_t", n); 9719 return buf + n; 9720 } 9721 virtual ptrdiff_t print_first(char* f, char* l) const 9722 { 9723 const ptrdiff_t r = l - f; 9724 if (r >= n) 9725 { 9726 *f++ = 's'; 9727 *f++ = 't'; 9728 *f++ = 'd'; 9729 *f++ = ':'; 9730 *f++ = ':'; 9731 *f++ = 'n'; 9732 *f++ = 'u'; 9733 *f++ = 'l'; 9734 *f++ = 'l'; 9735 *f++ = 'p'; 9736 *f++ = 't'; 9737 *f++ = 'r'; 9738 *f++ = '_'; 9739 *f = 't'; 9740 } 9741 return n; 9742 } 9743 }; 9744 9745 class __array 9746 : public __node 9747 { 9748 public: 9749 9750 explicit __array(__node* type) 9751 { 9752 __left_ = type; 9753 } 9754 9755 __array(__node* type, size_t dim) 9756 { 9757 __left_ = type; 9758 __size_ = dim; 9759 } 9760 9761 __array(__node* type, __node* dim) 9762 { 9763 __left_ = type; 9764 __right_ = dim; 9765 } 9766 9767 virtual size_t size() const 9768 { 9769 if (__cached_size_ == -1) 9770 { 9771 size_t r = __left_->size() + 3; 9772 if (__right_ != 0) 9773 r += __right_->size(); 9774 else if (__size_ != 0) 9775 r += snprintf(0, 0, "%ld", __size_); 9776 const_cast<long&>(__cached_size_) = r; 9777 } 9778 return __cached_size_; 9779 } 9780 9781 virtual char* get_demangled_name(char* buf) const 9782 { 9783 buf = __left_->get_demangled_name(buf); 9784 *buf++ = ' '; 9785 *buf++ = '['; 9786 if (__right_ != 0) 9787 buf = __right_->get_demangled_name(buf); 9788 else if (__size_ != 0) 9789 { 9790 size_t rs = sprintf(buf, "%ld", __size_); 9791 buf += rs; 9792 } 9793 *buf++ = ']'; 9794 return buf; 9795 } 9796 virtual ptrdiff_t print(char* f, char* l) const 9797 { 9798 const ptrdiff_t r = l - f; 9799 const ptrdiff_t n = 3; 9800 const ptrdiff_t sz1 = __left_->print(f, l); 9801 char buf[20]; 9802 ptrdiff_t sz2 = 0; 9803 if (__right_ != 0) 9804 sz2 = __right_->print(f+std::min(sz1+(n-1), r), l); 9805 else if (__size_ != 0) 9806 { 9807 sz2 = sprintf(buf, "%ld", __size_); 9808 if (r >= sz1 + sz2 + n) 9809 strncpy(f+sz1+2, buf, sz2); 9810 } 9811 if (r >= sz1 + sz2 + n) 9812 { 9813 f += sz1; 9814 *f++ = ' '; 9815 *f = '['; 9816 f += 1 + sz2; 9817 *f = ']'; 9818 } 9819 return sz1 + sz2 + n; 9820 } 9821 9822 virtual size_t first_size() const 9823 { 9824 return __left_->first_size(); 9825 } 9826 9827 virtual char* first_demangled_name(char* buf) const 9828 { 9829 return __left_->first_demangled_name(buf); 9830 } 9831 9832 virtual ptrdiff_t print_first(char* f, char* l) const 9833 { 9834 return __left_->print_first(f, l); 9835 } 9836 9837 virtual size_t second_size() const 9838 { 9839 size_t r = 2 + __left_->second_size(); 9840 if (!__left_->is_array()) 9841 ++r; 9842 if (__right_ != 0) 9843 r += __right_->size(); 9844 else if (__size_ != 0) 9845 r += snprintf(0, 0, "%ld", __size_); 9846 return r; 9847 } 9848 9849 virtual char* second_demangled_name(char* buf) const 9850 { 9851 *buf++ = ' '; 9852 *buf++ = '['; 9853 if (__right_ != 0) 9854 buf = __right_->get_demangled_name(buf); 9855 else if (__size_ != 0) 9856 { 9857 size_t off = sprintf(buf, "%ld", __size_); 9858 buf += off; 9859 } 9860 char* t = buf; 9861 buf = __left_->second_demangled_name(buf); 9862 *t = ']'; 9863 if (buf == t) 9864 ++buf; 9865 return buf; 9866 } 9867 virtual ptrdiff_t print_second(char* f, char* l) const 9868 { 9869 const ptrdiff_t r = l - f; 9870 ptrdiff_t n = 2; 9871 char buf[20]; 9872 ptrdiff_t sz2 = 0; 9873 if (__right_ != 0) 9874 sz2 = __right_->print(f+std::min(n, r), l); 9875 else if (__size_ != 0) 9876 { 9877 sz2 = sprintf(buf, "%ld", __size_); 9878 if (r >= sz2 + 3) 9879 strncpy(f+2, buf, sz2); 9880 } 9881 const ptrdiff_t sz1 = __left_->print_second(f+std::min(2+sz2, r), l); 9882 if (sz1 == 0) 9883 ++n; 9884 if (r >= sz1 + sz2 + n) 9885 { 9886 *f++ = ' '; 9887 *f = '['; 9888 f += 1 + sz2; 9889 *f = ']'; 9890 } 9891 return sz1 + sz2 + n; 9892 } 9893 virtual bool is_array() const 9894 { 9895 return true; 9896 } 9897 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 9898 { 9899 bool r = __left_->fix_forward_references(t_begin, t_end); 9900 if (__right_) 9901 r = r && __right_->fix_forward_references(t_begin, t_end); 9902 return r; 9903 } 9904 }; 9905 9906 class __pointer_to_member_type 9907 : public __node 9908 { 9909 public: 9910 9911 __pointer_to_member_type(__node* class_type, __node* member_type) 9912 { 9913 __left_ = class_type; 9914 __right_ = member_type; 9915 } 9916 9917 virtual size_t first_size() const 9918 { 9919 if (__cached_size_ == -1) 9920 const_cast<long&>(__cached_size_) = __left_->size() + 3 + __right_->size(); 9921 return __cached_size_; 9922 } 9923 virtual char* first_demangled_name(char* buf) const 9924 { 9925 buf = __right_->first_demangled_name(buf); 9926 buf = __left_->get_demangled_name(buf); 9927 *buf++ = ':'; 9928 *buf++ = ':'; 9929 *buf++ = '*'; 9930 return __right_->second_demangled_name(buf); 9931 } 9932 virtual ptrdiff_t print_first(char* f, char* l) const 9933 { 9934 const ptrdiff_t r = l - f; 9935 const ptrdiff_t n = 3; 9936 const ptrdiff_t sz1 = __right_->print_first(f, l); 9937 const ptrdiff_t sz2 = __left_->print(f+std::min(sz1, r), l); 9938 const ptrdiff_t sz3 = __right_->print_second(f+std::min(sz1+sz2+n, r), l); 9939 if (r >= sz1 + sz2 + sz3 + n) 9940 { 9941 f += sz1 + sz2; 9942 *f++ = ':'; 9943 *f++ = ':'; 9944 *f = '*'; 9945 } 9946 return sz1 + sz2 + sz3 + n; 9947 } 9948 virtual __node* base_name() const 9949 { 9950 return __left_->base_name(); 9951 } 9952 virtual bool is_reference_or_pointer_to_function_or_array() const 9953 { 9954 return __right_->is_function(); 9955 } 9956 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 9957 { 9958 return __left_->fix_forward_references(t_begin, t_end) && 9959 __right_->fix_forward_references(t_begin, t_end); 9960 } 9961 }; 9962 9963 class __decltype_node 9964 : public __node 9965 { 9966 public: 9967 9968 explicit __decltype_node(__node* expr) 9969 { 9970 __right_ = expr; 9971 } 9972 9973 virtual size_t first_size() const 9974 { 9975 if (__cached_size_ == -1) 9976 const_cast<long&>(__cached_size_) = 10 + __right_->size(); 9977 return __cached_size_; 9978 } 9979 9980 virtual char* first_demangled_name(char* buf) const 9981 { 9982 strncpy(buf, "decltype(", 9); 9983 buf += 9; 9984 buf = __right_->get_demangled_name(buf); 9985 *buf++ = ')'; 9986 return buf; 9987 } 9988 virtual ptrdiff_t print_first(char* f, char* l) const 9989 { 9990 const ptrdiff_t r = l - f; 9991 const ptrdiff_t n = sizeof("decltype()") - 1; 9992 const ptrdiff_t sz1 = __right_->print(f+std::min(n-1, r), l); 9993 if (r >= sz1 + n) 9994 { 9995 *f++ = 'd'; 9996 *f++ = 'e'; 9997 *f++ = 'c'; 9998 *f++ = 'l'; 9999 *f++ = 't'; 10000 *f++ = 'y'; 10001 *f++ = 'p'; 10002 *f++ = 'e'; 10003 *f = '('; 10004 f += 1 + sz1; 10005 *f = ')'; 10006 } 10007 return sz1 + n; 10008 } 10009 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 10010 { 10011 return __right_->fix_forward_references(t_begin, t_end); 10012 } 10013 }; 10014 10015 class __nested_delimeter 10016 : public __node 10017 { 10018 public: 10019 10020 explicit __nested_delimeter(__node* prev, __node* arg) 10021 { 10022 __left_ = prev; 10023 __right_ = arg; 10024 } 10025 10026 virtual size_t first_size() const 10027 { 10028 if (__cached_size_ == -1) 10029 const_cast<long&>(__cached_size_) = __left_->size() + __right_->size() + 2; 10030 return __cached_size_; 10031 } 10032 10033 virtual char* first_demangled_name(char* buf) const 10034 { 10035 buf = __left_->get_demangled_name(buf); 10036 *buf++ = ':'; 10037 *buf++ = ':'; 10038 return __right_->get_demangled_name(buf); 10039 } 10040 virtual ptrdiff_t print_first(char* f, char* l) const 10041 { 10042 const ptrdiff_t r = l - f; 10043 const ptrdiff_t n = sizeof("::") - 1; 10044 const ptrdiff_t sz1 = __left_->print(f, l); 10045 if (r >= sz1 + n) 10046 { 10047 f += sz1; 10048 *f++ = ':'; 10049 *f++ = ':'; 10050 } 10051 const ptrdiff_t sz2 = __right_->print(f, l); 10052 return sz1 + n + sz2; 10053 } 10054 10055 virtual bool ends_with_template() const 10056 { 10057 return __right_->ends_with_template(); 10058 } 10059 virtual __node* base_name() const 10060 { 10061 return __right_->base_name(); 10062 } 10063 virtual bool is_ctor_dtor_conv() const 10064 { 10065 return __right_->is_ctor_dtor_conv(); 10066 } 10067 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 10068 { 10069 return __left_->fix_forward_references(t_begin, t_end) && 10070 __right_->fix_forward_references(t_begin, t_end); 10071 } 10072 virtual __node* extract_cv(__node*& rt) const 10073 { 10074 return __right_->extract_cv(const_cast<__node*&>(__right_)); 10075 } 10076 }; 10077 10078 class __unresolved_name 10079 : public __node 10080 { 10081 public: 10082 10083 __unresolved_name(__node* prev, __node* arg) 10084 { 10085 __left_ = prev; 10086 __right_ = arg; 10087 } 10088 10089 __unresolved_name(bool global, __node* prev, __node* arg) 10090 { 10091 __size_ = global; 10092 __left_ = prev; 10093 __right_ = arg; 10094 } 10095 10096 virtual size_t first_size() const 10097 { 10098 if (__cached_size_ == -1) 10099 const_cast<long&>(__cached_size_) = (__left_ ? __left_->size() + 2 : 0) + 10100 __right_->size() + __size_ * 2; 10101 return __cached_size_; 10102 } 10103 10104 virtual char* first_demangled_name(char* buf) const 10105 { 10106 if (__size_) 10107 { 10108 *buf++ = ':'; 10109 *buf++ = ':'; 10110 } 10111 if (__left_) 10112 { 10113 buf = __left_->get_demangled_name(buf); 10114 *buf++ = ':'; 10115 *buf++ = ':'; 10116 } 10117 return __right_->get_demangled_name(buf); 10118 } 10119 virtual ptrdiff_t print_first(char* f, char* l) const 10120 { 10121 const ptrdiff_t r = l - f; 10122 ptrdiff_t n = 0; 10123 if (__size_) 10124 { 10125 n = 2; 10126 if (r >= n) 10127 { 10128 f[0] = ':'; 10129 f[1] = ':'; 10130 } 10131 } 10132 ptrdiff_t sz1 = 0; 10133 if (__left_) 10134 { 10135 sz1 = __left_->print(f+std::min(n, r), l); 10136 n += 2; 10137 if (r >= sz1 + n) 10138 { 10139 f[sz1 + n - 2] = ':'; 10140 f[sz1 + n - 1] = ':'; 10141 } 10142 } 10143 const ptrdiff_t sz2 = __right_->print(f+std::min(sz1+n, r), l); 10144 return sz1 + n + sz2; 10145 } 10146 10147 virtual bool ends_with_template() const 10148 { 10149 return __right_->ends_with_template(); 10150 } 10151 virtual __node* base_name() const 10152 { 10153 return __right_->base_name(); 10154 } 10155 virtual bool is_ctor_dtor_conv() const 10156 { 10157 return __right_->is_ctor_dtor_conv(); 10158 } 10159 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 10160 { 10161 bool r = true; 10162 if (__left_) 10163 r = __left_->fix_forward_references(t_begin, t_end); 10164 return r && __right_->fix_forward_references(t_begin, t_end); 10165 } 10166 virtual __node* extract_cv(__node*& rt) const 10167 { 10168 return __right_->extract_cv(const_cast<__node*&>(__right_)); 10169 } 10170 }; 10171 10172 class __string_literal 10173 : public __node 10174 { 10175 public: 10176 10177 virtual size_t first_size() const 10178 { 10179 return 14; 10180 } 10181 10182 virtual char* first_demangled_name(char* buf) const 10183 { 10184 strncpy(buf, "string literal", 14); 10185 return buf + 14; 10186 } 10187 virtual ptrdiff_t print_first(char* f, char* l) const 10188 { 10189 const ptrdiff_t r = l - f; 10190 const ptrdiff_t n = sizeof("string literal") - 1; 10191 if (r >= n) 10192 { 10193 *f++ = 's'; 10194 *f++ = 't'; 10195 *f++ = 'r'; 10196 *f++ = 'i'; 10197 *f++ = 'n'; 10198 *f++ = 'g'; 10199 *f++ = ' '; 10200 *f++ = 'l'; 10201 *f++ = 'i'; 10202 *f++ = 't'; 10203 *f++ = 'e'; 10204 *f++ = 'r'; 10205 *f++ = 'a'; 10206 *f = 'l'; 10207 } 10208 return n; 10209 } 10210 }; 10211 10212 class __constructor 10213 : public __node 10214 { 10215 public: 10216 10217 explicit __constructor(__node* name) 10218 { 10219 __right_ = name; 10220 } 10221 10222 virtual size_t first_size() const 10223 { 10224 if (__cached_size_ == -1) 10225 const_cast<long&>(__cached_size_) = __right_->base_size(); 10226 return __cached_size_; 10227 } 10228 10229 virtual char* first_demangled_name(char* buf) const 10230 { 10231 return __right_->get_base_name(buf); 10232 } 10233 virtual ptrdiff_t print_first(char* f, char* l) const 10234 { 10235 return __right_->print_base_name(f, l); 10236 } 10237 virtual __node* base_name() const 10238 { 10239 return __right_->base_name(); 10240 } 10241 virtual bool ends_with_template() const 10242 { 10243 return __right_->ends_with_template(); 10244 } 10245 virtual bool is_ctor_dtor_conv() const 10246 { 10247 return true; 10248 } 10249 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 10250 { 10251 return __right_->fix_forward_references(t_begin, t_end); 10252 } 10253 }; 10254 10255 class __destructor 10256 : public __node 10257 { 10258 public: 10259 10260 explicit __destructor(__node* name) 10261 { 10262 __right_ = name; 10263 } 10264 10265 virtual size_t first_size() const 10266 { 10267 if (__cached_size_ == -1) 10268 const_cast<long&>(__cached_size_) = __right_->base_size() + 1; 10269 return __cached_size_; 10270 } 10271 10272 virtual char* first_demangled_name(char* buf) const 10273 { 10274 *buf++ = '~'; 10275 return __right_->get_base_name(buf); 10276 } 10277 virtual ptrdiff_t print_first(char* f, char* l) const 10278 { 10279 const ptrdiff_t r = l - f; 10280 const ptrdiff_t n = 1; 10281 const ptrdiff_t sz = __right_->print_base_name(f+std::min(n, r), l); 10282 if (r >= n + sz) 10283 *f = '~'; 10284 return n + sz; 10285 } 10286 virtual __node* base_name() const 10287 { 10288 return __right_->base_name(); 10289 } 10290 virtual bool is_ctor_dtor_conv() const 10291 { 10292 return true; 10293 } 10294 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 10295 { 10296 return __right_->fix_forward_references(t_begin, t_end); 10297 } 10298 }; 10299 10300 class __dot_suffix 10301 : public __node 10302 { 10303 public: 10304 __dot_suffix(__node* name, const char* suffix, unsigned sz) 10305 { 10306 __left_ = name; 10307 __name_ = suffix; 10308 __size_ = sz; 10309 } 10310 10311 virtual size_t first_size() const 10312 { 10313 if (__cached_size_ == -1) 10314 { 10315 size_t off = __left_->size(); 10316 off += __size_ + 3; 10317 const_cast<long&>(__cached_size_) = off; 10318 } 10319 return __cached_size_; 10320 } 10321 virtual char* first_demangled_name(char* buf) const 10322 { 10323 buf = __left_->get_demangled_name(buf); 10324 *buf++ = ' '; 10325 *buf++ = '('; 10326 strncpy(buf, __name_, __size_); 10327 buf += __size_; 10328 *buf++ = ')'; 10329 return buf; 10330 } 10331 virtual ptrdiff_t print_first(char* f, char* l) const 10332 { 10333 const ptrdiff_t r = l - f; 10334 const ptrdiff_t n = 3 + __size_; 10335 const ptrdiff_t sz = __left_->print(f, l); 10336 if (r >= n + sz) 10337 { 10338 f += sz; 10339 *f++ = ' '; 10340 *f++ = '('; 10341 strncpy(f, __name_, __size_); 10342 f += __size_; 10343 *f = ')'; 10344 } 10345 return n + sz; 10346 } 10347 virtual __node* base_name() const 10348 { 10349 return __left_->base_name(); 10350 } 10351 virtual bool fix_forward_references(__node** t_begin, __node** t_end) 10352 { 10353 return __left_->fix_forward_references(t_begin, t_end); 10354 } 10355 }; 10356 10357 10358 enum {invalid_args = -3, invalid_mangled_name, memory_alloc_failure, success, 10359 not_yet_implemented}; 10360 10361 __demangle_tree::__demangle_tree(const char* mangled_name, char* buf, size_t bs) 10362 : __mangled_name_begin_(0), __mangled_name_end_(0), 10363 __status_(invalid_mangled_name), __root_(0), 10364 __node_begin_(0), __node_end_(0), __node_cap_(0), 10365 __sub_begin_(0), __sub_end_(0), __sub_cap_(0), 10366 __t_begin_(0), __t_end_(0), __t_cap_(0), 10367 __tag_templates_(true), 10368 __fix_forward_references_(false) 10369 { 10370 size_t n = strlen(mangled_name); 10371 size_t ms = n + 2*n*sizeof(__node) + 2*n*sizeof(__node*); 10372 char* m; 10373 if (ms <= bs) 10374 { 10375 m = buf; 10376 __owns_buf_ = false; 10377 } 10378 else 10379 { 10380 m = static_cast<char*>(malloc(ms)); 10381 __owns_buf_ = true; 10382 } 10383 if (m == NULL) 10384 { 10385 __status_ = memory_alloc_failure; 10386 return; 10387 } 10388 __node_begin_ = __node_end_ = (__node*)(m); 10389 __node_cap_ = __node_begin_ + 2*n; 10390 __sub_begin_ = __sub_end_ = (__node**)(__node_cap_); 10391 __sub_cap_ = __sub_begin_ + n; 10392 __t_begin_ = __t_end_ = (__node**)(__sub_cap_); 10393 __t_cap_ = __t_begin_ + n; 10394 __mangled_name_begin_ = (const char*)(__t_cap_); 10395 __mangled_name_end_ = __mangled_name_begin_ + n; 10396 strncpy(const_cast<char*>(__mangled_name_begin_), mangled_name, n); 10397 } 10398 10399 __demangle_tree::~__demangle_tree() 10400 { 10401 if (__owns_buf_) 10402 free(__node_begin_); 10403 } 10404 10405 __demangle_tree::__demangle_tree(__demangle_tree& t) 10406 : __mangled_name_begin_(t.__mangled_name_begin_), 10407 __mangled_name_end_(t.__mangled_name_end_), 10408 __status_(t.__status_), __root_(t.__root_), 10409 __node_begin_(t.__node_begin_), __node_end_(t.__node_end_), 10410 __node_cap_(t.__node_cap_), 10411 __sub_begin_(t.__sub_begin_), __sub_end_(t.__sub_end_), 10412 __sub_cap_(t.__sub_cap_), 10413 __t_begin_(t.__t_begin_), __t_end_(t.__t_end_), 10414 __t_cap_(t.__t_cap_), 10415 __tag_templates_(t.__tag_templates_), 10416 __fix_forward_references_(t.__fix_forward_references_), 10417 __owns_buf_(t.__owns_buf_) 10418 { 10419 t.__mangled_name_begin_ = 0; 10420 t.__mangled_name_end_ = 0; 10421 t.__status_ = invalid_mangled_name; 10422 t.__root_ = 0; 10423 t.__node_begin_ = t.__node_end_ = t.__node_cap_ = 0; 10424 t.__sub_begin_ = t.__sub_end_ = t.__sub_cap_ = 0; 10425 t.__t_begin_ = t.__t_end_ = t.__t_cap_ = 0; 10426 t.__owns_buf_ = false; 10427 } 10428 10429 __demangle_tree::__demangle_tree(__demangle_tree_rv rv) 10430 : __mangled_name_begin_(rv.ptr_->__mangled_name_begin_), 10431 __mangled_name_end_(rv.ptr_->__mangled_name_end_), 10432 __status_(rv.ptr_->__status_), __root_(rv.ptr_->__root_), 10433 __node_begin_(rv.ptr_->__node_begin_), __node_end_(rv.ptr_->__node_end_), 10434 __node_cap_(rv.ptr_->__node_cap_), 10435 __sub_begin_(rv.ptr_->__sub_begin_), __sub_end_(rv.ptr_->__sub_end_), 10436 __sub_cap_(rv.ptr_->__sub_cap_), 10437 __t_begin_(rv.ptr_->__t_begin_), __t_end_(rv.ptr_->__t_end_), 10438 __t_cap_(rv.ptr_->__t_cap_), 10439 __tag_templates_(rv.ptr_->__tag_templates_), 10440 __fix_forward_references_(rv.ptr_->__fix_forward_references_), 10441 __owns_buf_(rv.ptr_->__owns_buf_) 10442 { 10443 rv.ptr_->__mangled_name_begin_ = 0; 10444 rv.ptr_->__mangled_name_end_ = 0; 10445 rv.ptr_->__status_ = invalid_mangled_name; 10446 rv.ptr_->__root_ = 0; 10447 rv.ptr_->__node_begin_ = rv.ptr_->__node_end_ = rv.ptr_->__node_cap_ = 0; 10448 rv.ptr_->__sub_begin_ = rv.ptr_->__sub_end_ = rv.ptr_->__sub_cap_ = 0; 10449 rv.ptr_->__t_begin_ = rv.ptr_->__t_end_ = rv.ptr_->__t_cap_ = 0; 10450 rv.ptr_->__owns_buf_ = false; 10451 } 10452 10453 int 10454 __demangle_tree::__status() const 10455 { 10456 return __status_; 10457 } 10458 10459 size_t 10460 __demangle_tree::size() const 10461 { 10462 return __status_ == success ? __root_->size() : 0; 10463 } 10464 10465 char* 10466 __demangle_tree::__get_demangled_name(char* buf) const 10467 { 10468 if (__status_ == success) 10469 return __root_->get_demangled_name(buf); 10470 return 0; 10471 } 10472 10473 template <class _Tp> 10474 bool 10475 __demangle_tree::__make() 10476 { 10477 if (__node_end_ < __node_cap_) 10478 { 10479 ::new (__node_end_) _Tp(); 10480 __root_ = __node_end_; 10481 ++__node_end_; 10482 return true; 10483 } 10484 __status_ = memory_alloc_failure; 10485 return false; 10486 } 10487 10488 template <class _Tp, class _A0> 10489 bool 10490 __demangle_tree::__make(_A0 __a0) 10491 { 10492 if (__node_end_ < __node_cap_) 10493 { 10494 ::new (__node_end_) _Tp(__a0); 10495 __root_ = __node_end_; 10496 ++__node_end_; 10497 return true; 10498 } 10499 __status_ = memory_alloc_failure; 10500 return false; 10501 } 10502 10503 template <class _Tp, class _A0, class _A1> 10504 bool 10505 __demangle_tree::__make(_A0 __a0, _A1 __a1) 10506 { 10507 if (__node_end_ < __node_cap_) 10508 { 10509 ::new (__node_end_) _Tp(__a0, __a1); 10510 __root_ = __node_end_; 10511 ++__node_end_; 10512 return true; 10513 } 10514 __status_ = memory_alloc_failure; 10515 return false; 10516 } 10517 10518 template <class _Tp, class _A0, class _A1, class _A2> 10519 bool 10520 __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2) 10521 { 10522 if (__node_end_ < __node_cap_) 10523 { 10524 ::new (__node_end_) _Tp(__a0, __a1, __a2); 10525 __root_ = __node_end_; 10526 ++__node_end_; 10527 return true; 10528 } 10529 __status_ = memory_alloc_failure; 10530 return false; 10531 } 10532 10533 template <class _Tp, class _A0, class _A1, class _A2, class _A3> 10534 bool 10535 __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3) 10536 { 10537 if (__node_end_ < __node_cap_) 10538 { 10539 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3); 10540 __root_ = __node_end_; 10541 ++__node_end_; 10542 return true; 10543 } 10544 __status_ = memory_alloc_failure; 10545 return false; 10546 } 10547 10548 template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4> 10549 bool 10550 __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4) 10551 { 10552 if (__node_end_ < __node_cap_) 10553 { 10554 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4); 10555 __root_ = __node_end_; 10556 ++__node_end_; 10557 return true; 10558 } 10559 __status_ = memory_alloc_failure; 10560 return false; 10561 } 10562 10563 template <class _Tp, class _A0, class _A1, class _A2, class _A3, class _A4, 10564 class _A5> 10565 bool 10566 __demangle_tree::__make(_A0 __a0, _A1 __a1, _A2 __a2, _A3 __a3, _A4 __a4, 10567 _A5 __a5) 10568 { 10569 if (__node_end_ < __node_cap_) 10570 { 10571 ::new (__node_end_) _Tp(__a0, __a1, __a2, __a3, __a4, __a5); 10572 __root_ = __node_end_; 10573 ++__node_end_; 10574 return true; 10575 } 10576 __status_ = memory_alloc_failure; 10577 return false; 10578 } 10579 10580 // <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const 10581 // [R | O] # & or && 10582 10583 const char* 10584 __demangle_tree::__parse_cv_qualifiers(const char* first, const char* last, 10585 unsigned& cv, bool look_for_ref_quals) 10586 { 10587 if (look_for_ref_quals) 10588 { 10589 for (; first != last; ++first) 10590 { 10591 switch (*first) 10592 { 10593 case 'r': 10594 cv |= 4; 10595 break; 10596 case 'V': 10597 cv |= 2; 10598 break; 10599 case 'K': 10600 cv |= 1; 10601 break; 10602 case 'R': 10603 cv |= 8; 10604 break; 10605 case 'O': 10606 cv |= 16; 10607 break; 10608 default: 10609 return first; 10610 } 10611 } 10612 } 10613 else 10614 { 10615 for (; first != last; ++first) 10616 { 10617 switch (*first) 10618 { 10619 case 'r': 10620 cv |= 4; 10621 break; 10622 case 'V': 10623 cv |= 2; 10624 break; 10625 case 'K': 10626 cv |= 1; 10627 break; 10628 default: 10629 return first; 10630 } 10631 } 10632 } 10633 return first; 10634 } 10635 10636 // <builtin-type> ::= v # void 10637 // ::= w # wchar_t 10638 // ::= b # bool 10639 // ::= c # char 10640 // ::= a # signed char 10641 // ::= h # unsigned char 10642 // ::= s # short 10643 // ::= t # unsigned short 10644 // ::= i # int 10645 // ::= j # unsigned int 10646 // ::= l # long 10647 // ::= m # unsigned long 10648 // ::= x # long long, __int64 10649 // ::= y # unsigned long long, __int64 10650 // ::= n # __int128 10651 // ::= o # unsigned __int128 10652 // ::= f # float 10653 // ::= d # double 10654 // ::= e # long double, __float80 10655 // ::= g # __float128 10656 // ::= z # ellipsis 10657 // ::= Dd # IEEE 754r decimal floating point (64 bits) 10658 // ::= De # IEEE 754r decimal floating point (128 bits) 10659 // ::= Df # IEEE 754r decimal floating point (32 bits) 10660 // ::= Dh # IEEE 754r half-precision floating point (16 bits) 10661 // ::= Di # char32_t 10662 // ::= Ds # char16_t 10663 // ::= Da # auto (in dependent new-expressions) 10664 // ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) 10665 // ::= u <source-name> # vendor extended type 10666 10667 const char* 10668 __demangle_tree::__parse_builtin_type(const char* first, const char* last) 10669 { 10670 if (first != last) 10671 { 10672 switch (*first) 10673 { 10674 case 'v': 10675 if (__make<__void>()) 10676 ++first; 10677 break; 10678 case 'w': 10679 if (__make<__wchar_t>()) 10680 ++first; 10681 break; 10682 case 'b': 10683 if (__make<__bool>()) 10684 ++first; 10685 break; 10686 case 'c': 10687 if (__make<__char>()) 10688 ++first; 10689 break; 10690 case 'a': 10691 if (__make<__signed_char>()) 10692 ++first; 10693 break; 10694 case 'h': 10695 if (__make<__unsigned_char>()) 10696 ++first; 10697 break; 10698 case 's': 10699 if (__make<__short>()) 10700 ++first; 10701 break; 10702 case 't': 10703 if (__make<__unsigned_short>()) 10704 ++first; 10705 break; 10706 case 'i': 10707 if (__make<__int>()) 10708 ++first; 10709 break; 10710 case 'j': 10711 if (__make<__unsigned_int>()) 10712 ++first; 10713 break; 10714 case 'l': 10715 if (__make<__long>()) 10716 ++first; 10717 break; 10718 case 'm': 10719 if (__make<__unsigned_long>()) 10720 ++first; 10721 break; 10722 case 'x': 10723 if (__make<__long_long>()) 10724 ++first; 10725 break; 10726 case 'y': 10727 if (__make<__unsigned_long_long>()) 10728 ++first; 10729 break; 10730 case 'n': 10731 if (__make<__int128>()) 10732 ++first; 10733 break; 10734 case 'o': 10735 if (__make<__unsigned_int128>()) 10736 ++first; 10737 break; 10738 case 'f': 10739 if (__make<__float>()) 10740 ++first; 10741 break; 10742 case 'd': 10743 if (__make<__double>()) 10744 ++first; 10745 break; 10746 case 'e': 10747 if (__make<__long_double>()) 10748 ++first; 10749 break; 10750 case 'g': 10751 if (__make<__float128>()) 10752 ++first; 10753 break; 10754 case 'z': 10755 if (__make<__ellipsis>()) 10756 ++first; 10757 break; 10758 case 'D': 10759 if (first+1 != last) 10760 { 10761 switch (first[1]) 10762 { 10763 case 'd': 10764 if (__make<__decimal64>()) 10765 first += 2; 10766 break; 10767 case 'e': 10768 if (__make<__decimal128>()) 10769 first += 2; 10770 break; 10771 case 'f': 10772 if (__make<__decimal32>()) 10773 first += 2; 10774 break; 10775 case 'h': 10776 if (__make<__decimal16>()) 10777 first += 2; 10778 break; 10779 case 'i': 10780 if (__make<__d_char32_t>()) 10781 first += 2; 10782 break; 10783 case 's': 10784 if (__make<__d_char16_t>()) 10785 first += 2; 10786 break; 10787 case 'a': 10788 if (__make<__auto>()) 10789 first += 2; 10790 break; 10791 case 'n': 10792 if (__make<__nullptr_t>()) 10793 first += 2; 10794 break; 10795 } 10796 } 10797 break; 10798 } 10799 } 10800 return first; 10801 } 10802 10803 // <bare-function-type> ::= <signature type>+ 10804 // # types are possible return type, then parameter types 10805 10806 const char* 10807 __demangle_tree::__parse_bare_function_type(const char* first, const char* last) 10808 { 10809 if (first != last) 10810 { 10811 __tag_templates_ = false; 10812 const char* t = __parse_type(first, last); 10813 if (t != first && __make<__list>(__root_)) 10814 { 10815 const char* t0 = t; 10816 __node* head = __root_; 10817 __node* prev = head; 10818 while (true) 10819 { 10820 t = __parse_type(t0, last); 10821 if (t != t0) 10822 { 10823 if (__make<__list>(__root_)) 10824 { 10825 t0 = t; 10826 prev->__right_ = __root_; 10827 __root_->__size_ = prev->__size_ + 1; 10828 prev = __root_; 10829 } 10830 else 10831 break; 10832 } 10833 else 10834 { 10835 first = t; 10836 __root_ = head; 10837 break; 10838 } 10839 } 10840 } 10841 __tag_templates_ = true; 10842 } 10843 return first; 10844 } 10845 10846 // <function-type> ::= F [Y] <bare-function-type> E 10847 10848 const char* 10849 __demangle_tree::__parse_function_type(const char* first, const char* last) 10850 { 10851 if (first != last && *first == 'F') 10852 { 10853 const char* t = first+1; 10854 if (t != last) 10855 { 10856 bool externC = false; 10857 if (*t == 'Y') 10858 { 10859 externC = true; 10860 if (++t == last) 10861 return first; 10862 } 10863 const char* t1 = __parse_type(t, last); 10864 if (t1 != t) 10865 { 10866 __node* ret = __root_; 10867 t = t1; 10868 t1 = __parse_bare_function_type(t, last); 10869 if (t1 != t && t1 != last && *t1 == 'E') 10870 { 10871 if (dynamic_cast<__void*>(__root_->__left_) != NULL) 10872 __root_->__left_ = NULL; 10873 if (__make<__function_signature>(ret, __root_)) 10874 { 10875 if (__make<__function>((__node*)0, __root_)) 10876 first = t1+1; 10877 } 10878 } 10879 } 10880 } 10881 } 10882 return first; 10883 } 10884 10885 const char* 10886 __demangle_tree::__parse_hex_number(const char* first, const char* last, unsigned long long& n) 10887 { 10888 const char* t = first; 10889 for (; t != last && isxdigit(*t); ++t) 10890 { 10891 if (t == first) 10892 n = 0; 10893 if (isdigit(*t)) 10894 n = n * 16 + *t - '0'; 10895 else if (isupper(*t)) 10896 n = n * 16 + *t - 'A' + 10; 10897 else 10898 n = n * 16 + *t - 'a' + 10; 10899 } 10900 first = t; 10901 return first; 10902 } 10903 10904 // <expr-primary> ::= L <type> <value number> E # integer literal 10905 // ::= L <type> <value float> E # floating literal 10906 // ::= L <string type> E # string literal 10907 // ::= L <nullptr type> E # nullptr literal (i.e., "LDnE") 10908 // ::= L <type> <real-part float> _ <imag-part float> E # complex floating point literal (C 2000) 10909 // ::= L <mangled-name> E # external name 10910 10911 const char* 10912 __demangle_tree::__parse_expr_primary(const char* first, const char* last) 10913 { 10914 if (last - first >= 4 && *first == 'L') 10915 { 10916 switch (first[1]) 10917 { 10918 case 'w': 10919 { 10920 const char* t = __parse_number(first+2, last); 10921 if (t != first+2 && t != last && *t == 'E') 10922 { 10923 if (__make<__wchar_t_literal>(first+2, t)) 10924 first = t+1; 10925 } 10926 } 10927 break; 10928 case 'b': 10929 if (first[3] == 'E') 10930 { 10931 switch (first[2]) 10932 { 10933 case '0': 10934 if (__make<__bool_literal>("false", 5)) 10935 first += 4; 10936 break; 10937 case '1': 10938 if (__make<__bool_literal>("true", 4)) 10939 first += 4; 10940 break; 10941 } 10942 } 10943 break; 10944 case 'c': 10945 { 10946 const char* t = __parse_number(first+2, last); 10947 if (t != first+2 && t != last && *t == 'E') 10948 { 10949 if (__make<__char_literal>(first+2, t)) 10950 first = t+1; 10951 } 10952 } 10953 break; 10954 case 'a': 10955 { 10956 const char* t = __parse_number(first+2, last); 10957 if (t != first+2 && t != last && *t == 'E') 10958 { 10959 if (__make<__signed_char_literal>(first+2, t)) 10960 first = t+1; 10961 } 10962 } 10963 break; 10964 case 'h': 10965 { 10966 const char* t = __parse_number(first+2, last); 10967 if (t != first+2 && t != last && *t == 'E') 10968 { 10969 if (__make<__unsigned_char_literal>(first+2, t)) 10970 first = t+1; 10971 } 10972 } 10973 break; 10974 case 's': 10975 { 10976 const char* t = __parse_number(first+2, last); 10977 if (t != first+2 && t != last && *t == 'E') 10978 { 10979 if (__make<__short_literal>(first+2, t)) 10980 first = t+1; 10981 } 10982 } 10983 break; 10984 case 't': 10985 { 10986 const char* t = __parse_number(first+2, last); 10987 if (t != first+2 && t != last && *t == 'E') 10988 { 10989 if (__make<__unsigned_short_literal>(first+2, t)) 10990 first = t+1; 10991 } 10992 } 10993 break; 10994 case 'i': 10995 { 10996 const char* t = __parse_number(first+2, last); 10997 if (t != first+2 && t != last && *t == 'E') 10998 { 10999 if (__make<__int_literal>(first+2, t)) 11000 first = t+1; 11001 } 11002 } 11003 break; 11004 case 'j': 11005 { 11006 const char* t = __parse_number(first+2, last); 11007 if (t != first+2 && t != last && *t == 'E') 11008 { 11009 if (__make<__unsigned_int_literal>(first+2, t)) 11010 first = t+1; 11011 } 11012 } 11013 break; 11014 case 'l': 11015 { 11016 const char* t = __parse_number(first+2, last); 11017 if (t != first+2 && t != last && *t == 'E') 11018 { 11019 if (__make<__long_literal>(first+2, t)) 11020 first = t+1; 11021 } 11022 } 11023 break; 11024 case 'm': 11025 { 11026 const char* t = __parse_number(first+2, last); 11027 if (t != first+2 && t != last && *t == 'E') 11028 { 11029 if (__make<__unsigned_long_literal>(first+2, t)) 11030 first = t+1; 11031 } 11032 } 11033 break; 11034 case 'x': 11035 { 11036 const char* t = __parse_number(first+2, last); 11037 if (t != first+2 && t != last && *t == 'E') 11038 { 11039 if (__make<__long_long_literal>(first+2, t)) 11040 first = t+1; 11041 } 11042 } 11043 break; 11044 case 'y': 11045 { 11046 const char* t = __parse_number(first+2, last); 11047 if (t != first+2 && t != last && *t == 'E') 11048 { 11049 if (__make<__unsigned_long_long_literal>(first+2, t)) 11050 first = t+1; 11051 } 11052 } 11053 break; 11054 case 'n': 11055 { 11056 const char* t = __parse_number(first+2, last); 11057 if (t != first+2 && t != last && *t == 'E') 11058 { 11059 if (__make<__int128_literal>(first+2, t)) 11060 first = t+1; 11061 } 11062 } 11063 break; 11064 case 'o': 11065 { 11066 const char* t = __parse_number(first+2, last); 11067 if (t != first+2 && t != last && *t == 'E') 11068 { 11069 if (__make<__unsigned_int128_literal>(first+2, t)) 11070 first = t+1; 11071 } 11072 } 11073 break; 11074 case 'f': 11075 { 11076 if (last - (first+2) <= 8) 11077 return first; 11078 unsigned long long j; 11079 const char* t = __parse_hex_number(first+2, first+10, j); 11080 if (t != first+2 && t != last && *t == 'E') 11081 { 11082 unsigned i = static_cast<unsigned>(j); 11083 float value = *(float*)&i; 11084 if (__make<__float_literal>(value)) 11085 first = t+1; 11086 } 11087 } 11088 break; 11089 case 'd': 11090 { 11091 if (last - (first+2) <= 16) 11092 return first; 11093 unsigned long long j; 11094 const char* t = __parse_hex_number(first+2, first+18, j); 11095 if (t != first+2 && t != last && *t == 'E') 11096 { 11097 double value = *(double*)&j; 11098 if (__make<__double_literal>(value)) 11099 first = t+1; 11100 } 11101 } 11102 break; 11103 case 'e': 11104 break; 11105 case '_': 11106 if (first[2] == 'Z') 11107 { 11108 const char* t = __parse_encoding(first+3, last); 11109 if (t != first+3 && t != last && *t == 'E') 11110 first = t+1; 11111 } 11112 break; 11113 default: 11114 { 11115 // might be named type 11116 const char* t = __parse_type(first+1, last); 11117 if (t != first+1 && t != last) 11118 { 11119 if (*t != 'E') 11120 { 11121 const char* n = t; 11122 for (; n != last && isdigit(*n); ++n) 11123 ; 11124 if (n != t && n != last && *n == 'E') 11125 { 11126 if (__make<__cast_literal>(__root_, t, n)) 11127 { 11128 first = n+1; 11129 break; 11130 } 11131 } 11132 } 11133 else 11134 { 11135 first = t+1; 11136 break; 11137 } 11138 } 11139 } 11140 assert(!"case in __parse_expr_primary not implemented"); 11141 } 11142 } 11143 return first; 11144 } 11145 11146 const char* 11147 __demangle_tree::__parse_unnamed_type_name(const char* first, const char* last) 11148 { 11149 if (first != last && *first == 'U') 11150 { 11151 assert(!"__parse_unnamed_type_name not implemented"); 11152 } 11153 return first; 11154 } 11155 11156 // <ctor-dtor-name> ::= C1 # complete object constructor 11157 // ::= C2 # base object constructor 11158 // ::= C3 # complete object allocating constructor 11159 // ::= D0 # deleting destructor 11160 // ::= D1 # complete object destructor 11161 // ::= D2 # base object destructor 11162 11163 const char* 11164 __demangle_tree::__parse_ctor_dtor_name(const char* first, const char* last) 11165 { 11166 if (last-first >= 2) 11167 { 11168 switch (first[0]) 11169 { 11170 case 'C': 11171 switch (first[1]) 11172 { 11173 case '1': 11174 case '2': 11175 case '3': 11176 if (__make<__constructor>(__root_->base_name())) 11177 first += 2; 11178 break; 11179 } 11180 break; 11181 case 'D': 11182 switch (first[1]) 11183 { 11184 case '0': 11185 case '1': 11186 case '2': 11187 if (__make<__destructor>(__root_->base_name())) 11188 first += 2; 11189 break; 11190 } 11191 break; 11192 } 11193 } 11194 return first; 11195 } 11196 11197 const char* 11198 __demangle_tree::__parse_unscoped_template_name(const char* first, const char* last) 11199 { 11200 assert(!"__parse_unscoped_template_name not implemented"); 11201 } 11202 11203 // <discriminator> := _ <non-negative number> # when number < 10 11204 // := __ <non-negative number> _ # when number >= 10 11205 // extension := decimal-digit+ 11206 11207 const char* 11208 __demangle_tree::__parse_discriminator(const char* first, const char* last) 11209 { 11210 // parse but ignore discriminator 11211 if (first != last) 11212 { 11213 if (*first == '_') 11214 { 11215 const char* t1 = first+1; 11216 if (t1 != last) 11217 { 11218 if (isdigit(*t1)) 11219 first = t1+1; 11220 else if (*t1 == '_') 11221 { 11222 for (++t1; t1 != last && isdigit(*t1); ++t1) 11223 ; 11224 if (t1 != last && *t1 == '_') 11225 first = t1 + 1; 11226 } 11227 } 11228 } 11229 else if (isdigit(*first)) 11230 { 11231 const char* t1 = first+1; 11232 for (; t1 != last && isdigit(*t1); ++t1) 11233 ; 11234 first = t1; 11235 } 11236 } 11237 return first; 11238 } 11239 11240 // <local-name> := Z <function encoding> E <entity name> [<discriminator>] 11241 // := Z <function encoding> E s [<discriminator>] 11242 // := Z <function encoding> Ed [ <parameter number> ] _ <entity name> 11243 11244 const char* 11245 __demangle_tree::__parse_local_name(const char* first, const char* last) 11246 { 11247 if (first != last && *first == 'Z') 11248 { 11249 const char* t = __parse_encoding(first+1, last); 11250 if (t != first+1 && t != last && *t == 'E' && ++t != last) 11251 { 11252 __node* encoding = __root_; 11253 switch (*t) 11254 { 11255 case 's': 11256 { 11257 const char*t1 = __parse_discriminator(t+1, last); 11258 if (__make<__string_literal>()) 11259 { 11260 if (__make<__nested_delimeter>(encoding, __root_)) 11261 first = t1; 11262 } 11263 } 11264 break; 11265 case 'd': 11266 assert(!"__parse_local_name d not implemented"); 11267 break; 11268 default: 11269 { 11270 const char*t1 = __parse_name(t, last); 11271 if (t1 != t) 11272 { 11273 // parse but ignore discriminator 11274 t1 = __parse_discriminator(t1, last); 11275 if (__make<__nested_delimeter>(encoding, __root_)) 11276 first = t1; 11277 } 11278 } 11279 break; 11280 } 11281 } 11282 } 11283 return first; 11284 } 11285 11286 // <destructor-name> ::= <unresolved-type> # e.g., ~T or ~decltype(f()) 11287 // ::= <simple-id> # e.g., ~A<2*N> 11288 11289 const char* 11290 __demangle_tree::__parse_destructor_name(const char* first, const char* last) 11291 { 11292 if (first != last) 11293 { 11294 const char* t = __parse_unresolved_type(first, last); 11295 if (t == first) 11296 t = __parse_simple_id(first, last); 11297 if (t != first && __make<__destructor>(__root_)) 11298 first = t; 11299 } 11300 return first; 11301 } 11302 11303 // <simple-id> ::= <source-name> [ <template-args> ] 11304 11305 const char* 11306 __demangle_tree::__parse_simple_id(const char* first, const char* last) 11307 { 11308 if (first != last) 11309 { 11310 const char* t = __parse_source_name(first, last); 11311 if (t != first) 11312 first = __parse_template_args(t, last); 11313 else 11314 first = t; 11315 } 11316 return first; 11317 } 11318 11319 // <base-unresolved-name> ::= <simple-id> # unresolved name 11320 // extension ::= <operator-name> # unresolved operator-function-id 11321 // extension ::= <operator-name> <template-args> # unresolved operator template-id 11322 // ::= on <operator-name> # unresolved operator-function-id 11323 // ::= on <operator-name> <template-args> # unresolved operator template-id 11324 // ::= dn <destructor-name> # destructor or pseudo-destructor; 11325 // # e.g. ~X or ~X<N-1> 11326 11327 const char* 11328 __demangle_tree::__parse_base_unresolved_name(const char* first, const char* last) 11329 { 11330 if (last - first >= 2) 11331 { 11332 if ((first[0] == 'o' || first[0] == 'd') && first[1] == 'n') 11333 { 11334 if (first[0] == 'o') 11335 { 11336 const char* t = __parse_operator_name(first+2, last); 11337 if (t != first+2) 11338 first = __parse_template_args(t, last); 11339 else 11340 first = t; 11341 } 11342 else 11343 { 11344 const char* t = __parse_destructor_name(first+2, last); 11345 if (t != first+2) 11346 first = t; 11347 } 11348 } 11349 else 11350 { 11351 const char* t = __parse_simple_id(first, last); 11352 if (t == first) 11353 { 11354 t = __parse_operator_name(first, last); 11355 if (t != first) 11356 t = __parse_template_args(t, last); 11357 } 11358 if (t != first) 11359 first = t; 11360 } 11361 } 11362 return first; 11363 } 11364 11365 // <unresolved-type> ::= <template-param> 11366 // ::= <decltype> 11367 // ::= <substitution> 11368 11369 const char* 11370 __demangle_tree::__parse_unresolved_type(const char* first, const char* last) 11371 { 11372 if (first != last) 11373 { 11374 const char* t; 11375 switch (*first) 11376 { 11377 case 'T': 11378 t = __parse_template_param(first, last); 11379 if (t != first) 11380 { 11381 if (__sub_end_ == __sub_cap_) 11382 __status_ = memory_alloc_failure; 11383 else 11384 { 11385 *__sub_end_++ = __root_; 11386 first = t; 11387 } 11388 } 11389 break; 11390 case 'D': 11391 t = __parse_decltype(first, last); 11392 if (t != first) 11393 { 11394 if (__sub_end_ == __sub_cap_) 11395 __status_ = memory_alloc_failure; 11396 else 11397 { 11398 *__sub_end_++ = __root_; 11399 first = t; 11400 } 11401 } 11402 break; 11403 case 'S': 11404 t = __parse_substitution(first, last); 11405 if (t != first) 11406 first = t; 11407 break; 11408 } 11409 } 11410 return first; 11411 } 11412 11413 // <unresolved-qualifier-level> ::= <source-name> [ <template-args> ] 11414 11415 const char* 11416 __demangle_tree::__parse_unresolved_qualifier_level(const char* first, const char* last) 11417 { 11418 if (first != last) 11419 { 11420 const char* t = __parse_source_name(first, last); 11421 if (t != first) 11422 first = __parse_template_args(t, last); 11423 } 11424 return first; 11425 } 11426 11427 // <unresolved-name> 11428 // extension ::= srN <unresolved-type> [<template-args>] <unresolved-qualifier-level>* E <base-unresolved-name> 11429 // ::= [gs] <base-unresolved-name> # x or (with "gs") ::x 11430 // ::= [gs] sr <unresolved-qualifier-level>+ E <base-unresolved-name> 11431 // # A::x, N::y, A<T>::z; "gs" means leading "::" 11432 // ::= sr <unresolved-type> <base-unresolved-name> # T::x / decltype(p)::x 11433 // # T::N::x /decltype(p)::N::x 11434 // (ignored) ::= srN <unresolved-type> <unresolved-qualifier-level>+ E <base-unresolved-name> 11435 11436 const char* 11437 __demangle_tree::__parse_unresolved_name(const char* first, const char* last) 11438 { 11439 if (last - first > 2) 11440 { 11441 const char* t = first; 11442 bool global = false; 11443 if (t[0] == 'g' && t[1] == 's') 11444 { 11445 global = true; 11446 t += 2; 11447 } 11448 const char* t2 = __parse_base_unresolved_name(t, last); 11449 if (t2 != t) 11450 { 11451 if (__make<__unresolved_name>(global, (__node*)0, __root_)) 11452 first = t2; 11453 } 11454 else if (last - t > 2 && t[0] == 's' && t[1] == 'r') 11455 { 11456 if (!global && t[2] == 'N') 11457 { 11458 t2 = __parse_unresolved_type(t+3, last); 11459 if (t2 != t+3 && t2 != last) 11460 { 11461 t = __parse_template_args(t2, last); 11462 if (t == last) 11463 return first; 11464 __node* name = __root_; 11465 while (*t != 'E') 11466 { 11467 t2 = __parse_unresolved_qualifier_level(t, last); 11468 if (t2 == t || t2 == last) 11469 return first; 11470 if (!__make<__nested_delimeter>(name, __root_)) 11471 return first; 11472 name = __root_; 11473 t = t2; 11474 } 11475 t2 = __parse_base_unresolved_name(++t, last); 11476 if (t2 != t && __make<__unresolved_name>(false, name, __root_)) 11477 first = t2; 11478 } 11479 } 11480 else 11481 { 11482 if (!global) 11483 { 11484 t2 = __parse_unresolved_type(t+2, last); 11485 if (t2 != t+2) 11486 { 11487 t = t2; 11488 __node* name = __root_; 11489 t2 = __parse_base_unresolved_name(t, last); 11490 if (t2 != t && __make<__unresolved_name>(false, name, __root_)) 11491 return t2; 11492 return first; 11493 } 11494 } 11495 t2 = __parse_unresolved_qualifier_level(t+2, last); 11496 if (t2 != t+2 && t2 != last) 11497 { 11498 __node* name = __root_; 11499 t = t2; 11500 while (*t != 'E') 11501 { 11502 t2 = __parse_unresolved_qualifier_level(t, last); 11503 if (t2 == t || t2 == last) 11504 return first; 11505 if (!__make<__nested_delimeter>(name, __root_)) 11506 return first; 11507 name = __root_; 11508 t = t2; 11509 } 11510 t2 = __parse_base_unresolved_name(++t, last); 11511 if (t2 != t && __make<__unresolved_name>(global, name, __root_)) 11512 first = t2; 11513 } 11514 } 11515 } 11516 } 11517 return first; 11518 } 11519 11520 // <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, first parameter 11521 // ::= fp <top-level CV-qualifiers> <parameter-2 non-negative number> _ # L == 0, second and later parameters 11522 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> _ # L > 0, first parameter 11523 // ::= fL <L-1 non-negative number> p <top-level CV-qualifiers> 11524 11525 const char* 11526 __demangle_tree::__parse_function_param(const char* first, const char* last) 11527 { 11528 if (last - first >= 3 && *first == 'f') 11529 { 11530 if (first[1] == 'p') 11531 { 11532 assert(!"__parse_function_param not implemented"); 11533 } 11534 else if (first[1] == 'L') 11535 { 11536 assert(!"__parse_function_param not implemented"); 11537 } 11538 } 11539 return first; 11540 } 11541 11542 // at <type> # alignof (a type) 11543 11544 const char* 11545 __demangle_tree::__parse_alignof_expr(const char* first, const char* last) 11546 { 11547 if (last - first >= 3 && first[0] == 'a' && first[1] == 't') 11548 { 11549 const char* t = __parse_type(first+2, last); 11550 if (t != first+2) 11551 { 11552 if (__make<__operator_alignof_expression>(__root_)) 11553 first = t; 11554 } 11555 } 11556 return first; 11557 } 11558 11559 // cc <type> <expression> # const_cast<type> (expression) 11560 11561 const char* 11562 __demangle_tree::__parse_const_cast_expr(const char* first, const char* last) 11563 { 11564 if (last - first >= 3 && first[0] == 'c' && first[1] == 'c') 11565 { 11566 const char* t = __parse_type(first+2, last); 11567 if (t != first+2) 11568 { 11569 __node* type = __root_; 11570 const char* t1 = __parse_expression(t, last); 11571 if (t1 != t) 11572 { 11573 if (__make<__const_cast>(type, __root_)) 11574 first = t1; 11575 } 11576 } 11577 } 11578 return first; 11579 } 11580 11581 // cl <expression>+ E # call 11582 11583 const char* 11584 __demangle_tree::__parse_call_expr(const char* first, const char* last) 11585 { 11586 if (last - first >= 4 && first[0] == 'c' && first[1] == 'l') 11587 { 11588 const char* t = __parse_expression(first+2, last); 11589 if (t != first+2) 11590 { 11591 if (t == last) 11592 return first; 11593 __node* name = __root_; 11594 __node* args = 0; 11595 __node* prev = 0; 11596 while (*t != 'E') 11597 { 11598 const char* t1 = __parse_expression(t, last); 11599 if (t1 == t || t1 == last) 11600 return first; 11601 if (!__make<__list>(__root_)) 11602 return first; 11603 if (args == 0) 11604 args = __root_; 11605 if (prev) 11606 { 11607 prev->__right_ = __root_; 11608 __root_->__size_ = prev->__size_ + 1; 11609 } 11610 prev = __root_; 11611 t = t1; 11612 } 11613 ++t; 11614 if (__make<__call_expr>(name, args)) 11615 first = t; 11616 } 11617 } 11618 return first; 11619 } 11620 11621 // cv <type> <expression> # conversion with one argument 11622 // cv <type> _ <expression>* E # conversion with a different number of arguments 11623 11624 const char* 11625 __demangle_tree::__parse_conversion_expr(const char* first, const char* last) 11626 { 11627 if (last - first >= 3 && first[0] == 'c' && first[1] == 'v') 11628 { 11629 const char* t = __parse_type(first+2, last); 11630 if (t != first+2 && t != last) 11631 { 11632 __node* type = __root_; 11633 __node* args = 0; 11634 if (*t != '_') 11635 { 11636 const char* t1 = __parse_expression(t, last); 11637 if (t1 == t) 11638 return first; 11639 args = __root_; 11640 t = t1; 11641 } 11642 else 11643 { 11644 ++t; 11645 if (t == last) 11646 return first; 11647 __node* prev = 0; 11648 while (*t != 'E') 11649 { 11650 const char* t1 = __parse_expression(t, last); 11651 if (t1 == t || t1 == last) 11652 return first; 11653 if (!__make<__list>(__root_)) 11654 return first; 11655 if (args == 0) 11656 args = __root_; 11657 if (prev) 11658 { 11659 prev->__right_ = __root_; 11660 __root_->__size_ = prev->__size_ + 1; 11661 } 11662 prev = __root_; 11663 t = t1; 11664 } 11665 ++t; 11666 } 11667 if (__make<__operator_cast>(type, args)) 11668 first = t; 11669 } 11670 } 11671 return first; 11672 } 11673 11674 // [gs] da <expression> # delete[] expression 11675 11676 const char* 11677 __demangle_tree::__parse_delete_array_expr(const char* first, const char* last) 11678 { 11679 if (last - first >= 4) 11680 { 11681 const char* t = first; 11682 bool parsed_gs = false; 11683 if (t[0] == 'g' && t[1] == 's') 11684 { 11685 t += 2; 11686 parsed_gs = true; 11687 } 11688 if (t[0] == 'd' && t[1] == 'a') 11689 { 11690 t += 2; 11691 const char* t1 = __parse_expression(t, last); 11692 if (t1 != t) 11693 { 11694 if (__make<__delete_array_expr>(parsed_gs, __root_)) 11695 first = t1; 11696 } 11697 } 11698 } 11699 return first; 11700 } 11701 11702 // dc <type> <expression> # dynamic_cast<type> (expression) 11703 11704 const char* 11705 __demangle_tree::__parse_dynamic_cast_expr(const char* first, const char* last) 11706 { 11707 if (last - first >= 3 && first[0] == 'd' && first[1] == 'c') 11708 { 11709 const char* t = __parse_type(first+2, last); 11710 if (t != first+2) 11711 { 11712 __node* type = __root_; 11713 const char* t1 = __parse_expression(t, last); 11714 if (t1 != t) 11715 { 11716 if (__make<__dynamic_cast>(type, __root_)) 11717 first = t1; 11718 } 11719 } 11720 } 11721 return first; 11722 } 11723 11724 // [gs] dl <expression> # delete expression 11725 11726 const char* 11727 __demangle_tree::__parse_delete_expr(const char* first, const char* last) 11728 { 11729 if (last - first >= 4) 11730 { 11731 const char* t = first; 11732 bool parsed_gs = false; 11733 if (t[0] == 'g' && t[1] == 's') 11734 { 11735 t += 2; 11736 parsed_gs = true; 11737 } 11738 if (t[0] == 'd' && t[1] == 'l') 11739 { 11740 t += 2; 11741 const char* t1 = __parse_expression(t, last); 11742 if (t1 != t) 11743 { 11744 if (__make<__delete_expr>(parsed_gs, __root_)) 11745 first = t1; 11746 } 11747 } 11748 } 11749 return first; 11750 } 11751 11752 // ds <expression> <expression> # expr.*expr 11753 11754 const char* 11755 __demangle_tree::__parse_dot_star_expr(const char* first, const char* last) 11756 { 11757 if (last - first >= 3 && first[0] == 'd' && first[1] == 's') 11758 { 11759 const char* t = __parse_expression(first+2, last); 11760 if (t != first+2) 11761 { 11762 __node* expr = __root_; 11763 const char* t1 = __parse_expression(t, last); 11764 if (t1 != t) 11765 { 11766 if (__make<__dot_star_expr>(expr, __root_)) 11767 first = t1; 11768 } 11769 } 11770 } 11771 return first; 11772 } 11773 11774 // dt <expression> <unresolved-name> # expr.name 11775 11776 const char* 11777 __demangle_tree::__parse_dot_expr(const char* first, const char* last) 11778 { 11779 if (last - first >= 3 && first[0] == 'd' && first[1] == 't') 11780 { 11781 const char* t = __parse_expression(first+2, last); 11782 if (t != first+2) 11783 { 11784 __node* expr = __root_; 11785 const char* t1 = __parse_unresolved_name(t, last); 11786 if (t1 != t) 11787 { 11788 if (__make<__dot_expr>(expr, __root_)) 11789 first = t1; 11790 } 11791 } 11792 } 11793 return first; 11794 } 11795 11796 // mm_ <expression> # prefix -- 11797 11798 const char* 11799 __demangle_tree::__parse_decrement_expr(const char* first, const char* last) 11800 { 11801 if (last - first > 3 && first[0] == 'm' && first[1] == 'm' && first[2] == '_') 11802 { 11803 const char* t = __parse_expression(first+3, last); 11804 if (t != first+3) 11805 { 11806 if (__make<__operator_decrement>(true, __root_)) 11807 first = t; 11808 } 11809 } 11810 return first; 11811 } 11812 11813 // pp_ <expression> # prefix ++ 11814 11815 const char* 11816 __demangle_tree::__parse_increment_expr(const char* first, const char* last) 11817 { 11818 if (last - first > 3 && first[0] == 'p' && first[1] == 'p' && first[2] == '_') 11819 { 11820 const char* t = __parse_expression(first+3, last); 11821 if (t != first+3) 11822 { 11823 if (__make<__operator_increment>(true, __root_)) 11824 first = t; 11825 } 11826 } 11827 return first; 11828 } 11829 11830 // [gs] nw <expression>* _ <type> E # new (expr-list) type 11831 // [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 11832 // [gs] na <expression>* _ <type> E # new[] (expr-list) type 11833 // [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 11834 // <initializer> ::= pi <expression>* E # parenthesized initialization 11835 11836 const char* 11837 __demangle_tree::__parse_new_expr(const char* first, const char* last) 11838 { 11839 if (last - first >= 4) 11840 { 11841 const char* t = first; 11842 bool parsed_gs = false; 11843 if (t[0] == 'g' && t[1] == 's') 11844 { 11845 t += 2; 11846 parsed_gs = true; 11847 } 11848 if (t[0] == 'n' && (t[1] == 'w' || t[1] == 'a')) 11849 { 11850 bool is_array = t[1] == 'a'; 11851 t += 2; 11852 if (t == last) 11853 return first; 11854 __node* expr = 0; 11855 __node* prev = 0; 11856 while (*t != '_') 11857 { 11858 const char* t1 = __parse_expression(t, last); 11859 if (t1 == t || t1 == last) 11860 return first; 11861 if (!__make<__list>(__root_)) 11862 return first; 11863 if (expr == 0) 11864 expr = __root_; 11865 if (prev) 11866 { 11867 prev->__right_ = __root_; 11868 __root_->__size_ = prev->__size_ + 1; 11869 } 11870 prev = __root_; 11871 t = t1; 11872 } 11873 ++t; 11874 const char* t1 = __parse_type(t, last); 11875 if (t1 == t || t1 == last) 11876 return first; 11877 t = t1; 11878 __node* type = __root_; 11879 __node* init = 0; 11880 prev = 0; 11881 bool has_init = false; 11882 if (last - t >= 3 && t[0] == 'p' && t[1] == 'i') 11883 { 11884 t += 2; 11885 has_init = true; 11886 while (*t != 'E') 11887 { 11888 t1 = __parse_expression(t, last); 11889 if (t1 == t || t1 == last) 11890 return first; 11891 if (!__make<__list>(__root_)) 11892 return first; 11893 if (init == 0) 11894 init = __root_; 11895 if (prev) 11896 { 11897 prev->__right_ = __root_; 11898 __root_->__size_ = prev->__size_ + 1; 11899 } 11900 prev = __root_; 11901 t = t1; 11902 } 11903 } 11904 if (*t != 'E') 11905 return first; 11906 if (__make<__new_expr>(parsed_gs, is_array, has_init, 11907 expr, type, init)) 11908 first = t; 11909 } 11910 } 11911 return first; 11912 } 11913 11914 // pt <expression> <unresolved-name> # expr->name 11915 11916 const char* 11917 __demangle_tree::__parse_arrow_expr(const char* first, const char* last) 11918 { 11919 if (last - first >= 3 && first[0] == 'p' && first[1] == 't') 11920 { 11921 const char* t = __parse_expression(first+2, last); 11922 if (t != first+2) 11923 { 11924 __node* expr = __root_; 11925 const char* t1 = __parse_unresolved_name(t, last); 11926 if (t1 != t) 11927 { 11928 if (__make<__arrow_expr>(expr, __root_)) 11929 first = t1; 11930 } 11931 } 11932 } 11933 return first; 11934 } 11935 11936 // rc <type> <expression> # reinterpret_cast<type> (expression) 11937 11938 const char* 11939 __demangle_tree::__parse_reinterpret_cast_expr(const char* first, const char* last) 11940 { 11941 if (last - first >= 3 && first[0] == 'r' && first[1] == 'c') 11942 { 11943 const char* t = __parse_type(first+2, last); 11944 if (t != first+2) 11945 { 11946 __node* type = __root_; 11947 const char* t1 = __parse_expression(t, last); 11948 if (t1 != t) 11949 { 11950 if (__make<__reinterpret_cast>(type, __root_)) 11951 first = t1; 11952 } 11953 } 11954 } 11955 return first; 11956 } 11957 11958 // sc <type> <expression> # static_cast<type> (expression) 11959 11960 const char* 11961 __demangle_tree::__parse_static_cast_expr(const char* first, const char* last) 11962 { 11963 if (last - first >= 3 && first[0] == 's' && first[1] == 'c') 11964 { 11965 const char* t = __parse_type(first+2, last); 11966 if (t != first+2) 11967 { 11968 __node* type = __root_; 11969 const char* t1 = __parse_expression(t, last); 11970 if (t1 != t) 11971 { 11972 if (__make<__static_cast>(type, __root_)) 11973 first = t1; 11974 } 11975 } 11976 } 11977 return first; 11978 } 11979 11980 // st <type> # sizeof (a type) 11981 11982 const char* 11983 __demangle_tree::__parse_sizeof_type_expr(const char* first, const char* last) 11984 { 11985 if (last - first >= 3 && first[0] == 's' && first[1] == 't') 11986 { 11987 const char* t = __parse_type(first+2, last); 11988 if (t != first+2) 11989 { 11990 if (__make<__operator_sizeof_expression>(__root_)) 11991 first = t; 11992 } 11993 } 11994 return first; 11995 } 11996 11997 // sZ <template-param> # size of a parameter pack 11998 11999 const char* 12000 __demangle_tree::__parse_sizeof_param_pack_expr(const char* first, const char* last) 12001 { 12002 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'T') 12003 { 12004 const char* t = __parse_template_param(first+2, last); 12005 if (t != first+2) 12006 { 12007 if (__make<__operator_sizeof_param_pack>(__root_)) 12008 first = t; 12009 } 12010 } 12011 return first; 12012 } 12013 12014 // sZ <function-param> # size of a function parameter pack 12015 12016 const char* 12017 __demangle_tree::__parse_sizeof_function_param_pack_expr(const char* first, const char* last) 12018 { 12019 if (last - first >= 3 && first[0] == 's' && first[1] == 'Z' && first[2] == 'f') 12020 { 12021 const char* t = __parse_function_param(first+2, last); 12022 if (t != first+2) 12023 { 12024 if (__make<__operator_sizeof_param_pack>(__root_)) 12025 first = t; 12026 } 12027 } 12028 return first; 12029 } 12030 12031 // sp <expression> # pack expansion 12032 12033 const char* 12034 __demangle_tree::__parse_pack_expansion(const char* first, const char* last) 12035 { 12036 if (last - first >= 3 && first[0] == 's' && first[1] == 'p') 12037 { 12038 const char* t = __parse_expression(first+2, last); 12039 if (t != first+2) 12040 { 12041 if (__make<__pack_expansion>(__root_)) 12042 first = t; 12043 } 12044 } 12045 return first; 12046 } 12047 12048 // te <expression> # typeid (expression) 12049 // ti <type> # typeid (type) 12050 12051 const char* 12052 __demangle_tree::__parse_typeid_expr(const char* first, const char* last) 12053 { 12054 if (last - first >= 3 && first[0] == 't' && (first[1] == 'e' || first[1] == 'i')) 12055 { 12056 const char* t; 12057 if (first[1] == 'e') 12058 t = __parse_expression(first+2, last); 12059 else 12060 t = __parse_type(first+2, last); 12061 if (t != first+2) 12062 { 12063 if (__make<__typeid>(__root_)) 12064 first = t; 12065 } 12066 } 12067 return first; 12068 } 12069 12070 // tw <expression> # throw expression 12071 12072 const char* 12073 __demangle_tree::__parse_throw_expr(const char* first, const char* last) 12074 { 12075 if (last - first >= 3 && first[0] == 't' && first[1] == 'w') 12076 { 12077 const char* t = __parse_expression(first+2, last); 12078 if (t != first+2) 12079 { 12080 if (__make<__throw>(__root_)) 12081 first = t; 12082 } 12083 } 12084 return first; 12085 } 12086 12087 // <expression> ::= <unary operator-name> <expression> 12088 // ::= <binary operator-name> <expression> <expression> 12089 // ::= <ternary operator-name> <expression> <expression> <expression> 12090 // ::= cl <expression>+ E # call 12091 // ::= cv <type> <expression> # conversion with one argument 12092 // ::= cv <type> _ <expression>* E # conversion with a different number of arguments 12093 // ::= [gs] nw <expression>* _ <type> E # new (expr-list) type 12094 // ::= [gs] nw <expression>* _ <type> <initializer> # new (expr-list) type (init) 12095 // ::= [gs] na <expression>* _ <type> E # new[] (expr-list) type 12096 // ::= [gs] na <expression>* _ <type> <initializer> # new[] (expr-list) type (init) 12097 // ::= [gs] dl <expression> # delete expression 12098 // ::= [gs] da <expression> # delete[] expression 12099 // ::= pp_ <expression> # prefix ++ 12100 // ::= mm_ <expression> # prefix -- 12101 // ::= ti <type> # typeid (type) 12102 // ::= te <expression> # typeid (expression) 12103 // ::= dc <type> <expression> # dynamic_cast<type> (expression) 12104 // ::= sc <type> <expression> # static_cast<type> (expression) 12105 // ::= cc <type> <expression> # const_cast<type> (expression) 12106 // ::= rc <type> <expression> # reinterpret_cast<type> (expression) 12107 // ::= st <type> # sizeof (a type) 12108 // ::= at <type> # alignof (a type) 12109 // ::= <template-param> 12110 // ::= <function-param> 12111 // ::= dt <expression> <unresolved-name> # expr.name 12112 // ::= pt <expression> <unresolved-name> # expr->name 12113 // ::= ds <expression> <expression> # expr.*expr 12114 // ::= sZ <template-param> # size of a parameter pack 12115 // ::= sZ <function-param> # size of a function parameter pack 12116 // ::= sp <expression> # pack expansion 12117 // ::= tw <expression> # throw expression 12118 // ::= tr # throw with no operand (rethrow) 12119 // ::= <unresolved-name> # f(p), N::f(p), ::f(p), 12120 // # freestanding dependent name (e.g., T::x), 12121 // # objectless nonstatic member reference 12122 // ::= <expr-primary> 12123 12124 const char* 12125 __demangle_tree::__parse_expression(const char* first, const char* last) 12126 { 12127 if (last - first >= 2) 12128 { 12129 const char* t = first; 12130 bool parsed_gs = false; 12131 if (last - first >= 4 && t[0] == 'g' && t[1] == 's') 12132 { 12133 t += 2; 12134 parsed_gs = true; 12135 } 12136 switch (*t) 12137 { 12138 case 'L': 12139 t = __parse_expr_primary(first, last); 12140 break; 12141 case 'T': 12142 t = __parse_template_param(first, last); 12143 break; 12144 case 'f': 12145 t = __parse_function_param(first, last); 12146 break; 12147 case 'a': 12148 if (t[1] == 't') 12149 t = __parse_alignof_expr(first, last); 12150 break; 12151 case 'c': 12152 switch (t[1]) 12153 { 12154 case 'c': 12155 t = __parse_const_cast_expr(first, last); 12156 break; 12157 case 'l': 12158 t = __parse_call_expr(first, last); 12159 break; 12160 case 'v': 12161 t = __parse_conversion_expr(first, last); 12162 break; 12163 } 12164 break; 12165 case 'd': 12166 switch (t[1]) 12167 { 12168 case 'a': 12169 t = __parse_delete_array_expr(first, last); 12170 break; 12171 case 'c': 12172 t = __parse_dynamic_cast_expr(first, last); 12173 break; 12174 case 'l': 12175 t = __parse_delete_expr(first, last); 12176 break; 12177 case 's': 12178 t = __parse_dot_star_expr(first, last); 12179 break; 12180 case 't': 12181 t = __parse_dot_expr(first, last); 12182 break; 12183 } 12184 break; 12185 case 'm': 12186 t = __parse_decrement_expr(first, last); 12187 break; 12188 case 'n': 12189 switch (t[1]) 12190 { 12191 case 'a': 12192 case 'w': 12193 t = __parse_new_expr(first, last); 12194 break; 12195 } 12196 break; 12197 case 'p': 12198 switch (t[1]) 12199 { 12200 case 'p': 12201 t = __parse_increment_expr(first, last); 12202 break; 12203 case 't': 12204 t = __parse_arrow_expr(first, last); 12205 break; 12206 } 12207 break; 12208 case 'r': 12209 t = __parse_reinterpret_cast_expr(first, last); 12210 break; 12211 case 's': 12212 switch (t[1]) 12213 { 12214 case 'c': 12215 t = __parse_static_cast_expr(first, last); 12216 break; 12217 case 'p': 12218 t = __parse_pack_expansion(first, last); 12219 break; 12220 case 't': 12221 t = __parse_sizeof_type_expr(first, last); 12222 break; 12223 case 'Z': 12224 if (last - t >= 3) 12225 { 12226 switch (t[2]) 12227 { 12228 case 'T': 12229 t = __parse_sizeof_param_pack_expr(first, last); 12230 break; 12231 case 'f': 12232 t = __parse_sizeof_function_param_pack_expr(first, last); 12233 break; 12234 } 12235 } 12236 break; 12237 } 12238 break; 12239 case 't': 12240 switch (t[1]) 12241 { 12242 case 'e': 12243 case 'i': 12244 t = __parse_typeid_expr(first, last); 12245 break; 12246 case 'r': 12247 if (__make<__rethrow>()) 12248 t = first +2; 12249 break; 12250 case 'w': 12251 t = __parse_throw_expr(first, last); 12252 break; 12253 } 12254 break; 12255 } 12256 if ((!parsed_gs && t == first) || (parsed_gs && t == first+2)) 12257 { 12258 int op; 12259 t = __parse_operator_name(first, last, &op); 12260 if (t == first) 12261 first = __parse_unresolved_name(first, last); 12262 else 12263 first = t; 12264 } 12265 else 12266 first = t; 12267 } 12268 return first; 12269 } 12270 12271 // <array-type> ::= A <positive dimension number> _ <element type> 12272 // ::= A [<dimension expression>] _ <element type> 12273 12274 const char* 12275 __demangle_tree::__parse_array_type(const char* first, const char* last) 12276 { 12277 if (first != last && *first == 'A' && first+1 != last) 12278 { 12279 if (first[1] == '_') 12280 { 12281 const char* t = __parse_type(first+2, last); 12282 if (t != first+2) 12283 { 12284 if (__make<__array>(__root_)) 12285 first = t; 12286 } 12287 } 12288 else if ('1' <= first[1] && first[1] <= '9') 12289 { 12290 size_t dim = first[1] - '0'; 12291 const char* t = first+2; 12292 for (; t != last && isdigit(*t); ++t) 12293 dim = dim * 10 + *t - '0'; 12294 if (t != last && *t == '_') 12295 { 12296 const char* t2 = __parse_type(t+1, last); 12297 if (t2 != t+1) 12298 { 12299 if (__make<__array>(__root_, dim)) 12300 first = t2; 12301 } 12302 } 12303 } 12304 else 12305 { 12306 const char* t = __parse_expression(first+1, last); 12307 if (t != first+1 && t != last && *t == '_') 12308 { 12309 __node* dim = __root_; 12310 const char* t2 = __parse_type(++t, last); 12311 if (t2 != t) 12312 { 12313 if (__make<__array>(__root_, dim)) 12314 first = t2; 12315 } 12316 } 12317 } 12318 } 12319 return first; 12320 } 12321 12322 // <class-enum-type> ::= <name> 12323 12324 const char* 12325 __demangle_tree::__parse_class_enum_type(const char* first, const char* last) 12326 { 12327 return __parse_name(first, last); 12328 } 12329 12330 // <pointer-to-member-type> ::= M <class type> <member type> 12331 12332 const char* 12333 __demangle_tree::__parse_pointer_to_member_type(const char* first, const char* last) 12334 { 12335 if (first != last && *first == 'M') 12336 { 12337 const char* t = __parse_type(first+1, last); 12338 if (t != first+1) 12339 { 12340 __node* class_type = __root_; 12341 const char* t2 = __parse_type(t, last, true, true); 12342 if (t2 != t) 12343 { 12344 if (__make<__pointer_to_member_type>(class_type, __root_)) 12345 first = t2; 12346 } 12347 } 12348 } 12349 return first; 12350 } 12351 12352 // <decltype> ::= Dt <expression> E # decltype of an id-expression or class member access (C++0x) 12353 // ::= DT <expression> E # decltype of an expression (C++0x) 12354 12355 const char* 12356 __demangle_tree::__parse_decltype(const char* first, const char* last) 12357 { 12358 if (last - first >= 4 && first[0] == 'D') 12359 { 12360 switch (first[1]) 12361 { 12362 case 't': 12363 case 'T': 12364 { 12365 const char* t = __parse_expression(first+2, last); 12366 if (t != first+2 && t != last && *t == 'E') 12367 { 12368 if (__make<__decltype_node>(__root_)) 12369 first = t+1; 12370 } 12371 } 12372 break; 12373 } 12374 } 12375 return first; 12376 } 12377 12378 // <template-param> ::= T_ # first template parameter 12379 // ::= T <parameter-2 non-negative number> _ 12380 12381 const char* 12382 __demangle_tree::__parse_template_param(const char* first, const char* last) 12383 { 12384 if (last - first >= 2) 12385 { 12386 if (*first == 'T') 12387 { 12388 if (first[1] == '_') 12389 { 12390 if (__t_begin_ != __t_end_) 12391 { 12392 if (__make<__sub>(*__t_begin_)) 12393 first += 2; 12394 } 12395 else 12396 { 12397 if (__make<__sub>(size_t(0))) 12398 { 12399 first += 2; 12400 __fix_forward_references_ = true; 12401 } 12402 } 12403 } 12404 else if (isdigit(first[1])) 12405 { 12406 const char* t = first+1; 12407 size_t sub = *t - '0'; 12408 for (++t; t != last && isdigit(*t); ++t) 12409 { 12410 sub *= 10; 12411 sub += *t - '0'; 12412 } 12413 if (t == last || *t != '_') 12414 return first; 12415 ++sub; 12416 if (sub < __t_end_ - __t_begin_) 12417 { 12418 if (__make<__sub>(__t_begin_[sub])) 12419 first = t+1; 12420 } 12421 else 12422 { 12423 if (__make<__sub>(sub)) 12424 { 12425 first = t+1; 12426 __fix_forward_references_ = true; 12427 } 12428 } 12429 } 12430 } 12431 } 12432 return first; 12433 } 12434 12435 // <type> ::= <builtin-type> 12436 // ::= <function-type> 12437 // ::= <class-enum-type> 12438 // ::= <array-type> 12439 // ::= <pointer-to-member-type> 12440 // ::= <template-param> 12441 // ::= <template-template-param> <template-args> 12442 // ::= <decltype> 12443 // ::= <substitution> 12444 // ::= <CV-qualifiers> <type> 12445 // ::= P <type> # pointer-to 12446 // ::= R <type> # reference-to 12447 // ::= O <type> # rvalue reference-to (C++0x) 12448 // ::= C <type> # complex pair (C 2000) 12449 // ::= G <type> # imaginary (C 2000) 12450 // ::= Dp <type> # pack expansion (C++0x) 12451 // ::= U <source-name> <type> # vendor extended type qualifier 12452 12453 const char* 12454 __demangle_tree::__parse_type(const char* first, const char* last, 12455 bool try_to_parse_template_args, 12456 bool look_for_ref_quals) 12457 { 12458 unsigned cv = 0; 12459 const char* t = __parse_cv_qualifiers(first, last, cv, look_for_ref_quals); 12460 if (t != first) 12461 { 12462 const char* t2 = __parse_type(t, last, try_to_parse_template_args); 12463 if (t2 != t) 12464 { 12465 if (__make<__cv_qualifiers>(cv, __root_)) 12466 { 12467 if (__sub_end_ == __sub_cap_) 12468 __status_ = memory_alloc_failure; 12469 else 12470 { 12471 *__sub_end_++ = __root_; 12472 first = t2; 12473 } 12474 } 12475 } 12476 return first; 12477 } 12478 if (first != last) 12479 { 12480 switch (*first) 12481 { 12482 case 'A': 12483 t = __parse_array_type(first, last); 12484 if (t != first) 12485 { 12486 if (__sub_end_ == __sub_cap_) 12487 __status_ = memory_alloc_failure; 12488 else 12489 { 12490 *__sub_end_++ = __root_; 12491 first = t; 12492 } 12493 } 12494 break; 12495 case 'C': 12496 t = __parse_type(first+1, last, try_to_parse_template_args); 12497 if (t != first+1) 12498 { 12499 if (__make<__d_complex>(__root_)) 12500 { 12501 if (__sub_end_ == __sub_cap_) 12502 __status_ = memory_alloc_failure; 12503 else 12504 { 12505 *__sub_end_++ = __root_; 12506 first = t; 12507 } 12508 } 12509 return first; 12510 } 12511 break; 12512 case 'F': 12513 t = __parse_function_type(first, last); 12514 if (t != first) 12515 { 12516 if (__sub_end_ == __sub_cap_) 12517 __status_ = memory_alloc_failure; 12518 else 12519 { 12520 *__sub_end_++ = __root_; 12521 first = t; 12522 } 12523 } 12524 break; 12525 case 'G': 12526 t = __parse_type(first+1, last, try_to_parse_template_args); 12527 if (t != first+1) 12528 { 12529 if (__make<__imaginary>(__root_)) 12530 { 12531 if (__sub_end_ == __sub_cap_) 12532 __status_ = memory_alloc_failure; 12533 else 12534 { 12535 *__sub_end_++ = __root_; 12536 first = t; 12537 } 12538 } 12539 return first; 12540 } 12541 break; 12542 case 'M': 12543 t = __parse_pointer_to_member_type(first, last); 12544 if (t != first) 12545 { 12546 if (__sub_end_ == __sub_cap_) 12547 __status_ = memory_alloc_failure; 12548 else 12549 { 12550 *__sub_end_++ = __root_; 12551 first = t; 12552 } 12553 } 12554 break; 12555 case 'O': 12556 t = __parse_type(first+1, last, try_to_parse_template_args); 12557 if (t != first+1) 12558 { 12559 if (__make<__rvalue_reference_to>(__root_)) 12560 { 12561 if (__sub_end_ == __sub_cap_) 12562 __status_ = memory_alloc_failure; 12563 else 12564 { 12565 *__sub_end_++ = __root_; 12566 first = t; 12567 } 12568 } 12569 return first; 12570 } 12571 break; 12572 case 'P': 12573 t = __parse_type(first+1, last, try_to_parse_template_args); 12574 if (t != first+1) 12575 { 12576 if (__make<__pointer_to>(__root_)) 12577 { 12578 if (__sub_end_ == __sub_cap_) 12579 __status_ = memory_alloc_failure; 12580 else 12581 { 12582 *__sub_end_++ = __root_; 12583 first = t; 12584 } 12585 } 12586 return first; 12587 } 12588 break; 12589 case 'R': 12590 t = __parse_type(first+1, last, try_to_parse_template_args); 12591 if (t != first+1) 12592 { 12593 if (__make<__lvalue_reference_to>(__root_)) 12594 { 12595 if (__sub_end_ == __sub_cap_) 12596 __status_ = memory_alloc_failure; 12597 else 12598 { 12599 *__sub_end_++ = __root_; 12600 first = t; 12601 } 12602 } 12603 return first; 12604 } 12605 break; 12606 case 'T': 12607 t = __parse_template_param(first, last); 12608 if (t != first) 12609 { 12610 if (__sub_end_ == __sub_cap_) 12611 __status_ = memory_alloc_failure; 12612 else 12613 { 12614 *__sub_end_++ = __root_; 12615 if (try_to_parse_template_args) 12616 { 12617 const char* t2 = __parse_template_args(t, last); 12618 if (t2 != t) 12619 { 12620 if (__sub_end_ < __sub_cap_) 12621 { 12622 *__sub_end_++ = __root_; 12623 first = t2; 12624 } 12625 else 12626 __status_ = memory_alloc_failure; 12627 } 12628 else 12629 { 12630 first = t; 12631 } 12632 } 12633 else 12634 { 12635 first = t; 12636 } 12637 } 12638 } 12639 break; 12640 case 'U': 12641 if (first+1 != last) 12642 { 12643 t = __parse_source_name(first+1, last); 12644 if (t != first+1) 12645 { 12646 __node* name = __root_; 12647 const char* t2 = __parse_type(t, last, try_to_parse_template_args); 12648 if (t2 != t) 12649 { 12650 if (__make<__extended_qualifier>(name, __root_)) 12651 { 12652 if (__sub_end_ == __sub_cap_) 12653 __status_ = memory_alloc_failure; 12654 else 12655 { 12656 *__sub_end_++ = __root_; 12657 first = t2; 12658 } 12659 } 12660 return first; 12661 } 12662 } 12663 } 12664 break; 12665 case 'S': 12666 if (first+1 != last && first[1] == 't') 12667 { 12668 t = __parse_class_enum_type(first, last); 12669 if (t != first) 12670 { 12671 if (__sub_end_ == __sub_cap_) 12672 __status_ = memory_alloc_failure; 12673 else 12674 { 12675 *__sub_end_++ = __root_; 12676 first = t; 12677 } 12678 } 12679 } 12680 else 12681 { 12682 t = __parse_substitution(first, last); 12683 if (t != first) 12684 { 12685 first = t; 12686 // Parsed a substitution. If the substitution is a 12687 // <template-param> it might be followed by <template-args>. 12688 t = __parse_template_args(first, last); 12689 if (t != first) 12690 { 12691 // Need to create substitution for <template-template-param> <template-args> 12692 if (__sub_end_ == __sub_cap_) 12693 __status_ = memory_alloc_failure; 12694 else 12695 { 12696 *__sub_end_++ = __root_; 12697 first = t; 12698 } 12699 } 12700 } 12701 } 12702 break; 12703 case 'D': 12704 if (first+1 != last) 12705 { 12706 switch (first[1]) 12707 { 12708 case 'p': 12709 t = __parse_type(first+2, last, try_to_parse_template_args); 12710 if (t != first+1) 12711 { 12712 if (__make<__pack_expansion>(__root_)) 12713 { 12714 if (__sub_end_ == __sub_cap_) 12715 __status_ = memory_alloc_failure; 12716 else 12717 { 12718 *__sub_end_++ = __root_; 12719 first = t; 12720 } 12721 } 12722 return first; 12723 } 12724 break; 12725 case 't': 12726 case 'T': 12727 t = __parse_decltype(first, last); 12728 if (t != first) 12729 { 12730 if (__sub_end_ == __sub_cap_) 12731 __status_ = memory_alloc_failure; 12732 else 12733 { 12734 *__sub_end_++ = __root_; 12735 first = t; 12736 } 12737 return first; 12738 } 12739 break; 12740 } 12741 } 12742 // drop through 12743 default: 12744 // must check for builtin-types before class-enum-types to avoid 12745 // ambiguities with operator-names 12746 t = __parse_builtin_type(first, last); 12747 if (t != first) 12748 { 12749 first = t; 12750 } 12751 else 12752 { 12753 t = __parse_class_enum_type(first, last); 12754 if (t != first) 12755 { 12756 if (__sub_end_ == __sub_cap_) 12757 __status_ = memory_alloc_failure; 12758 else 12759 { 12760 *__sub_end_++ = __root_; 12761 first = t; 12762 } 12763 } 12764 } 12765 break; 12766 } 12767 } 12768 return first; 12769 } 12770 12771 // <number> ::= [n] <non-negative decimal integer> 12772 12773 const char* 12774 __demangle_tree::__parse_number(const char* first, const char* last) 12775 { 12776 if (first != last) 12777 { 12778 const char* t = first; 12779 if (*t == 'n') 12780 ++t; 12781 if (t != last) 12782 { 12783 if (*t == '0') 12784 { 12785 first = t+1; 12786 } 12787 else if ('1' <= *t && *t <= '9') 12788 { 12789 first = t+1; 12790 while (first != last && isdigit(*first)) 12791 ++first; 12792 } 12793 } 12794 } 12795 return first; 12796 } 12797 12798 // <call-offset> ::= h <nv-offset> _ 12799 // ::= v <v-offset> _ 12800 // 12801 // <nv-offset> ::= <offset number> 12802 // # non-virtual base override 12803 // 12804 // <v-offset> ::= <offset number> _ <virtual offset number> 12805 // # virtual base override, with vcall offset 12806 12807 const char* 12808 __demangle_tree::__parse_call_offset(const char* first, const char* last) 12809 { 12810 if (first != last) 12811 { 12812 switch (*first) 12813 { 12814 case 'h': 12815 { 12816 const char* t = __parse_number(first + 1, last); 12817 if (t != first + 1 && t != last && *t == '_') 12818 first = t + 1; 12819 } 12820 break; 12821 case 'v': 12822 { 12823 const char* t = __parse_number(first + 1, last); 12824 if (t != first + 1 && t != last && *t == '_') 12825 { 12826 const char* t2 = __parse_number(++t, last); 12827 if (t2 != t && t2 != last && *t2 == '_') 12828 first = t2 + 1; 12829 } 12830 } 12831 break; 12832 } 12833 } 12834 return first; 12835 } 12836 12837 // <special-name> ::= TV <type> # virtual table 12838 // ::= TT <type> # VTT structure (construction vtable index) 12839 // ::= TI <type> # typeinfo structure 12840 // ::= TS <type> # typeinfo name (null-terminated byte string) 12841 // ::= Tc <call-offset> <call-offset> <base encoding> 12842 // # base is the nominal target function of thunk 12843 // # first call-offset is 'this' adjustment 12844 // # second call-offset is result adjustment 12845 // ::= T <call-offset> <base encoding> 12846 // # base is the nominal target function of thunk 12847 // ::= GV <object name> # Guard variable for one-time initialization 12848 // # No <type> 12849 12850 const char* 12851 __demangle_tree::__parse_special_name(const char* first, const char* last) 12852 { 12853 if (last - first > 2) 12854 { 12855 const char* t; 12856 switch (*first) 12857 { 12858 case 'T': 12859 switch (first[1]) 12860 { 12861 case 'V': 12862 // TV <type> # virtual table 12863 t = __parse_type(first+2, last); 12864 if (t != first+2 && __make<__vtable>(__root_)) 12865 first = t; 12866 break; 12867 case 'T': 12868 // TT <type> # VTT structure (construction vtable index) 12869 t = __parse_type(first+2, last); 12870 if (t != first+2 && __make<__VTT>(__root_)) 12871 first = t; 12872 break; 12873 case 'I': 12874 // TI <type> # typeinfo structure 12875 t = __parse_type(first+2, last); 12876 if (t != first+2 && __make<__typeinfo>(__root_)) 12877 first = t; 12878 break; 12879 case 'S': 12880 // TS <type> # typeinfo name (null-terminated byte string) 12881 t = __parse_type(first+2, last); 12882 if (t != first+2 && __make<__typeinfo_name>(__root_)) 12883 first = t; 12884 break; 12885 case 'c': 12886 // Tc <call-offset> <call-offset> <base encoding> 12887 { 12888 const char* t0 = __parse_call_offset(first+2, last); 12889 if (t0 == first+2) 12890 break; 12891 const char* t1 = __parse_call_offset(t0, last); 12892 if (t1 == t0) 12893 break; 12894 t = __parse_encoding(t1, last); 12895 if (t != t1 && __make<__covariant_return_thunk>(__root_)) 12896 first = t; 12897 } 12898 break; 12899 default: 12900 // T <call-offset> <base encoding> 12901 { 12902 const char* t0 = __parse_call_offset(first+1, last); 12903 if (t0 == first+1) 12904 break; 12905 t = __parse_encoding(t0, last); 12906 if (t != t0) 12907 { 12908 if (first[2] == 'v') 12909 { 12910 if (__make<__virtual_thunk>(__root_)) 12911 first = t; 12912 } 12913 else 12914 { 12915 if (__make<__non_virtual_thunk>(__root_)) 12916 first = t; 12917 } 12918 } 12919 } 12920 break; 12921 } 12922 break; 12923 case 'G': 12924 if (first[1] == 'V') 12925 { 12926 // GV <object name> # Guard variable for one-time initialization 12927 t = __parse_name(first+2, last); 12928 if (t != first+2 && __make<__guard_variable>(__root_)) 12929 first = t; 12930 } 12931 break; 12932 } 12933 } 12934 return first; 12935 } 12936 12937 // <operator-name> 12938 // ::= aa # && 12939 // ::= ad # & (unary) 12940 // ::= an # & 12941 // ::= aN # &= 12942 // ::= aS # = 12943 // ::= at # alignof (a type) 12944 // ::= az # alignof (an expression) 12945 // ::= cl # () 12946 // ::= cm # , 12947 // ::= co # ~ 12948 // ::= cv <type> # (cast) 12949 // ::= da # delete[] 12950 // ::= de # * (unary) 12951 // ::= dl # delete 12952 // ::= dv # / 12953 // ::= dV # /= 12954 // ::= eo # ^ 12955 // ::= eO # ^= 12956 // ::= eq # == 12957 // ::= ge # >= 12958 // ::= gt # > 12959 // ::= ix # [] 12960 // ::= le # <= 12961 // ::= ls # << 12962 // ::= lS # <<= 12963 // ::= lt # < 12964 // ::= mi # - 12965 // ::= mI # -= 12966 // ::= ml # * 12967 // ::= mL # *= 12968 // ::= mm # -- (postfix in <expression> context) 12969 // ::= na # new[] 12970 // ::= ne # != 12971 // ::= ng # - (unary) 12972 // ::= nt # ! 12973 // ::= nw # new 12974 // ::= oo # || 12975 // ::= or # | 12976 // ::= oR # |= 12977 // ::= pm # ->* 12978 // ::= pl # + 12979 // ::= pL # += 12980 // ::= pp # ++ (postfix in <expression> context) 12981 // ::= ps # + (unary) 12982 // ::= pt # -> 12983 // ::= qu # ? 12984 // ::= rm # % 12985 // ::= rM # %= 12986 // ::= rs # >> 12987 // ::= rS # >>= 12988 // ::= st # sizeof (a type) 12989 // ::= sz # sizeof (an expression) 12990 // ::= v <digit> <source-name> # vendor extended operator 12991 12992 const char* 12993 __demangle_tree::__parse_operator_name(const char* first, const char* last, int* type) 12994 { 12995 if (last - first >= 2) 12996 { 12997 switch (*first) 12998 { 12999 case 'a': 13000 switch (first[1]) 13001 { 13002 case 'a': 13003 // && 13004 if (type) 13005 { 13006 const char* t = __parse_expression(first+2, last); 13007 if (t != first+2) 13008 { 13009 __node* op1 = __root_; 13010 const char* t2 = __parse_expression(t, last); 13011 if (t != t2) 13012 { 13013 if (__make<__operator_logical_and>(op1, __root_)) 13014 { 13015 *type = 2; 13016 first = t2; 13017 } 13018 } 13019 } 13020 } 13021 else 13022 { 13023 if (__make<__operator_logical_and>()) 13024 first += 2; 13025 } 13026 break; 13027 case 'd': 13028 // & (unary) 13029 if (type) 13030 { 13031 const char* t = __parse_expression(first+2, last); 13032 if (t != first+2) 13033 { 13034 if (__make<__operator_addressof>(__root_)) 13035 { 13036 *type = 1; 13037 first = t; 13038 } 13039 } 13040 } 13041 else 13042 { 13043 if (__make<__operator_addressof>()) 13044 first += 2; 13045 } 13046 break; 13047 case 'n': 13048 // & 13049 if (type) 13050 { 13051 const char* t = __parse_expression(first+2, last); 13052 if (t != first+2) 13053 { 13054 __node* op1 = __root_; 13055 const char* t2 = __parse_expression(t, last); 13056 if (t != t2) 13057 { 13058 if (__make<__operator_bit_and>(op1, __root_)) 13059 { 13060 *type = 2; 13061 first = t2; 13062 } 13063 } 13064 } 13065 } 13066 else 13067 { 13068 if (__make<__operator_bit_and>()) 13069 first += 2; 13070 } 13071 break; 13072 case 'N': 13073 // &= 13074 if (type) 13075 { 13076 const char* t = __parse_expression(first+2, last); 13077 if (t != first+2) 13078 { 13079 __node* op1 = __root_; 13080 const char* t2 = __parse_expression(t, last); 13081 if (t != t2) 13082 { 13083 if (__make<__operator_and_equal>(op1, __root_)) 13084 { 13085 *type = 2; 13086 first = t2; 13087 } 13088 } 13089 } 13090 } 13091 else 13092 { 13093 if (__make<__operator_and_equal>()) 13094 first += 2; 13095 } 13096 break; 13097 case 'S': 13098 // = 13099 if (type) 13100 { 13101 const char* t = __parse_expression(first+2, last); 13102 if (t != first+2) 13103 { 13104 __node* op1 = __root_; 13105 const char* t2 = __parse_expression(t, last); 13106 if (t != t2) 13107 { 13108 if (__make<__operator_equal>(op1, __root_)) 13109 { 13110 *type = 2; 13111 first = t2; 13112 } 13113 } 13114 } 13115 } 13116 else 13117 { 13118 if (__make<__operator_equal>()) 13119 first += 2; 13120 } 13121 break; 13122 case 't': 13123 // alignof (a type) 13124 if (type) 13125 { 13126 const char* t = __parse_expression(first+2, last); 13127 if (t != first+2) 13128 { 13129 if (__make<__operator_alignof_type>(__root_)) 13130 { 13131 *type = -1; 13132 first = t; 13133 } 13134 } 13135 } 13136 else 13137 { 13138 if (__make<__operator_alignof_type>()) 13139 first += 2; 13140 } 13141 break; 13142 case 'z': 13143 // alignof (an expression) 13144 if (type) 13145 { 13146 const char* t = __parse_expression(first+2, last); 13147 if (t != first+2) 13148 { 13149 if (__make<__operator_alignof_expression>(__root_)) 13150 { 13151 *type = -1; 13152 first = t; 13153 } 13154 } 13155 } 13156 else 13157 { 13158 if (__make<__operator_alignof_expression>()) 13159 first += 2; 13160 } 13161 break; 13162 } 13163 break; 13164 case 'c': 13165 switch (first[1]) 13166 { 13167 case 'l': 13168 // () 13169 if (__make<__operator_paren>()) 13170 { 13171 first += 2; 13172 if (type) 13173 *type = -1; 13174 } 13175 break; 13176 case 'm': 13177 // , 13178 if (type) 13179 { 13180 const char* t = __parse_expression(first+2, last); 13181 if (t != first+2) 13182 { 13183 __node* op1 = __root_; 13184 const char* t2 = __parse_expression(t, last); 13185 if (t != t2) 13186 { 13187 if (__make<__operator_comma>(op1, __root_)) 13188 { 13189 *type = 2; 13190 first = t2; 13191 } 13192 } 13193 } 13194 } 13195 else 13196 { 13197 if (__make<__operator_comma>()) 13198 first += 2; 13199 } 13200 break; 13201 case 'o': 13202 // ~ 13203 if (type) 13204 { 13205 const char* t = __parse_expression(first+2, last); 13206 if (t != first+2) 13207 { 13208 if (__make<__operator_tilda>(__root_)) 13209 { 13210 *type = 1; 13211 first = t; 13212 } 13213 } 13214 } 13215 else 13216 { 13217 if (__make<__operator_tilda>()) 13218 first += 2; 13219 } 13220 break; 13221 case 'v': 13222 // cast <type> 13223 { 13224 const char* t = __parse_type(first+2, last, false); 13225 if (t != first+2) 13226 { 13227 __node* cast_type = __root_; 13228 if (type) 13229 { 13230 const char* t2 = __parse_expression(t, last); 13231 if (t2 != t) 13232 { 13233 if (__make<__operator_cast>(cast_type, __root_)) 13234 { 13235 *type = -1; 13236 first = t2; 13237 } 13238 } 13239 } 13240 else 13241 { 13242 if (__make<__operator_cast>(cast_type)) 13243 first = t; 13244 } 13245 } 13246 } 13247 break; 13248 } 13249 break; 13250 case 'd': 13251 switch (first[1]) 13252 { 13253 case 'a': 13254 // delete[] 13255 if (__make<__operator_delete_array>()) 13256 { 13257 first += 2; 13258 if (type) 13259 *type = -1; 13260 } 13261 break; 13262 case 'e': 13263 // * (unary) 13264 if (type) 13265 { 13266 const char* t = __parse_expression(first+2, last); 13267 if (t != first+2) 13268 { 13269 if (__make<__operator_dereference>(__root_)) 13270 { 13271 *type = 1; 13272 first = t; 13273 } 13274 } 13275 } 13276 else 13277 { 13278 if (__make<__operator_dereference>()) 13279 first += 2; 13280 } 13281 break; 13282 case 'l': 13283 // delete 13284 if (__make<__operator_delete>()) 13285 { 13286 first += 2; 13287 if (type) 13288 *type = -1; 13289 } 13290 break; 13291 case 'v': 13292 // / 13293 if (type) 13294 { 13295 const char* t = __parse_expression(first+2, last); 13296 if (t != first+2) 13297 { 13298 __node* op1 = __root_; 13299 const char* t2 = __parse_expression(t, last); 13300 if (t != t2) 13301 { 13302 if (__make<__operator_divide>(op1, __root_)) 13303 { 13304 *type = 2; 13305 first = t2; 13306 } 13307 } 13308 } 13309 } 13310 else 13311 { 13312 if (__make<__operator_divide>()) 13313 first += 2; 13314 } 13315 break; 13316 case 'V': 13317 // /= 13318 if (type) 13319 { 13320 const char* t = __parse_expression(first+2, last); 13321 if (t != first+2) 13322 { 13323 __node* op1 = __root_; 13324 const char* t2 = __parse_expression(t, last); 13325 if (t != t2) 13326 { 13327 if (__make<__operator_divide_equal>(op1, __root_)) 13328 { 13329 *type = 2; 13330 first = t2; 13331 } 13332 } 13333 } 13334 } 13335 else 13336 { 13337 if (__make<__operator_divide_equal>()) 13338 first += 2; 13339 } 13340 break; 13341 } 13342 break; 13343 case 'e': 13344 switch (first[1]) 13345 { 13346 case 'o': 13347 // ^ 13348 if (type) 13349 { 13350 const char* t = __parse_expression(first+2, last); 13351 if (t != first+2) 13352 { 13353 __node* op1 = __root_; 13354 const char* t2 = __parse_expression(t, last); 13355 if (t != t2) 13356 { 13357 if (__make<__operator_xor>(op1, __root_)) 13358 { 13359 *type = 2; 13360 first = t2; 13361 } 13362 } 13363 } 13364 } 13365 else 13366 { 13367 if (__make<__operator_xor>()) 13368 first += 2; 13369 } 13370 break; 13371 case 'O': 13372 // ^= 13373 if (type) 13374 { 13375 const char* t = __parse_expression(first+2, last); 13376 if (t != first+2) 13377 { 13378 __node* op1 = __root_; 13379 const char* t2 = __parse_expression(t, last); 13380 if (t != t2) 13381 { 13382 if (__make<__operator_xor_equal>(op1, __root_)) 13383 { 13384 *type = 2; 13385 first = t2; 13386 } 13387 } 13388 } 13389 } 13390 else 13391 { 13392 if (__make<__operator_xor_equal>()) 13393 first += 2; 13394 } 13395 break; 13396 case 'q': 13397 // == 13398 if (type) 13399 { 13400 const char* t = __parse_expression(first+2, last); 13401 if (t != first+2) 13402 { 13403 __node* op1 = __root_; 13404 const char* t2 = __parse_expression(t, last); 13405 if (t != t2) 13406 { 13407 if (__make<__operator_equality>(op1, __root_)) 13408 { 13409 *type = 2; 13410 first = t2; 13411 } 13412 } 13413 } 13414 } 13415 else 13416 { 13417 if (__make<__operator_equality>()) 13418 first += 2; 13419 } 13420 break; 13421 } 13422 break; 13423 case 'g': 13424 switch (first[1]) 13425 { 13426 case 'e': 13427 // >= 13428 if (type) 13429 { 13430 const char* t = __parse_expression(first+2, last); 13431 if (t != first+2) 13432 { 13433 __node* op1 = __root_; 13434 const char* t2 = __parse_expression(t, last); 13435 if (t != t2) 13436 { 13437 if (__make<__operator_greater_equal>(op1, __root_)) 13438 { 13439 *type = 2; 13440 first = t2; 13441 } 13442 } 13443 } 13444 } 13445 else 13446 { 13447 if (__make<__operator_greater_equal>()) 13448 first += 2; 13449 } 13450 break; 13451 case 't': 13452 // > 13453 if (type) 13454 { 13455 const char* t = __parse_expression(first+2, last); 13456 if (t != first+2) 13457 { 13458 __node* op1 = __root_; 13459 const char* t2 = __parse_expression(t, last); 13460 if (t != t2) 13461 { 13462 if (__make<__operator_greater>(op1, __root_)) 13463 { 13464 *type = 2; 13465 first = t2; 13466 } 13467 } 13468 } 13469 } 13470 else 13471 { 13472 if (__make<__operator_greater>()) 13473 first += 2; 13474 } 13475 break; 13476 } 13477 break; 13478 case 'i': 13479 // [] 13480 if (first[1] == 'x' && __make<__operator_brackets>()) 13481 { 13482 first += 2; 13483 if (type) 13484 *type = -1; 13485 } 13486 break; 13487 case 'l': 13488 switch (first[1]) 13489 { 13490 case 'e': 13491 // <= 13492 if (type) 13493 { 13494 const char* t = __parse_expression(first+2, last); 13495 if (t != first+2) 13496 { 13497 __node* op1 = __root_; 13498 const char* t2 = __parse_expression(t, last); 13499 if (t != t2) 13500 { 13501 if (__make<__operator_less_equal>(op1, __root_)) 13502 { 13503 *type = 2; 13504 first = t2; 13505 } 13506 } 13507 } 13508 } 13509 else 13510 { 13511 if (__make<__operator_less_equal>()) 13512 first += 2; 13513 } 13514 break; 13515 case 's': 13516 // << 13517 if (type) 13518 { 13519 const char* t = __parse_expression(first+2, last); 13520 if (t != first+2) 13521 { 13522 __node* op1 = __root_; 13523 const char* t2 = __parse_expression(t, last); 13524 if (t != t2) 13525 { 13526 if (__make<__operator_left_shift>(op1, __root_)) 13527 { 13528 *type = 2; 13529 first = t2; 13530 } 13531 } 13532 } 13533 } 13534 else 13535 { 13536 if (__make<__operator_left_shift>()) 13537 first += 2; 13538 } 13539 break; 13540 case 'S': 13541 // <<= 13542 if (type) 13543 { 13544 const char* t = __parse_expression(first+2, last); 13545 if (t != first+2) 13546 { 13547 __node* op1 = __root_; 13548 const char* t2 = __parse_expression(t, last); 13549 if (t != t2) 13550 { 13551 if (__make<__operator_left_shift_equal>(op1, __root_)) 13552 { 13553 *type = 2; 13554 first = t2; 13555 } 13556 } 13557 } 13558 } 13559 else 13560 { 13561 if (__make<__operator_left_shift_equal>()) 13562 first += 2; 13563 } 13564 break; 13565 case 't': 13566 // < 13567 if (type) 13568 { 13569 const char* t = __parse_expression(first+2, last); 13570 if (t != first+2) 13571 { 13572 __node* op1 = __root_; 13573 const char* t2 = __parse_expression(t, last); 13574 if (t != t2) 13575 { 13576 if (__make<__operator_less>(op1, __root_)) 13577 { 13578 *type = 2; 13579 first = t2; 13580 } 13581 } 13582 } 13583 } 13584 else 13585 { 13586 if (__make<__operator_less>()) 13587 first += 2; 13588 } 13589 break; 13590 } 13591 break; 13592 case 'm': 13593 switch (first[1]) 13594 { 13595 case 'i': 13596 // - 13597 if (type) 13598 { 13599 const char* t = __parse_expression(first+2, last); 13600 if (t != first+2) 13601 { 13602 __node* op1 = __root_; 13603 const char* t2 = __parse_expression(t, last); 13604 if (t != t2) 13605 { 13606 if (__make<__operator_minus>(op1, __root_)) 13607 { 13608 *type = 2; 13609 first = t2; 13610 } 13611 } 13612 } 13613 } 13614 else 13615 { 13616 if (__make<__operator_minus>()) 13617 first += 2; 13618 } 13619 break; 13620 case 'I': 13621 // -= 13622 if (type) 13623 { 13624 const char* t = __parse_expression(first+2, last); 13625 if (t != first+2) 13626 { 13627 __node* op1 = __root_; 13628 const char* t2 = __parse_expression(t, last); 13629 if (t != t2) 13630 { 13631 if (__make<__operator_minus_equal>(op1, __root_)) 13632 { 13633 *type = 2; 13634 first = t2; 13635 } 13636 } 13637 } 13638 } 13639 else 13640 { 13641 if (__make<__operator_minus_equal>()) 13642 first += 2; 13643 } 13644 break; 13645 case 'l': 13646 // * 13647 if (type) 13648 { 13649 const char* t = __parse_expression(first+2, last); 13650 if (t != first+2) 13651 { 13652 __node* op1 = __root_; 13653 const char* t2 = __parse_expression(t, last); 13654 if (t != t2) 13655 { 13656 if (__make<__operator_times>(op1, __root_)) 13657 { 13658 *type = 2; 13659 first = t2; 13660 } 13661 } 13662 } 13663 } 13664 else 13665 { 13666 if (__make<__operator_times>()) 13667 first += 2; 13668 } 13669 break; 13670 case 'L': 13671 // *= 13672 if (type) 13673 { 13674 const char* t = __parse_expression(first+2, last); 13675 if (t != first+2) 13676 { 13677 __node* op1 = __root_; 13678 const char* t2 = __parse_expression(t, last); 13679 if (t != t2) 13680 { 13681 if (__make<__operator_times_equal>(op1, __root_)) 13682 { 13683 *type = 2; 13684 first = t2; 13685 } 13686 } 13687 } 13688 } 13689 else 13690 { 13691 if (__make<__operator_times_equal>()) 13692 first += 2; 13693 } 13694 break; 13695 case 'm': 13696 // -- (postfix in <expression> context) 13697 if (type) 13698 { 13699 const char* t = __parse_expression(first+2, last); 13700 if (t != first+2) 13701 { 13702 if (__make<__operator_decrement>(false, __root_)) 13703 { 13704 *type = 1; 13705 first = t; 13706 } 13707 } 13708 } 13709 else 13710 { 13711 if (__make<__operator_decrement>()) 13712 first += 2; 13713 } 13714 break; 13715 } 13716 break; 13717 case 'n': 13718 switch (first[1]) 13719 { 13720 case 'a': 13721 // new[] 13722 if (__make<__operator_new_array>()) 13723 { 13724 first += 2; 13725 if (type) 13726 *type = -1; 13727 } 13728 break; 13729 case 'e': 13730 // != 13731 if (type) 13732 { 13733 const char* t = __parse_expression(first+2, last); 13734 if (t != first+2) 13735 { 13736 __node* op1 = __root_; 13737 const char* t2 = __parse_expression(t, last); 13738 if (t != t2) 13739 { 13740 if (__make<__operator_not_equal>(op1, __root_)) 13741 { 13742 *type = 2; 13743 first = t2; 13744 } 13745 } 13746 } 13747 } 13748 else 13749 { 13750 if (__make<__operator_not_equal>()) 13751 first += 2; 13752 } 13753 break; 13754 case 'g': 13755 // - (unary) 13756 if (type) 13757 { 13758 const char* t = __parse_expression(first+2, last); 13759 if (t != first+2) 13760 { 13761 if (__make<__operator_negate>(__root_)) 13762 { 13763 *type = 1; 13764 first = t; 13765 } 13766 } 13767 } 13768 else 13769 { 13770 if (__make<__operator_negate>()) 13771 first += 2; 13772 } 13773 break; 13774 case 't': 13775 // ! 13776 if (type) 13777 { 13778 const char* t = __parse_expression(first+2, last); 13779 if (t != first+2) 13780 { 13781 if (__make<__operator_logical_not>(__root_)) 13782 { 13783 *type = 1; 13784 first = t; 13785 } 13786 } 13787 } 13788 else 13789 { 13790 if (__make<__operator_logical_not>()) 13791 first += 2; 13792 } 13793 break; 13794 case 'w': 13795 // new 13796 if (__make<__operator_new>()) 13797 { 13798 first += 2; 13799 if (type) 13800 *type = -1; 13801 } 13802 break; 13803 } 13804 break; 13805 case 'o': 13806 switch (first[1]) 13807 { 13808 case 'o': 13809 // || 13810 if (type) 13811 { 13812 const char* t = __parse_expression(first+2, last); 13813 if (t != first+2) 13814 { 13815 __node* op1 = __root_; 13816 const char* t2 = __parse_expression(t, last); 13817 if (t != t2) 13818 { 13819 if (__make<__operator_logical_or>(op1, __root_)) 13820 { 13821 *type = 2; 13822 first = t2; 13823 } 13824 } 13825 } 13826 } 13827 else 13828 { 13829 if (__make<__operator_logical_or>()) 13830 first += 2; 13831 } 13832 break; 13833 case 'r': 13834 // | 13835 if (type) 13836 { 13837 const char* t = __parse_expression(first+2, last); 13838 if (t != first+2) 13839 { 13840 __node* op1 = __root_; 13841 const char* t2 = __parse_expression(t, last); 13842 if (t != t2) 13843 { 13844 if (__make<__operator_bit_or>(op1, __root_)) 13845 { 13846 *type = 2; 13847 first = t2; 13848 } 13849 } 13850 } 13851 } 13852 else 13853 { 13854 if (__make<__operator_bit_or>()) 13855 first += 2; 13856 } 13857 break; 13858 case 'R': 13859 // |= 13860 if (type) 13861 { 13862 const char* t = __parse_expression(first+2, last); 13863 if (t != first+2) 13864 { 13865 __node* op1 = __root_; 13866 const char* t2 = __parse_expression(t, last); 13867 if (t != t2) 13868 { 13869 if (__make<__operator_or_equal>(op1, __root_)) 13870 { 13871 *type = 2; 13872 first = t2; 13873 } 13874 } 13875 } 13876 } 13877 else 13878 { 13879 if (__make<__operator_or_equal>()) 13880 first += 2; 13881 } 13882 break; 13883 } 13884 break; 13885 case 'p': 13886 switch (first[1]) 13887 { 13888 case 'm': 13889 // ->* 13890 if (type) 13891 { 13892 const char* t = __parse_expression(first+2, last); 13893 if (t != first+2) 13894 { 13895 __node* op1 = __root_; 13896 const char* t2 = __parse_expression(t, last); 13897 if (t != t2) 13898 { 13899 if (__make<__operator_pointer_to_member>(op1, __root_)) 13900 { 13901 *type = 2; 13902 first = t2; 13903 } 13904 } 13905 } 13906 } 13907 else 13908 { 13909 if (__make<__operator_pointer_to_member>()) 13910 first += 2; 13911 } 13912 break; 13913 case 'l': 13914 // + 13915 if (type) 13916 { 13917 const char* t = __parse_expression(first+2, last); 13918 if (t != first+2) 13919 { 13920 __node* op1 = __root_; 13921 const char* t2 = __parse_expression(t, last); 13922 if (t != t2) 13923 { 13924 if (__make<__operator_plus>(op1, __root_)) 13925 { 13926 *type = 2; 13927 first = t2; 13928 } 13929 } 13930 } 13931 } 13932 else 13933 { 13934 if (__make<__operator_plus>()) 13935 first += 2; 13936 } 13937 break; 13938 case 'L': 13939 // += 13940 if (type) 13941 { 13942 const char* t = __parse_expression(first+2, last); 13943 if (t != first+2) 13944 { 13945 __node* op1 = __root_; 13946 const char* t2 = __parse_expression(t, last); 13947 if (t != t2) 13948 { 13949 if (__make<__operator_plus_equal>(op1, __root_)) 13950 { 13951 *type = 2; 13952 first = t2; 13953 } 13954 } 13955 } 13956 } 13957 else 13958 { 13959 if (__make<__operator_plus_equal>()) 13960 first += 2; 13961 } 13962 break; 13963 case 'p': 13964 // ++ (postfix in <expression> context) 13965 if (type) 13966 { 13967 const char* t = __parse_expression(first+2, last); 13968 if (t != first+2) 13969 { 13970 if (__make<__operator_increment>(false, __root_)) 13971 { 13972 *type = 1; 13973 first = t; 13974 } 13975 } 13976 } 13977 else 13978 { 13979 if (__make<__operator_increment>()) 13980 first += 2; 13981 } 13982 break; 13983 case 's': 13984 // + (unary) 13985 if (type) 13986 { 13987 const char* t = __parse_expression(first+2, last); 13988 if (t != first+2) 13989 { 13990 if (__make<__operator_unary_plus>(__root_)) 13991 { 13992 *type = 1; 13993 first = t; 13994 } 13995 } 13996 } 13997 else 13998 { 13999 if (__make<__operator_unary_plus>()) 14000 first += 2; 14001 } 14002 break; 14003 case 't': 14004 // -> 14005 if (type) 14006 { 14007 const char* t = __parse_expression(first+2, last); 14008 if (t != first+2) 14009 { 14010 __node* op1 = __root_; 14011 const char* t2 = __parse_expression(t, last); 14012 if (t != t2) 14013 { 14014 if (__make<__operator_arrow>(op1, __root_)) 14015 { 14016 *type = 2; 14017 first = t2; 14018 } 14019 } 14020 } 14021 } 14022 else 14023 { 14024 if (__make<__operator_arrow>()) 14025 first += 2; 14026 } 14027 break; 14028 } 14029 break; 14030 case 'q': 14031 // ? 14032 if (first[1] == 'u') 14033 { 14034 if (type) 14035 { 14036 const char* t = __parse_expression(first+2, last); 14037 if (t != first+2) 14038 { 14039 __node* op1 = __root_; 14040 const char* t2 = __parse_expression(t, last); 14041 if (t != t2) 14042 { 14043 __node* op2 = __root_; 14044 const char* t3 = __parse_expression(t2, last); 14045 if (t3 != t2) 14046 { 14047 if (__make<__operator_conditional>(op1, op2, __root_)) 14048 { 14049 *type = 3; 14050 first = t3; 14051 } 14052 } 14053 } 14054 } 14055 } 14056 else 14057 { 14058 if (__make<__operator_conditional>()) 14059 first += 2; 14060 } 14061 } 14062 break; 14063 case 'r': 14064 switch (first[1]) 14065 { 14066 case 'm': 14067 // % 14068 if (type) 14069 { 14070 const char* t = __parse_expression(first+2, last); 14071 if (t != first+2) 14072 { 14073 __node* op1 = __root_; 14074 const char* t2 = __parse_expression(t, last); 14075 if (t != t2) 14076 { 14077 if (__make<__operator_mod>(op1, __root_)) 14078 { 14079 *type = 2; 14080 first = t2; 14081 } 14082 } 14083 } 14084 } 14085 else 14086 { 14087 if (__make<__operator_mod>()) 14088 first += 2; 14089 } 14090 break; 14091 case 'M': 14092 // %= 14093 if (type) 14094 { 14095 const char* t = __parse_expression(first+2, last); 14096 if (t != first+2) 14097 { 14098 __node* op1 = __root_; 14099 const char* t2 = __parse_expression(t, last); 14100 if (t != t2) 14101 { 14102 if (__make<__operator_mod_equal>(op1, __root_)) 14103 { 14104 *type = 2; 14105 first = t2; 14106 } 14107 } 14108 } 14109 } 14110 else 14111 { 14112 if (__make<__operator_mod_equal>()) 14113 first += 2; 14114 } 14115 break; 14116 case 's': 14117 // >> 14118 if (type) 14119 { 14120 const char* t = __parse_expression(first+2, last); 14121 if (t != first+2) 14122 { 14123 __node* op1 = __root_; 14124 const char* t2 = __parse_expression(t, last); 14125 if (t != t2) 14126 { 14127 if (__make<__operator_right_shift>(op1, __root_)) 14128 { 14129 *type = 2; 14130 first = t2; 14131 } 14132 } 14133 } 14134 } 14135 else 14136 { 14137 if (__make<__operator_right_shift>()) 14138 first += 2; 14139 } 14140 break; 14141 case 'S': 14142 // >>= 14143 if (type) 14144 { 14145 const char* t = __parse_expression(first+2, last); 14146 if (t != first+2) 14147 { 14148 __node* op1 = __root_; 14149 const char* t2 = __parse_expression(t, last); 14150 if (t != t2) 14151 { 14152 if (__make<__operator_right_shift_equal>(op1, __root_)) 14153 { 14154 *type = 2; 14155 first = t2; 14156 } 14157 } 14158 } 14159 } 14160 else 14161 { 14162 if (__make<__operator_right_shift_equal>()) 14163 first += 2; 14164 } 14165 break; 14166 } 14167 break; 14168 case 's': 14169 switch (first[1]) 14170 { 14171 case 't': 14172 // sizeof (a type) 14173 if (type) 14174 { 14175 const char* t = __parse_expression(first+2, last); 14176 if (t != first+2) 14177 { 14178 if (__make<__operator_sizeof_type>(__root_)) 14179 { 14180 *type = -1; 14181 first = t; 14182 } 14183 } 14184 } 14185 else 14186 { 14187 if (__make<__operator_sizeof_type>()) 14188 first += 2; 14189 } 14190 break; 14191 case 'z': 14192 // sizeof (an expression) 14193 if (type) 14194 { 14195 const char* t = __parse_expression(first+2, last); 14196 if (t != first+2) 14197 { 14198 if (__make<__operator_sizeof_expression>(__root_)) 14199 { 14200 *type = -1; 14201 first = t; 14202 } 14203 } 14204 } 14205 else 14206 { 14207 if (__make<__operator_sizeof_expression>()) 14208 first += 2; 14209 } 14210 break; 14211 } 14212 break; 14213 } 14214 } 14215 return first; 14216 } 14217 14218 // <source-name> ::= <positive length number> <identifier> 14219 14220 const char* 14221 __demangle_tree::__parse_source_name(const char* first, const char* last) 14222 { 14223 if (first != last) 14224 { 14225 char c = *first; 14226 if ('1' <= c && c <= '9' && first+1 != last) 14227 { 14228 const char* t = first+1; 14229 size_t n = c - '0'; 14230 for (c = *t; '0' <= c && c <= '9'; c = *t) 14231 { 14232 n = n * 10 + c - '0'; 14233 if (++t == last) 14234 return first; 14235 } 14236 if (last - t >= n && __make<__source_name>(t, n)) 14237 first = t + n; 14238 } 14239 } 14240 return first; 14241 } 14242 14243 // <unqualified-name> ::= <operator-name> 14244 // ::= <ctor-dtor-name> 14245 // ::= <source-name> 14246 // ::= <unnamed-type-name> 14247 14248 const char* 14249 __demangle_tree::__parse_unqualified_name(const char* first, const char* last) 14250 { 14251 const char* t = __parse_source_name(first, last); 14252 if (t == first) 14253 { 14254 t = __parse_ctor_dtor_name(first, last); 14255 if (t == first) 14256 { 14257 t = __parse_operator_name(first, last); 14258 if (t == first) 14259 first = __parse_unnamed_type_name(first, last); 14260 else 14261 first = t; 14262 } 14263 else 14264 first = t; 14265 } 14266 else 14267 first = t; 14268 return first; 14269 } 14270 14271 // <unscoped-name> ::= <unqualified-name> 14272 // ::= St <unqualified-name> # ::std:: 14273 // extension ::= StL<unqualified-name> 14274 14275 const char* 14276 __demangle_tree::__parse_unscoped_name(const char* first, const char* last) 14277 { 14278 if (last - first >= 2) 14279 { 14280 const char* t0 = first; 14281 if (first[0] == 'S' && first[1] == 't') 14282 { 14283 t0 += 2; 14284 if (t0 != last && *t0 == 'L') 14285 ++t0; 14286 } 14287 const char* t1 = __parse_unqualified_name(t0, last); 14288 if (t1 != t0) 14289 { 14290 if (t0 != first) 14291 { 14292 __node* name = __root_; 14293 if (__make<__std_qualified_name>()) 14294 { 14295 if (__make<__nested_delimeter>(__root_, name)) 14296 first = t1; 14297 } 14298 } 14299 else 14300 first = t1; 14301 } 14302 } 14303 return first; 14304 } 14305 14306 // <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E 14307 // ::= N [<CV-qualifiers>] <template-prefix> <template-args> E 14308 // 14309 // <prefix> ::= <prefix> <unqualified-name> 14310 // ::= <template-prefix> <template-args> 14311 // ::= <template-param> 14312 // ::= <decltype> 14313 // ::= # empty 14314 // ::= <substitution> 14315 // ::= <prefix> <data-member-prefix> 14316 // extension ::= L 14317 // 14318 // <template-prefix> ::= <prefix> <template unqualified-name> 14319 // ::= <template-param> 14320 // ::= <substitution> 14321 14322 const char* 14323 __demangle_tree::__parse_nested_name(const char* first, const char* last) 14324 { 14325 if (first != last && *first == 'N') 14326 { 14327 unsigned cv = 0; 14328 const char* t0 = __parse_cv_qualifiers(first+1, last, cv, true); 14329 __node* prev = NULL; 14330 if (last - t0 >= 2 && t0[0] == 'S' && t0[1] == 't') 14331 { 14332 t0 += 2; 14333 if (!__make<__std_qualified_name>()) 14334 return first; 14335 prev = __root_; 14336 } 14337 while (t0 != last) 14338 { 14339 bool can_sub = true; 14340 bool make_nested = true; 14341 const char* t1; 14342 switch (*t0) 14343 { 14344 case '1': 14345 case '2': 14346 case '3': 14347 case '4': 14348 case '5': 14349 case '6': 14350 case '7': 14351 case '8': 14352 case '9': 14353 t1 = __parse_source_name(t0, last); 14354 if (t1 == t0 || t1 == last) 14355 return first; 14356 if (*t1 == 'M') 14357 { 14358 // This is a data-member-prefix 14359 ++t1; 14360 } 14361 else if (*t1 == 'I') 14362 { 14363 // has following <template-args> 14364 if (prev) 14365 { 14366 if (!__make<__nested_delimeter>(prev, __root_)) 14367 return first; 14368 make_nested = false; 14369 } 14370 if (__sub_end_ == __sub_cap_) 14371 { 14372 __status_ = memory_alloc_failure; 14373 return first; 14374 } 14375 else 14376 *__sub_end_++ = __root_; 14377 const char* t2 = __parse_template_args(t1, last); 14378 if (t2 == t1) 14379 return first; 14380 t1 = t2; 14381 } 14382 break; 14383 case 'D': 14384 if (t0+1 != last && (t0[1] == 't' || t0[1] == 'T')) 14385 { 14386 t1 = __parse_decltype(t0, last); 14387 break; 14388 } 14389 // check for Dt, DT here, else drop through 14390 case 'C': 14391 t1 = __parse_ctor_dtor_name(t0, last); 14392 if (t1 == t0 || t1 == last) 14393 return first; 14394 if (*t1 == 'I') 14395 { 14396 // has following <template-args> 14397 if (prev) 14398 { 14399 if (!__make<__nested_delimeter>(prev, __root_)) 14400 return first; 14401 make_nested = false; 14402 } 14403 if (__sub_end_ == __sub_cap_) 14404 { 14405 __status_ = memory_alloc_failure; 14406 return first; 14407 } 14408 else 14409 *__sub_end_++ = __root_; 14410 const char* t2 = __parse_template_args(t1, last); 14411 if (t2 == t1) 14412 return first; 14413 t1 = t2; 14414 } 14415 break; 14416 case 'U': 14417 assert(!"__parse_nested_name U"); 14418 // could have following <template-args> 14419 break; 14420 case 'T': 14421 t1 = __parse_template_param(t0, last); 14422 if (t1 == t0 || t1 == last) 14423 return first; 14424 if (*t1 == 'I') 14425 { 14426 // has following <template-args> 14427 if (prev) 14428 { 14429 if (!__make<__nested_delimeter>(prev, __root_)) 14430 return first; 14431 make_nested = false; 14432 } 14433 if (__sub_end_ == __sub_cap_) 14434 { 14435 __status_ = memory_alloc_failure; 14436 return first; 14437 } 14438 else 14439 *__sub_end_++ = __root_; 14440 const char* t2 = __parse_template_args(t1, last); 14441 if (t2 == t1) 14442 return first; 14443 t1 = t2; 14444 } 14445 break; 14446 case 'S': 14447 t1 = __parse_substitution(t0, last); 14448 if (t1 == t0 || t1 == last) 14449 return first; 14450 if (*t1 == 'I') 14451 { 14452 const char* t2 = __parse_template_args(t1, last); 14453 if (t2 == t1) 14454 return first; 14455 t1 = t2; 14456 } 14457 else 14458 can_sub = false; 14459 break; 14460 case 'L': 14461 // extension: ignore L here 14462 ++t0; 14463 continue; 14464 default: 14465 t1 = __parse_operator_name(t0, last); 14466 if (t1 == t0 || t1 == last) 14467 return first; 14468 if (*t1 == 'I') 14469 { 14470 // has following <template-args> 14471 if (prev) 14472 { 14473 if (!__make<__nested_delimeter>(prev, __root_)) 14474 return first; 14475 make_nested = false; 14476 } 14477 if (__sub_end_ == __sub_cap_) 14478 { 14479 __status_ = memory_alloc_failure; 14480 return first; 14481 } 14482 else 14483 *__sub_end_++ = __root_; 14484 const char* t2 = __parse_template_args(t1, last); 14485 if (t2 == t1) 14486 return first; 14487 t1 = t2; 14488 } 14489 break; 14490 } 14491 if (t1 == t0 || t1 == last) 14492 return first; 14493 if (prev && make_nested) 14494 { 14495 if (!__make<__nested_delimeter>(prev, __root_)) 14496 return first; 14497 can_sub = true; 14498 } 14499 if (can_sub && *t1 != 'E') 14500 { 14501 if (__sub_end_ == __sub_cap_) 14502 { 14503 __status_ = memory_alloc_failure; 14504 return first; 14505 } 14506 else 14507 *__sub_end_++ = __root_; 14508 } 14509 if (*t1 == 'E') 14510 { 14511 if (cv != 0) 14512 { 14513 if (!__make<__cv_qualifiers>(cv, __root_)) 14514 return first; 14515 } 14516 first = t1+1; 14517 break; 14518 } 14519 prev = __root_; 14520 t0 = t1; 14521 } 14522 } 14523 return first; 14524 } 14525 14526 // <template-arg> ::= <type> # type or template 14527 // ::= X <expression> E # expression 14528 // ::= <expr-primary> # simple expressions 14529 // ::= J <template-arg>* E # argument pack 14530 // ::= LZ <encoding> E # extension 14531 14532 const char* 14533 __demangle_tree::__parse_template_arg(const char* first, const char* last) 14534 { 14535 if (first != last) 14536 { 14537 const char* t; 14538 switch (*first) 14539 { 14540 case 'X': 14541 t = __parse_expression(first+1, last); 14542 if (t != first+1) 14543 { 14544 if (t != last && *t == 'E') 14545 first = t+1; 14546 } 14547 break; 14548 case 'J': 14549 t = first+1; 14550 if (t == last) 14551 return first; 14552 if (*t == 'E') 14553 { 14554 if (__make<__list>((__node*)0)) 14555 first = t+1; 14556 } 14557 else 14558 { 14559 __node* list = NULL; 14560 __node* prev = NULL; 14561 do 14562 { 14563 const char* t2 = __parse_template_arg(t, last); 14564 if (t2 == t || !__make<__list>(__root_)) 14565 return first; 14566 if (list == 0) 14567 list = __root_; 14568 if (prev) 14569 { 14570 prev->__right_ = __root_; 14571 __root_->__size_ = prev->__size_ + 1; 14572 } 14573 prev = __root_; 14574 t = t2; 14575 } while (t != last && *t != 'E'); 14576 first = t+1; 14577 __root_ = list; 14578 } 14579 break; 14580 case 'L': 14581 // <expr-primary> or LZ <encoding> E 14582 if (first+1 != last && first[1] == 'Z') 14583 { 14584 t = __parse_encoding(first+2, last); 14585 if (t != first+2 && t != last && *t == 'E') 14586 first = t+1; 14587 } 14588 else 14589 first = __parse_expr_primary(first, last); 14590 break; 14591 default: 14592 // <type> 14593 first = __parse_type(first, last); 14594 break; 14595 } 14596 } 14597 return first; 14598 } 14599 14600 // <template-args> ::= I <template-arg>* E 14601 // extension, the abi says <template-arg>+ 14602 14603 const char* 14604 __demangle_tree::__parse_template_args(const char* first, const char* last) 14605 { 14606 if (last - first >= 2 && *first == 'I') 14607 { 14608 __node* args = NULL; 14609 __node* prev = NULL; 14610 __node* name = __root_; 14611 bool prev_tag_templates = __tag_templates_; 14612 __tag_templates_ = false; 14613 if (prev_tag_templates) 14614 __t_end_ = __t_begin_; 14615 const char* t = first+1; 14616 while (*t != 'E') 14617 { 14618 const char* t2 = __parse_template_arg(t, last); 14619 if (t2 == t || t2 == last) 14620 break; 14621 if (!__make<__list>(__root_)) 14622 return first; 14623 if (args == 0) 14624 args = __root_; 14625 if (prev) 14626 { 14627 prev->__right_ = __root_; 14628 __root_->__size_ = prev->__size_ + 1; 14629 } 14630 prev = __root_; 14631 if (prev_tag_templates) 14632 { 14633 if (__t_end_ == __t_cap_) 14634 { 14635 __status_ = memory_alloc_failure; 14636 return first; 14637 } 14638 if (__root_->__left_) 14639 *__t_end_++ = __root_->__left_; 14640 else 14641 *__t_end_++ = __root_; 14642 } 14643 t = t2; 14644 } 14645 if (t != last && *t == 'E') 14646 { 14647 if (__make<__template_args>(name, args)) 14648 first = t+1; 14649 } 14650 __tag_templates_ = prev_tag_templates; 14651 } 14652 return first; 14653 } 14654 14655 // <substitution> ::= S <seq-id> _ 14656 // ::= S_ 14657 // <substitution> ::= Sa # ::std::allocator 14658 // <substitution> ::= Sb # ::std::basic_string 14659 // <substitution> ::= Ss # ::std::basic_string < char, 14660 // ::std::char_traits<char>, 14661 // ::std::allocator<char> > 14662 // <substitution> ::= Si # ::std::basic_istream<char, std::char_traits<char> > 14663 // <substitution> ::= So # ::std::basic_ostream<char, std::char_traits<char> > 14664 // <substitution> ::= Sd # ::std::basic_iostream<char, std::char_traits<char> > 14665 14666 const char* 14667 __demangle_tree::__parse_substitution(const char* first, const char* last) 14668 { 14669 if (last - first >= 2) 14670 { 14671 if (*first == 'S') 14672 { 14673 switch (first[1]) 14674 { 14675 case 'a': 14676 if (__make<__sub_allocator>()) 14677 first += 2; 14678 break; 14679 case 'b': 14680 if (__make<__sub_basic_string>()) 14681 first += 2; 14682 break; 14683 case 's': 14684 if (__make<__sub_string>()) 14685 first += 2; 14686 break; 14687 case 'i': 14688 if (__make<__sub_istream>()) 14689 first += 2; 14690 break; 14691 case 'o': 14692 if (__make<__sub_ostream>()) 14693 first += 2; 14694 break; 14695 case 'd': 14696 if (__make<__sub_iostream>()) 14697 first += 2; 14698 break; 14699 case '_': 14700 if (__sub_begin_ != __sub_end_) 14701 { 14702 if (__make<__sub>(*__sub_begin_)) 14703 first += 2; 14704 } 14705 break; 14706 default: 14707 if (isdigit(first[1]) || isupper(first[1])) 14708 { 14709 size_t sub = 0; 14710 const char* t = first+1; 14711 if (isdigit(*t)) 14712 sub = *t - '0'; 14713 else 14714 sub = *t - 'A' + 10; 14715 for (++t; t != last && (isdigit(*t) || isupper(*t)); ++t) 14716 { 14717 sub *= 36; 14718 if (isdigit(*t)) 14719 sub += *t - '0'; 14720 else 14721 sub += *t - 'A' + 10; 14722 } 14723 if (t == last || *t != '_') 14724 return first; 14725 ++sub; 14726 if (sub < __sub_end_ - __sub_begin_) 14727 { 14728 if (__make<__sub>(__sub_begin_[sub])) 14729 first = t+1; 14730 } 14731 } 14732 break; 14733 } 14734 } 14735 } 14736 return first; 14737 } 14738 14739 // <name> ::= <nested-name> 14740 // ::= <local-name> # See Scope Encoding below 14741 // ::= <unscoped-template-name> <template-args> 14742 // ::= <unscoped-name> 14743 14744 const char* 14745 __demangle_tree::__parse_name(const char* first, const char* last) 14746 { 14747 if (first != last) 14748 { 14749 const char* t0 = first; 14750 // extension: ignore L here 14751 if (*t0 == 'L') 14752 ++t0; 14753 const char* t = __parse_nested_name(t0, last); 14754 if (t == t0) 14755 { 14756 t = __parse_local_name(t0, last); 14757 if (t == t0) 14758 { 14759 // not <nested-name> nor <local-name> 14760 // Try to parse <unscoped-template-name> <template-args> or 14761 // <unscoped-name> which are nearly ambiguous. 14762 // This logic occurs nowhere else. 14763 if (last - t0 >= 2) 14764 { 14765 if (t0[0] == 'S' && (t0[1] == '_' || 14766 isdigit(t0[1]) || 14767 isupper(t0[1]) || 14768 t0[1] == 'a' || 14769 t0[1] == 'b')) 14770 { 14771 t = __parse_substitution(t0, last); 14772 if (t != t0) 14773 { 14774 const char* t2 = __parse_template_args(t, last); 14775 if (t2 != t) 14776 first = t2; 14777 } 14778 } 14779 else // Not a substitution, except maybe St 14780 { 14781 t = __parse_unscoped_name(t0, last); 14782 if (t != t0) 14783 { 14784 // unscoped-name might be <unscoped-template-name> 14785 if (t != last && *t == 'I') 14786 { 14787 if (__sub_end_ == __sub_cap_) 14788 { 14789 __status_ = memory_alloc_failure; 14790 return first; 14791 } 14792 *__sub_end_++ = __root_; 14793 const char* t2 = __parse_template_args(t, last); 14794 if (t2 != t) 14795 first = t2; 14796 } 14797 else 14798 { 14799 // <unscoped-name> 14800 first = t; 14801 } 14802 } 14803 } 14804 } 14805 } 14806 else 14807 first = t; 14808 } 14809 else 14810 first = t; 14811 } 14812 return first; 14813 } 14814 14815 // extension 14816 // <dot-suffix> := .<anything and everything> 14817 14818 const char* 14819 __demangle_tree::__parse_dot_suffix(const char* first, const char* last) 14820 { 14821 if (first != last && *first == '.') 14822 { 14823 if (__make<__dot_suffix>(__root_, first, last-first)) 14824 first = last; 14825 } 14826 return first; 14827 } 14828 14829 // <encoding> ::= <function name> <bare-function-type> 14830 // ::= <data name> 14831 // ::= <special-name> 14832 14833 const char* 14834 __demangle_tree::__parse_encoding(const char* first, const char* last) 14835 { 14836 const char* t = __parse_name(first, last); 14837 if (t != first) 14838 { 14839 if (t != last && *t != 'E' && *t != '.') 14840 { 14841 __node* name = __root_; 14842 bool has_return = name->ends_with_template() && 14843 !name->is_ctor_dtor_conv(); 14844 __node* ret = NULL; 14845 const char* t2; 14846 __tag_templates_ = false; 14847 if (has_return) 14848 { 14849 t2 = __parse_type(t, last); 14850 if (t2 != t) 14851 { 14852 ret = __root_; 14853 t = t2; 14854 } 14855 else 14856 return first; 14857 } 14858 t2 = __parse_bare_function_type(t, last); 14859 if (t2 != t) 14860 { 14861 if (dynamic_cast<__void*>(__root_->__left_) != NULL) 14862 __root_->__left_ = NULL; 14863 if (__make<__function_signature>(ret, __root_)) 14864 { 14865 __node* cv = name->extract_cv(name); 14866 if (__make<__function>(name, __root_)) 14867 { 14868 if (cv) 14869 { 14870 cv->__left_ = __root_; 14871 cv->__size_ <<= 5; 14872 __root_ = cv; 14873 } 14874 first = t2; 14875 } 14876 } 14877 } 14878 __tag_templates_ = true; 14879 } 14880 else 14881 first = t; 14882 } 14883 else 14884 first = __parse_special_name(first, last); 14885 return first; 14886 } 14887 14888 // <mangled-name> ::= _Z<encoding> 14889 // ::= <type> 14890 14891 void 14892 __demangle_tree::__parse() 14893 { 14894 if (__mangled_name_begin_ == __mangled_name_end_) 14895 { 14896 __status_ = invalid_mangled_name; 14897 return; 14898 } 14899 const char* t = NULL; 14900 if (__mangled_name_end_ - __mangled_name_begin_ >= 2 && 14901 __mangled_name_begin_[0] == '_' && 14902 __mangled_name_begin_[1] == 'Z') 14903 { 14904 t = __parse_encoding(__mangled_name_begin_+2, __mangled_name_end_); 14905 if (t != __mangled_name_begin_+2 && t != __mangled_name_end_ && *t == '.') 14906 t = __parse_dot_suffix(t, __mangled_name_end_); 14907 } 14908 else 14909 t = __parse_type(__mangled_name_begin_, __mangled_name_end_); 14910 if (t == __mangled_name_end_ && __root_) 14911 { 14912 if (__fix_forward_references_) 14913 { 14914 if (__root_->fix_forward_references(__t_begin_, __t_end_)) 14915 __status_ = success; 14916 } 14917 else 14918 __status_ = success; 14919 } 14920 } 14921 14922 #pragma GCC visibility pop 14923 #pragma GCC visibility push(default) 14924 14925 __demangle_tree 14926 __demangle(const char* mangled_name, char* buf, size_t bs) 14927 { 14928 __demangle_tree t(mangled_name, buf, bs); 14929 if (t.__status() == invalid_mangled_name) 14930 t.__parse(); 14931 return t; 14932 } 14933 14934 __demangle_tree 14935 __demangle(const char* mangled_name) 14936 { 14937 return __demangle(mangled_name, 0, 0); 14938 } 14939 14940 char* 14941 __demangle(__demangle_tree dmg_tree, char* buf, size_t* n, int* status) 14942 { 14943 if (dmg_tree.__status() != success) 14944 { 14945 if (status) 14946 *status = dmg_tree.__status(); 14947 return NULL; 14948 } 14949 #ifdef DEBUGGING 14950 display(dmg_tree.__root_); 14951 printf("\n"); 14952 #endif 14953 const size_t bs = buf == NULL ? 0 : *n; 14954 ptrdiff_t sm = dmg_tree.__mangled_name_end_ - dmg_tree.__mangled_name_begin_; 14955 ptrdiff_t est = sm + 60 * ( 14956 (dmg_tree.__node_end_ - dmg_tree.__node_begin_) + 14957 (dmg_tree.__sub_end_ - dmg_tree.__sub_begin_) + 14958 (dmg_tree.__t_end_ - dmg_tree.__t_begin_)); 14959 const unsigned N = 4096; 14960 char tmp[N]; 14961 ptrdiff_t s; 14962 if (est <= bs) 14963 { 14964 char* e = dmg_tree.__get_demangled_name(buf); 14965 *e++ = '\0'; 14966 s = e - buf; 14967 } 14968 else if (est <= N) 14969 { 14970 char* e = dmg_tree.__get_demangled_name(tmp); 14971 *e++ = '\0'; 14972 s = e - tmp; 14973 } 14974 else 14975 s = dmg_tree.size() + 1; 14976 if (s > bs) 14977 { 14978 buf = static_cast<char*>(realloc(buf, s)); 14979 if (buf == NULL) 14980 { 14981 if (status) 14982 *status = memory_alloc_failure; 14983 return NULL; 14984 } 14985 if (n) 14986 *n = s; 14987 } 14988 if (est > bs) 14989 { 14990 if (est <= N) 14991 strncpy(buf, tmp, s); 14992 else 14993 *dmg_tree.__get_demangled_name(buf) = '\0'; 14994 } 14995 if (status) 14996 *status = success; 14997 return buf; 14998 } 14999 15000 } // __libcxxabi 15001 15002 extern "C" 15003 { 15004 15005 char* 15006 __cxa_demangle(const char* mangled_name, char* buf, size_t* n, int* status) 15007 { 15008 if (mangled_name == NULL || (buf != NULL && n == NULL)) 15009 { 15010 if (status) 15011 *status = __libcxxabi::invalid_args; 15012 return NULL; 15013 } 15014 const size_t bs = 64 * 1024; 15015 __attribute((aligned(16))) char static_buf[bs]; 15016 15017 buf = __libcxxabi::__demangle(__libcxxabi::__demangle(mangled_name, 15018 static_buf, bs), 15019 buf, n, status); 15020 return buf; 15021 } 15022 15023 } // extern "C" 15024 15025 } // abi 15026