Lines Matching refs:state

194 static void InitState(State *state, const char *mangled,  in InitState()  argument
196 state->mangled_cur = mangled; in InitState()
197 state->out_cur = out; in InitState()
198 state->out_begin = out; in InitState()
199 state->out_end = out + out_size; in InitState()
200 state->prev_name = NULL; in InitState()
201 state->prev_name_length = -1; in InitState()
202 state->nest_level = -1; in InitState()
203 state->append = true; in InitState()
204 state->overflowed = false; in InitState()
210 static bool ParseOneCharToken(State *state, const char one_char_token) { in ParseOneCharToken() argument
211 if (state->mangled_cur[0] == one_char_token) { in ParseOneCharToken()
212 ++state->mangled_cur; in ParseOneCharToken()
221 static bool ParseTwoCharToken(State *state, const char *two_char_token) { in ParseTwoCharToken() argument
222 if (state->mangled_cur[0] == two_char_token[0] && in ParseTwoCharToken()
223 state->mangled_cur[1] == two_char_token[1]) { in ParseTwoCharToken()
224 state->mangled_cur += 2; in ParseTwoCharToken()
232 static bool ParseCharClass(State *state, const char *char_class) { in ParseCharClass() argument
235 if (state->mangled_cur[0] == *p) { in ParseCharClass()
236 ++state->mangled_cur; in ParseCharClass()
250 static bool OneOrMore(ParseFunc parse_func, State *state) { in OneOrMore() argument
251 if (parse_func(state)) { in OneOrMore()
252 while (parse_func(state)) { in OneOrMore()
263 static bool ZeroOrMore(ParseFunc parse_func, State *state) { in ZeroOrMore() argument
264 while (parse_func(state)) { in ZeroOrMore()
272 static void Append(State *state, const char * const str, const int length) { in Append() argument
275 if (state->out_cur + 1 < state->out_end) { // +1 for '\0' in Append()
276 *state->out_cur = str[i]; in Append()
277 ++state->out_cur; in Append()
279 state->overflowed = true; in Append()
283 if (!state->overflowed) { in Append()
284 *state->out_cur = '\0'; // Terminate it with '\0' in Append()
329 static void MaybeAppendWithLength(State *state, const char * const str, in MaybeAppendWithLength() argument
331 if (state->append && length > 0) { in MaybeAppendWithLength()
334 if (str[0] == '<' && state->out_begin < state->out_cur && in MaybeAppendWithLength()
335 state->out_cur[-1] == '<') { in MaybeAppendWithLength()
336 Append(state, " ", 1); in MaybeAppendWithLength()
340 state->prev_name = state->out_cur; in MaybeAppendWithLength()
341 state->prev_name_length = length; in MaybeAppendWithLength()
343 Append(state, str, length); in MaybeAppendWithLength()
348 static bool MaybeAppend(State *state, const char * const str) { in MaybeAppend() argument
349 if (state->append) { in MaybeAppend()
351 MaybeAppendWithLength(state, str, length); in MaybeAppend()
357 static bool EnterNestedName(State *state) { in EnterNestedName() argument
358 state->nest_level = 0; in EnterNestedName()
363 static bool LeaveNestedName(State *state, short prev_value) { in LeaveNestedName() argument
364 state->nest_level = prev_value; in LeaveNestedName()
369 static bool DisableAppend(State *state) { in DisableAppend() argument
370 state->append = false; in DisableAppend()
375 static bool RestoreAppend(State *state, bool prev_value) { in RestoreAppend() argument
376 state->append = prev_value; in RestoreAppend()
381 static void MaybeIncreaseNestLevel(State *state) { in MaybeIncreaseNestLevel() argument
382 if (state->nest_level > -1) { in MaybeIncreaseNestLevel()
383 ++state->nest_level; in MaybeIncreaseNestLevel()
388 static void MaybeAppendSeparator(State *state) { in MaybeAppendSeparator() argument
389 if (state->nest_level >= 1) { in MaybeAppendSeparator()
390 MaybeAppend(state, "::"); in MaybeAppendSeparator()
395 static void MaybeCancelLastSeparator(State *state) { in MaybeCancelLastSeparator() argument
396 if (state->nest_level >= 1 && state->append && in MaybeCancelLastSeparator()
397 state->out_begin <= state->out_cur - 2) { in MaybeCancelLastSeparator()
398 state->out_cur -= 2; in MaybeCancelLastSeparator()
399 *state->out_cur = '\0'; in MaybeCancelLastSeparator()
405 static bool IdentifierIsAnonymousNamespace(State *state, int length) { in IdentifierIsAnonymousNamespace() argument
408 StrPrefix(state->mangled_cur, anon_prefix)); in IdentifierIsAnonymousNamespace()
412 static bool ParseMangledName(State *state);
413 static bool ParseEncoding(State *state);
414 static bool ParseName(State *state);
415 static bool ParseUnscopedName(State *state);
416 static bool ParseUnscopedTemplateName(State *state);
417 static bool ParseNestedName(State *state);
418 static bool ParsePrefix(State *state);
419 static bool ParseUnqualifiedName(State *state);
420 static bool ParseSourceName(State *state);
421 static bool ParseLocalSourceName(State *state);
422 static bool ParseNumber(State *state, int *number_out);
423 static bool ParseFloatNumber(State *state);
424 static bool ParseSeqId(State *state);
425 static bool ParseIdentifier(State *state, int length);
426 static bool ParseAbiTags(State *state);
427 static bool ParseAbiTag(State *state);
428 static bool ParseOperatorName(State *state);
429 static bool ParseSpecialName(State *state);
430 static bool ParseCallOffset(State *state);
431 static bool ParseNVOffset(State *state);
432 static bool ParseVOffset(State *state);
433 static bool ParseCtorDtorName(State *state);
434 static bool ParseType(State *state);
435 static bool ParseCVQualifiers(State *state);
436 static bool ParseBuiltinType(State *state);
437 static bool ParseFunctionType(State *state);
438 static bool ParseBareFunctionType(State *state);
439 static bool ParseClassEnumType(State *state);
440 static bool ParseArrayType(State *state);
441 static bool ParsePointerToMemberType(State *state);
442 static bool ParseTemplateParam(State *state);
443 static bool ParseTemplateTemplateParam(State *state);
444 static bool ParseTemplateArgs(State *state);
445 static bool ParseTemplateArg(State *state);
446 static bool ParseExpression(State *state);
447 static bool ParseExprPrimary(State *state);
448 static bool ParseLocalName(State *state);
449 static bool ParseDiscriminator(State *state);
450 static bool ParseSubstitution(State *state);
483 static bool ParseMangledName(State *state) { in ParseMangledName() argument
484 return ParseTwoCharToken(state, "_Z") && ParseEncoding(state); in ParseMangledName()
490 static bool ParseEncoding(State *state) { in ParseEncoding() argument
491 State copy = *state; in ParseEncoding()
492 if (ParseName(state) && ParseBareFunctionType(state)) { in ParseEncoding()
495 *state = copy; in ParseEncoding()
497 if (ParseName(state) || ParseSpecialName(state)) { in ParseEncoding()
507 static bool ParseName(State *state) { in ParseName() argument
508 if (ParseNestedName(state) || ParseLocalName(state)) { in ParseName()
512 State copy = *state; in ParseName()
513 if (ParseUnscopedTemplateName(state) && in ParseName()
514 ParseTemplateArgs(state)) { in ParseName()
517 *state = copy; in ParseName()
520 if (ParseUnscopedName(state)) { in ParseName()
528 static bool ParseUnscopedName(State *state) { in ParseUnscopedName() argument
529 if (ParseUnqualifiedName(state)) { in ParseUnscopedName()
533 State copy = *state; in ParseUnscopedName()
534 if (ParseTwoCharToken(state, "St") && in ParseUnscopedName()
535 MaybeAppend(state, "std::") && in ParseUnscopedName()
536 ParseUnqualifiedName(state)) { in ParseUnscopedName()
539 *state = copy; in ParseUnscopedName()
545 static bool ParseUnscopedTemplateName(State *state) { in ParseUnscopedTemplateName() argument
546 return ParseUnscopedName(state) || ParseSubstitution(state); in ParseUnscopedTemplateName()
551 static bool ParseNestedName(State *state) { in ParseNestedName() argument
552 State copy = *state; in ParseNestedName()
553 if (ParseOneCharToken(state, 'N') && in ParseNestedName()
554 EnterNestedName(state) && in ParseNestedName()
555 Optional(ParseCVQualifiers(state)) && in ParseNestedName()
556 ParsePrefix(state) && in ParseNestedName()
557 LeaveNestedName(state, copy.nest_level) && in ParseNestedName()
558 ParseOneCharToken(state, 'E')) { in ParseNestedName()
561 *state = copy; in ParseNestedName()
576 static bool ParsePrefix(State *state) { in ParsePrefix() argument
579 MaybeAppendSeparator(state); in ParsePrefix()
580 if (ParseTemplateParam(state) || in ParsePrefix()
581 ParseSubstitution(state) || in ParsePrefix()
582 ParseUnscopedName(state)) { in ParsePrefix()
584 MaybeIncreaseNestLevel(state); in ParsePrefix()
587 MaybeCancelLastSeparator(state); in ParsePrefix()
588 if (has_something && ParseTemplateArgs(state)) { in ParsePrefix()
589 return ParsePrefix(state); in ParsePrefix()
601 static bool ParseUnqualifiedName(State *state) { in ParseUnqualifiedName() argument
602 return (ParseOperatorName(state) || in ParseUnqualifiedName()
603 ParseCtorDtorName(state) || in ParseUnqualifiedName()
604 (ParseSourceName(state) && Optional(ParseAbiTags(state))) || in ParseUnqualifiedName()
605 (ParseLocalSourceName(state) && Optional(ParseAbiTags(state)))); in ParseUnqualifiedName()
609 static bool ParseSourceName(State *state) { in ParseSourceName() argument
610 State copy = *state; in ParseSourceName()
612 if (ParseNumber(state, &length) && ParseIdentifier(state, length)) { in ParseSourceName()
615 *state = copy; in ParseSourceName()
624 static bool ParseLocalSourceName(State *state) { in ParseLocalSourceName() argument
625 State copy = *state; in ParseLocalSourceName()
626 if (ParseOneCharToken(state, 'L') && ParseSourceName(state) && in ParseLocalSourceName()
627 Optional(ParseDiscriminator(state))) { in ParseLocalSourceName()
630 *state = copy; in ParseLocalSourceName()
637 static bool ParseNumber(State *state, int *number_out) { in ParseNumber() argument
639 if (ParseOneCharToken(state, 'n')) { in ParseNumber()
642 const char *p = state->mangled_cur; in ParseNumber()
651 if (p != state->mangled_cur) { // Conversion succeeded. in ParseNumber()
652 state->mangled_cur = p; in ParseNumber()
663 static bool ParseFloatNumber(State *state) { in ParseFloatNumber() argument
664 const char *p = state->mangled_cur; in ParseFloatNumber()
670 if (p != state->mangled_cur) { // Conversion succeeded. in ParseFloatNumber()
671 state->mangled_cur = p; in ParseFloatNumber()
679 static bool ParseSeqId(State *state) { in ParseSeqId() argument
680 const char *p = state->mangled_cur; in ParseSeqId()
686 if (p != state->mangled_cur) { // Conversion succeeded. in ParseSeqId()
687 state->mangled_cur = p; in ParseSeqId()
694 static bool ParseIdentifier(State *state, int length) { in ParseIdentifier() argument
696 !AtLeastNumCharsRemaining(state->mangled_cur, length)) { in ParseIdentifier()
699 if (IdentifierIsAnonymousNamespace(state, length)) { in ParseIdentifier()
700 MaybeAppend(state, "(anonymous namespace)"); in ParseIdentifier()
702 MaybeAppendWithLength(state, state->mangled_cur, length); in ParseIdentifier()
704 state->mangled_cur += length; in ParseIdentifier()
709 static bool ParseAbiTags(State *state) { in ParseAbiTags() argument
710 State copy = *state; in ParseAbiTags()
711 DisableAppend(state); in ParseAbiTags()
712 if (OneOrMore(ParseAbiTag, state)) { in ParseAbiTags()
713 RestoreAppend(state, copy.append); in ParseAbiTags()
716 *state = copy; in ParseAbiTags()
721 static bool ParseAbiTag(State *state) { in ParseAbiTag() argument
722 return ParseOneCharToken(state, 'B') && ParseSourceName(state); in ParseAbiTag()
728 static bool ParseOperatorName(State *state) { in ParseOperatorName() argument
729 if (!AtLeastNumCharsRemaining(state->mangled_cur, 2)) { in ParseOperatorName()
733 State copy = *state; in ParseOperatorName()
734 if (ParseTwoCharToken(state, "cv") && in ParseOperatorName()
735 MaybeAppend(state, "operator ") && in ParseOperatorName()
736 EnterNestedName(state) && in ParseOperatorName()
737 ParseType(state) && in ParseOperatorName()
738 LeaveNestedName(state, copy.nest_level)) { in ParseOperatorName()
741 *state = copy; in ParseOperatorName()
744 if (ParseOneCharToken(state, 'v') && ParseCharClass(state, "0123456789") && in ParseOperatorName()
745 ParseSourceName(state)) { in ParseOperatorName()
748 *state = copy; in ParseOperatorName()
752 if (!(IsLower(state->mangled_cur[0]) && in ParseOperatorName()
753 IsAlpha(state->mangled_cur[1]))) { in ParseOperatorName()
759 if (state->mangled_cur[0] == p->abbrev[0] && in ParseOperatorName()
760 state->mangled_cur[1] == p->abbrev[1]) { in ParseOperatorName()
761 MaybeAppend(state, "operator"); in ParseOperatorName()
763 MaybeAppend(state, " "); in ParseOperatorName()
765 MaybeAppend(state, p->real_name); in ParseOperatorName()
766 state->mangled_cur += 2; in ParseOperatorName()
791 static bool ParseSpecialName(State *state) { in ParseSpecialName() argument
792 State copy = *state; in ParseSpecialName()
793 if (ParseOneCharToken(state, 'T') && in ParseSpecialName()
794 ParseCharClass(state, "VTIS") && in ParseSpecialName()
795 ParseType(state)) { in ParseSpecialName()
798 *state = copy; in ParseSpecialName()
800 if (ParseTwoCharToken(state, "Tc") && ParseCallOffset(state) && in ParseSpecialName()
801 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
804 *state = copy; in ParseSpecialName()
806 if (ParseTwoCharToken(state, "GV") && in ParseSpecialName()
807 ParseName(state)) { in ParseSpecialName()
810 *state = copy; in ParseSpecialName()
812 if (ParseOneCharToken(state, 'T') && ParseCallOffset(state) && in ParseSpecialName()
813 ParseEncoding(state)) { in ParseSpecialName()
816 *state = copy; in ParseSpecialName()
819 if (ParseTwoCharToken(state, "TC") && ParseType(state) && in ParseSpecialName()
820 ParseNumber(state, NULL) && ParseOneCharToken(state, '_') && in ParseSpecialName()
821 DisableAppend(state) && in ParseSpecialName()
822 ParseType(state)) { in ParseSpecialName()
823 RestoreAppend(state, copy.append); in ParseSpecialName()
826 *state = copy; in ParseSpecialName()
828 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "FJ") && in ParseSpecialName()
829 ParseType(state)) { in ParseSpecialName()
832 *state = copy; in ParseSpecialName()
834 if (ParseTwoCharToken(state, "GR") && ParseName(state)) { in ParseSpecialName()
837 *state = copy; in ParseSpecialName()
839 if (ParseTwoCharToken(state, "GA") && ParseEncoding(state)) { in ParseSpecialName()
842 *state = copy; in ParseSpecialName()
844 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "hv") && in ParseSpecialName()
845 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
848 *state = copy; in ParseSpecialName()
854 static bool ParseCallOffset(State *state) { in ParseCallOffset() argument
855 State copy = *state; in ParseCallOffset()
856 if (ParseOneCharToken(state, 'h') && in ParseCallOffset()
857 ParseNVOffset(state) && ParseOneCharToken(state, '_')) { in ParseCallOffset()
860 *state = copy; in ParseCallOffset()
862 if (ParseOneCharToken(state, 'v') && in ParseCallOffset()
863 ParseVOffset(state) && ParseOneCharToken(state, '_')) { in ParseCallOffset()
866 *state = copy; in ParseCallOffset()
872 static bool ParseNVOffset(State *state) { in ParseNVOffset() argument
873 return ParseNumber(state, NULL); in ParseNVOffset()
877 static bool ParseVOffset(State *state) { in ParseVOffset() argument
878 State copy = *state; in ParseVOffset()
879 if (ParseNumber(state, NULL) && ParseOneCharToken(state, '_') && in ParseVOffset()
880 ParseNumber(state, NULL)) { in ParseVOffset()
883 *state = copy; in ParseVOffset()
889 static bool ParseCtorDtorName(State *state) { in ParseCtorDtorName() argument
890 State copy = *state; in ParseCtorDtorName()
891 if (ParseOneCharToken(state, 'C') && in ParseCtorDtorName()
892 ParseCharClass(state, "123")) { in ParseCtorDtorName()
893 const char * const prev_name = state->prev_name; in ParseCtorDtorName()
894 const int prev_name_length = state->prev_name_length; in ParseCtorDtorName()
895 MaybeAppendWithLength(state, prev_name, prev_name_length); in ParseCtorDtorName()
898 *state = copy; in ParseCtorDtorName()
900 if (ParseOneCharToken(state, 'D') && in ParseCtorDtorName()
901 ParseCharClass(state, "012")) { in ParseCtorDtorName()
902 const char * const prev_name = state->prev_name; in ParseCtorDtorName()
903 const int prev_name_length = state->prev_name_length; in ParseCtorDtorName()
904 MaybeAppend(state, "~"); in ParseCtorDtorName()
905 MaybeAppendWithLength(state, prev_name, prev_name_length); in ParseCtorDtorName()
908 *state = copy; in ParseCtorDtorName()
932 static bool ParseType(State *state) { in ParseType() argument
934 State copy = *state; in ParseType()
935 if (ParseCVQualifiers(state) && ParseType(state)) { in ParseType()
938 *state = copy; in ParseType()
940 if (ParseCharClass(state, "OPRCG") && ParseType(state)) { in ParseType()
943 *state = copy; in ParseType()
945 if (ParseTwoCharToken(state, "Dp") && ParseType(state)) { in ParseType()
948 *state = copy; in ParseType()
950 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "tT") && in ParseType()
951 ParseExpression(state) && ParseOneCharToken(state, 'E')) { in ParseType()
954 *state = copy; in ParseType()
956 if (ParseOneCharToken(state, 'U') && ParseSourceName(state) && in ParseType()
957 ParseType(state)) { in ParseType()
960 *state = copy; in ParseType()
962 if (ParseBuiltinType(state) || in ParseType()
963 ParseFunctionType(state) || in ParseType()
964 ParseClassEnumType(state) || in ParseType()
965 ParseArrayType(state) || in ParseType()
966 ParsePointerToMemberType(state) || in ParseType()
967 ParseSubstitution(state)) { in ParseType()
971 if (ParseTemplateTemplateParam(state) && in ParseType()
972 ParseTemplateArgs(state)) { in ParseType()
975 *state = copy; in ParseType()
978 if (ParseTemplateParam(state)) { in ParseType()
988 static bool ParseCVQualifiers(State *state) { in ParseCVQualifiers() argument
990 num_cv_qualifiers += ParseOneCharToken(state, 'r'); in ParseCVQualifiers()
991 num_cv_qualifiers += ParseOneCharToken(state, 'V'); in ParseCVQualifiers()
992 num_cv_qualifiers += ParseOneCharToken(state, 'K'); in ParseCVQualifiers()
998 static bool ParseBuiltinType(State *state) { in ParseBuiltinType() argument
1001 if (state->mangled_cur[0] == p->abbrev[0]) { in ParseBuiltinType()
1002 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1003 ++state->mangled_cur; in ParseBuiltinType()
1008 State copy = *state; in ParseBuiltinType()
1009 if (ParseOneCharToken(state, 'u') && ParseSourceName(state)) { in ParseBuiltinType()
1012 *state = copy; in ParseBuiltinType()
1017 static bool ParseFunctionType(State *state) { in ParseFunctionType() argument
1018 State copy = *state; in ParseFunctionType()
1019 if (ParseOneCharToken(state, 'F') && in ParseFunctionType()
1020 Optional(ParseOneCharToken(state, 'Y')) && in ParseFunctionType()
1021 ParseBareFunctionType(state) && ParseOneCharToken(state, 'E')) { in ParseFunctionType()
1024 *state = copy; in ParseFunctionType()
1029 static bool ParseBareFunctionType(State *state) { in ParseBareFunctionType() argument
1030 State copy = *state; in ParseBareFunctionType()
1031 DisableAppend(state); in ParseBareFunctionType()
1032 if (OneOrMore(ParseType, state)) { in ParseBareFunctionType()
1033 RestoreAppend(state, copy.append); in ParseBareFunctionType()
1034 MaybeAppend(state, "()"); in ParseBareFunctionType()
1037 *state = copy; in ParseBareFunctionType()
1042 static bool ParseClassEnumType(State *state) { in ParseClassEnumType() argument
1043 return ParseName(state); in ParseClassEnumType()
1048 static bool ParseArrayType(State *state) { in ParseArrayType() argument
1049 State copy = *state; in ParseArrayType()
1050 if (ParseOneCharToken(state, 'A') && ParseNumber(state, NULL) && in ParseArrayType()
1051 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1054 *state = copy; in ParseArrayType()
1056 if (ParseOneCharToken(state, 'A') && Optional(ParseExpression(state)) && in ParseArrayType()
1057 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1060 *state = copy; in ParseArrayType()
1065 static bool ParsePointerToMemberType(State *state) { in ParsePointerToMemberType() argument
1066 State copy = *state; in ParsePointerToMemberType()
1067 if (ParseOneCharToken(state, 'M') && ParseType(state) && in ParsePointerToMemberType()
1068 ParseType(state)) { in ParsePointerToMemberType()
1071 *state = copy; in ParsePointerToMemberType()
1077 static bool ParseTemplateParam(State *state) { in ParseTemplateParam() argument
1078 if (ParseTwoCharToken(state, "T_")) { in ParseTemplateParam()
1079 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1083 State copy = *state; in ParseTemplateParam()
1084 if (ParseOneCharToken(state, 'T') && ParseNumber(state, NULL) && in ParseTemplateParam()
1085 ParseOneCharToken(state, '_')) { in ParseTemplateParam()
1086 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1089 *state = copy; in ParseTemplateParam()
1096 static bool ParseTemplateTemplateParam(State *state) { in ParseTemplateTemplateParam() argument
1097 return (ParseTemplateParam(state) || in ParseTemplateTemplateParam()
1098 ParseSubstitution(state)); in ParseTemplateTemplateParam()
1102 static bool ParseTemplateArgs(State *state) { in ParseTemplateArgs() argument
1103 State copy = *state; in ParseTemplateArgs()
1104 DisableAppend(state); in ParseTemplateArgs()
1105 if (ParseOneCharToken(state, 'I') && in ParseTemplateArgs()
1106 OneOrMore(ParseTemplateArg, state) && in ParseTemplateArgs()
1107 ParseOneCharToken(state, 'E')) { in ParseTemplateArgs()
1108 RestoreAppend(state, copy.append); in ParseTemplateArgs()
1109 MaybeAppend(state, "<>"); in ParseTemplateArgs()
1112 *state = copy; in ParseTemplateArgs()
1121 static bool ParseTemplateArg(State *state) { in ParseTemplateArg() argument
1122 State copy = *state; in ParseTemplateArg()
1123 if ((ParseOneCharToken(state, 'I') || ParseOneCharToken(state, 'J')) && in ParseTemplateArg()
1124 ZeroOrMore(ParseTemplateArg, state) && in ParseTemplateArg()
1125 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1128 *state = copy; in ParseTemplateArg()
1130 if (ParseType(state) || in ParseTemplateArg()
1131 ParseExprPrimary(state)) { in ParseTemplateArg()
1134 *state = copy; in ParseTemplateArg()
1136 if (ParseOneCharToken(state, 'X') && ParseExpression(state) && in ParseTemplateArg()
1137 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1140 *state = copy; in ParseTemplateArg()
1153 static bool ParseExpression(State *state) { in ParseExpression() argument
1154 if (ParseTemplateParam(state) || ParseExprPrimary(state)) { in ParseExpression()
1158 State copy = *state; in ParseExpression()
1159 if (ParseOperatorName(state) && in ParseExpression()
1160 ParseExpression(state) && in ParseExpression()
1161 ParseExpression(state) && in ParseExpression()
1162 ParseExpression(state)) { in ParseExpression()
1165 *state = copy; in ParseExpression()
1167 if (ParseOperatorName(state) && in ParseExpression()
1168 ParseExpression(state) && in ParseExpression()
1169 ParseExpression(state)) { in ParseExpression()
1172 *state = copy; in ParseExpression()
1174 if (ParseOperatorName(state) && in ParseExpression()
1175 ParseExpression(state)) { in ParseExpression()
1178 *state = copy; in ParseExpression()
1180 if (ParseTwoCharToken(state, "st") && ParseType(state)) { in ParseExpression()
1183 *state = copy; in ParseExpression()
1185 if (ParseTwoCharToken(state, "sr") && ParseType(state) && in ParseExpression()
1186 ParseUnqualifiedName(state) && in ParseExpression()
1187 ParseTemplateArgs(state)) { in ParseExpression()
1190 *state = copy; in ParseExpression()
1192 if (ParseTwoCharToken(state, "sr") && ParseType(state) && in ParseExpression()
1193 ParseUnqualifiedName(state)) { in ParseExpression()
1196 *state = copy; in ParseExpression()
1205 static bool ParseExprPrimary(State *state) { in ParseExprPrimary() argument
1206 State copy = *state; in ParseExprPrimary()
1207 if (ParseOneCharToken(state, 'L') && ParseType(state) && in ParseExprPrimary()
1208 ParseNumber(state, NULL) && in ParseExprPrimary()
1209 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1212 *state = copy; in ParseExprPrimary()
1214 if (ParseOneCharToken(state, 'L') && ParseType(state) && in ParseExprPrimary()
1215 ParseFloatNumber(state) && in ParseExprPrimary()
1216 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1219 *state = copy; in ParseExprPrimary()
1221 if (ParseOneCharToken(state, 'L') && ParseMangledName(state) && in ParseExprPrimary()
1222 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1225 *state = copy; in ParseExprPrimary()
1227 if (ParseTwoCharToken(state, "LZ") && ParseEncoding(state) && in ParseExprPrimary()
1228 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1231 *state = copy; in ParseExprPrimary()
1239 static bool ParseLocalName(State *state) { in ParseLocalName() argument
1240 State copy = *state; in ParseLocalName()
1241 if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && in ParseLocalName()
1242 ParseOneCharToken(state, 'E') && MaybeAppend(state, "::") && in ParseLocalName()
1243 ParseName(state) && Optional(ParseDiscriminator(state))) { in ParseLocalName()
1246 *state = copy; in ParseLocalName()
1248 if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && in ParseLocalName()
1249 ParseTwoCharToken(state, "Es") && Optional(ParseDiscriminator(state))) { in ParseLocalName()
1252 *state = copy; in ParseLocalName()
1257 static bool ParseDiscriminator(State *state) { in ParseDiscriminator() argument
1258 State copy = *state; in ParseDiscriminator()
1259 if (ParseOneCharToken(state, '_') && ParseNumber(state, NULL)) { in ParseDiscriminator()
1262 *state = copy; in ParseDiscriminator()
1269 static bool ParseSubstitution(State *state) { in ParseSubstitution() argument
1270 if (ParseTwoCharToken(state, "S_")) { in ParseSubstitution()
1271 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1275 State copy = *state; in ParseSubstitution()
1276 if (ParseOneCharToken(state, 'S') && ParseSeqId(state) && in ParseSubstitution()
1277 ParseOneCharToken(state, '_')) { in ParseSubstitution()
1278 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1281 *state = copy; in ParseSubstitution()
1284 if (ParseOneCharToken(state, 'S')) { in ParseSubstitution()
1287 if (state->mangled_cur[0] == p->abbrev[1]) { in ParseSubstitution()
1288 MaybeAppend(state, "std"); in ParseSubstitution()
1290 MaybeAppend(state, "::"); in ParseSubstitution()
1291 MaybeAppend(state, p->real_name); in ParseSubstitution()
1293 ++state->mangled_cur; in ParseSubstitution()
1298 *state = copy; in ParseSubstitution()
1304 static bool ParseTopLevelMangledName(State *state) { in ParseTopLevelMangledName() argument
1305 if (ParseMangledName(state)) { in ParseTopLevelMangledName()
1306 if (state->mangled_cur[0] != '\0') { in ParseTopLevelMangledName()
1308 if (IsFunctionCloneSuffix(state->mangled_cur)) { in ParseTopLevelMangledName()
1313 if (state->mangled_cur[0] == '@') { in ParseTopLevelMangledName()
1314 MaybeAppend(state, state->mangled_cur); in ParseTopLevelMangledName()
1350 State state; in Demangle()
1351 InitState(&state, mangled, out, out_size); in Demangle()
1352 return ParseTopLevelMangledName(&state) && !state.overflowed; in Demangle()