| 742 | } |
| 743 | |
| 744 | string DemangleGNU3::DemanglePrimaryExpression() |
| 745 | { |
| 746 | indent(); |
| 747 | MyLogDebug("%s: '%s'\n", __FUNCTION__, m_reader.GetRaw().c_str()); |
| 748 | char elm1 = '\0'; |
| 749 | string out; |
| 750 | QualifiedName tmpList; |
| 751 | string valueString; |
| 752 | float f; double d; long double ld; |
| 753 | bool oldTopLevel; |
| 754 | //expr-primary |
| 755 | if (m_reader.PeekString(2) == "_Z") |
| 756 | { |
| 757 | m_reader.Consume(2); |
| 758 | oldTopLevel = m_topLevel; |
| 759 | m_topLevel = false; |
| 760 | TypeBuilder t = DemangleSymbol(tmpList); |
| 761 | m_topLevel = oldTopLevel; |
| 762 | out += t.GetStringBeforeName(); |
| 763 | out += tmpList.GetString(); |
| 764 | out += t.GetStringAfterName(); |
| 765 | dedent() |
| 766 | return out; |
| 767 | } |
| 768 | switch (m_reader.Read()) |
| 769 | { |
| 770 | case 'b': |
| 771 | elm1 = m_reader.Read(); |
| 772 | if (elm1 == '0') |
| 773 | out += "false"; |
| 774 | else if (elm1 == '1') |
| 775 | out += "true"; |
| 776 | else |
| 777 | throw DemangleException(); |
| 778 | break; |
| 779 | case 'd': //double |
| 780 | valueString = m_reader.ReadString(8); |
| 781 | |
| 782 | for (size_t i = 0; i < valueString.size(); i+=2) |
| 783 | { |
| 784 | ((unsigned char*)&d)[i/2] = (HexToDec(valueString[i]) << 16) + HexToDec(valueString[i+1]); |
| 785 | } |
| 786 | out += to_string(d); |
| 787 | break; |
| 788 | case 'e': //long double |
| 789 | valueString = m_reader.ReadString(10); |
| 790 | |
| 791 | for (size_t i = 0; i < valueString.size(); i+=2) |
| 792 | { |
| 793 | ((unsigned char*)&ld)[i/2] = (HexToDec(valueString[i]) << 16) + HexToDec(valueString[i+1]); |
| 794 | } |
| 795 | out += to_string(ld); |
| 796 | break; |
| 797 | case 'f': //float |
| 798 | valueString = m_reader.ReadString(4); |
| 799 | |
| 800 | for (size_t i = 0; i < valueString.size(); i+=2) |
| 801 | { |
nothing calls this directly
no test coverage detected