| 1626 | |
| 1627 | |
| 1628 | void DemangleGNU3::DemangleTemplateArgs(vector<FunctionParameter>& args) |
| 1629 | { |
| 1630 | indent(); |
| 1631 | MyLogDebug("%s:: '%s'\n", __FUNCTION__, m_reader.GetRaw().c_str()); |
| 1632 | TypeBuilder tmp; |
| 1633 | bool tmpValid = false; |
| 1634 | string expr; |
| 1635 | bool topLevel; |
| 1636 | const string lastName = m_lastName; |
| 1637 | while (m_reader.Peek() != 'E') |
| 1638 | { |
| 1639 | switch (m_reader.Read()) |
| 1640 | { |
| 1641 | case 'L': |
| 1642 | expr = DemanglePrimaryExpression(); |
| 1643 | args.push_back({expr, nullptr, true, Variable()}); |
| 1644 | tmp = CreateUnknownType(expr); |
| 1645 | tmpValid = true; |
| 1646 | break; |
| 1647 | case 'X': |
| 1648 | args.push_back({DemangleExpression(), nullptr, true, Variable()}); |
| 1649 | if (m_reader.Read() != 'E') |
| 1650 | throw DemangleException(); |
| 1651 | break; |
| 1652 | case 'J': |
| 1653 | DemangleTemplateArgs(args); |
| 1654 | break; |
| 1655 | default: |
| 1656 | m_reader.UnRead(); |
| 1657 | topLevel = m_topLevel; |
| 1658 | m_topLevel = false; |
| 1659 | tmp = DemangleType(); |
| 1660 | m_topLevel = topLevel; |
| 1661 | args.push_back({tmp.GetString(), nullptr, true, Variable()}); |
| 1662 | tmpValid = true; |
| 1663 | } |
| 1664 | if (m_topLevel && tmpValid) |
| 1665 | { |
| 1666 | MyLogDebug("Adding template ref: %s\n", tmp.GetString().c_str()); |
| 1667 | PushTemplateType(tmp); |
| 1668 | } |
| 1669 | } |
| 1670 | m_reader.Consume(); |
| 1671 | m_lastName = lastName; |
| 1672 | dedent(); |
| 1673 | return; |
| 1674 | } |
| 1675 | |
| 1676 | |
| 1677 | TypeBuilder DemangleGNU3::DemangleNestedName() |
nothing calls this directly
no test coverage detected