| 1647 | // May return a new state on state pop. |
| 1648 | template <unsigned parseFlags, typename InputStream, typename Handler> |
| 1649 | RAPIDJSON_FORCEINLINE IterativeParsingState Transit(IterativeParsingState src, Token token, IterativeParsingState dst, InputStream& is, Handler& handler) { |
| 1650 | (void)token; |
| 1651 | |
| 1652 | switch (dst) { |
| 1653 | case IterativeParsingErrorState: |
| 1654 | return dst; |
| 1655 | |
| 1656 | case IterativeParsingObjectInitialState: |
| 1657 | case IterativeParsingArrayInitialState: |
| 1658 | { |
| 1659 | // Push the state(Element or MemeberValue) if we are nested in another array or value of member. |
| 1660 | // In this way we can get the correct state on ObjectFinish or ArrayFinish by frame pop. |
| 1661 | IterativeParsingState n = src; |
| 1662 | if (src == IterativeParsingArrayInitialState || src == IterativeParsingElementDelimiterState) |
| 1663 | n = IterativeParsingElementState; |
| 1664 | else if (src == IterativeParsingKeyValueDelimiterState) |
| 1665 | n = IterativeParsingMemberValueState; |
| 1666 | // Push current state. |
| 1667 | *stack_.template Push<SizeType>(1) = n; |
| 1668 | // Initialize and push the member/element count. |
| 1669 | *stack_.template Push<SizeType>(1) = 0; |
| 1670 | // Call handler |
| 1671 | bool hr = (dst == IterativeParsingObjectInitialState) ? handler.StartObject() : handler.StartArray(); |
| 1672 | // On handler short circuits the parsing. |
| 1673 | if (!hr) { |
| 1674 | RAPIDJSON_PARSE_ERROR_NORETURN(kParseErrorTermination, is.Tell()); |
| 1675 | return IterativeParsingErrorState; |
| 1676 | } |
| 1677 | else { |
| 1678 | is.Take(); |
| 1679 | return dst; |
| 1680 | } |
| 1681 | } |
| 1682 | |
| 1683 | case IterativeParsingMemberKeyState: |
| 1684 | ParseString<parseFlags>(is, handler, true); |
| 1685 | if (HasParseError()) |
| 1686 | return IterativeParsingErrorState; |
| 1687 | else |
| 1688 | return dst; |
| 1689 | |
| 1690 | case IterativeParsingKeyValueDelimiterState: |
| 1691 | RAPIDJSON_ASSERT(token == ColonToken); |
| 1692 | is.Take(); |
| 1693 | return dst; |
| 1694 | |
| 1695 | case IterativeParsingMemberValueState: |
| 1696 | // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. |
| 1697 | ParseValue<parseFlags>(is, handler); |
| 1698 | if (HasParseError()) { |
| 1699 | return IterativeParsingErrorState; |
| 1700 | } |
| 1701 | return dst; |
| 1702 | |
| 1703 | case IterativeParsingElementState: |
| 1704 | // Must be non-compound value. Or it would be ObjectInitial or ArrayInitial state. |
| 1705 | ParseValue<parseFlags>(is, handler); |
| 1706 | if (HasParseError()) { |
nothing calls this directly
no test coverage detected