Lines Matching refs:state

189   explicit ComplexityGuard(State *state) : state_(state) {  in ComplexityGuard()  argument
190 ++state->recursion_depth; in ComplexityGuard()
191 ++state->steps; in ComplexityGuard()
256 static void InitState(State *state, const char *mangled, char *out, in InitState() argument
258 state->mangled_begin = mangled; in InitState()
259 state->out = out; in InitState()
260 state->out_end_idx = out_size; in InitState()
261 state->recursion_depth = 0; in InitState()
262 state->steps = 0; in InitState()
264 state->parse_state.mangled_idx = 0; in InitState()
265 state->parse_state.out_cur_idx = 0; in InitState()
266 state->parse_state.prev_name_idx = 0; in InitState()
267 state->parse_state.prev_name_length = -1; in InitState()
268 state->parse_state.nest_level = -1; in InitState()
269 state->parse_state.append = true; in InitState()
272 static inline const char *RemainingInput(State *state) { in RemainingInput() argument
273 return &state->mangled_begin[state->parse_state.mangled_idx]; in RemainingInput()
279 static bool ParseOneCharToken(State *state, const char one_char_token) { in ParseOneCharToken() argument
280 ComplexityGuard guard(state); in ParseOneCharToken()
282 if (RemainingInput(state)[0] == one_char_token) { in ParseOneCharToken() local
283 ++state->parse_state.mangled_idx; in ParseOneCharToken()
292 static bool ParseTwoCharToken(State *state, const char *two_char_token) { in ParseTwoCharToken() argument
293 ComplexityGuard guard(state); in ParseTwoCharToken()
295 if (RemainingInput(state)[0] == two_char_token[0] && in ParseTwoCharToken()
296 RemainingInput(state)[1] == two_char_token[1]) { in ParseTwoCharToken()
297 state->parse_state.mangled_idx += 2; in ParseTwoCharToken()
305 static bool ParseCharClass(State *state, const char *char_class) { in ParseCharClass() argument
306 ComplexityGuard guard(state); in ParseCharClass()
308 if (RemainingInput(state)[0] == '\0') { in ParseCharClass() local
313 if (RemainingInput(state)[0] == *p) { in ParseCharClass()
314 ++state->parse_state.mangled_idx; in ParseCharClass()
321 static bool ParseDigit(State *state, int *digit) { in ParseDigit() argument
322 char c = RemainingInput(state)[0]; in ParseDigit()
323 if (ParseCharClass(state, "0123456789")) { in ParseDigit()
337 static bool OneOrMore(ParseFunc parse_func, State *state) { in OneOrMore() argument
338 if (parse_func(state)) { in OneOrMore()
339 while (parse_func(state)) { in OneOrMore()
350 static bool ZeroOrMore(ParseFunc parse_func, State *state) { in ZeroOrMore() argument
351 while (parse_func(state)) { in ZeroOrMore()
359 static void Append(State *state, const char *const str, const int length) { in Append() argument
361 if (state->parse_state.out_cur_idx + 1 < in Append()
362 state->out_end_idx) { // +1 for '\0' in Append()
363 state->out[state->parse_state.out_cur_idx++] = str[i]; in Append()
366 state->parse_state.out_cur_idx = state->out_end_idx + 1; in Append()
370 if (state->parse_state.out_cur_idx < state->out_end_idx) { in Append()
371 state->out[state->parse_state.out_cur_idx] = in Append()
415 static bool EndsWith(State *state, const char chr) { in EndsWith() argument
416 return state->parse_state.out_cur_idx > 0 && in EndsWith()
417 state->parse_state.out_cur_idx < state->out_end_idx && in EndsWith()
418 chr == state->out[state->parse_state.out_cur_idx - 1]; in EndsWith()
422 static void MaybeAppendWithLength(State *state, const char *const str, in MaybeAppendWithLength() argument
424 if (state->parse_state.append && length > 0) { in MaybeAppendWithLength()
427 if (str[0] == '<' && EndsWith(state, '<')) { in MaybeAppendWithLength()
428 Append(state, " ", 1); in MaybeAppendWithLength()
432 if (state->parse_state.out_cur_idx < state->out_end_idx && in MaybeAppendWithLength()
434 state->parse_state.prev_name_idx = state->parse_state.out_cur_idx; in MaybeAppendWithLength()
435 state->parse_state.prev_name_length = length; in MaybeAppendWithLength()
437 Append(state, str, length); in MaybeAppendWithLength()
442 static bool MaybeAppendDecimal(State *state, unsigned int val) { in MaybeAppendDecimal() argument
449 if (state->parse_state.append) { in MaybeAppendDecimal()
459 Append(state, p, kMaxLength - (p - buf)); in MaybeAppendDecimal()
467 static bool MaybeAppend(State *state, const char *const str) { in MaybeAppend() argument
468 if (state->parse_state.append) { in MaybeAppend()
470 MaybeAppendWithLength(state, str, length); in MaybeAppend()
476 static bool EnterNestedName(State *state) { in EnterNestedName() argument
477 state->parse_state.nest_level = 0; in EnterNestedName()
482 static bool LeaveNestedName(State *state, int16_t prev_value) { in LeaveNestedName() argument
483 state->parse_state.nest_level = prev_value; in LeaveNestedName()
488 static bool DisableAppend(State *state) { in DisableAppend() argument
489 state->parse_state.append = false; in DisableAppend()
494 static bool RestoreAppend(State *state, bool prev_value) { in RestoreAppend() argument
495 state->parse_state.append = prev_value; in RestoreAppend()
500 static void MaybeIncreaseNestLevel(State *state) { in MaybeIncreaseNestLevel() argument
501 if (state->parse_state.nest_level > -1) { in MaybeIncreaseNestLevel()
502 ++state->parse_state.nest_level; in MaybeIncreaseNestLevel()
507 static void MaybeAppendSeparator(State *state) { in MaybeAppendSeparator() argument
508 if (state->parse_state.nest_level >= 1) { in MaybeAppendSeparator()
509 MaybeAppend(state, "::"); in MaybeAppendSeparator()
514 static void MaybeCancelLastSeparator(State *state) { in MaybeCancelLastSeparator() argument
515 if (state->parse_state.nest_level >= 1 && state->parse_state.append && in MaybeCancelLastSeparator()
516 state->parse_state.out_cur_idx >= 2) { in MaybeCancelLastSeparator()
517 state->parse_state.out_cur_idx -= 2; in MaybeCancelLastSeparator()
518 state->out[state->parse_state.out_cur_idx] = '\0'; in MaybeCancelLastSeparator()
524 static bool IdentifierIsAnonymousNamespace(State *state, int length) { in IdentifierIsAnonymousNamespace() argument
528 StrPrefix(RemainingInput(state), anon_prefix)); in IdentifierIsAnonymousNamespace()
532 static bool ParseMangledName(State *state);
533 static bool ParseEncoding(State *state);
534 static bool ParseName(State *state);
535 static bool ParseUnscopedName(State *state);
536 static bool ParseNestedName(State *state);
537 static bool ParsePrefix(State *state);
538 static bool ParseUnqualifiedName(State *state);
539 static bool ParseSourceName(State *state);
540 static bool ParseLocalSourceName(State *state);
541 static bool ParseUnnamedTypeName(State *state);
542 static bool ParseNumber(State *state, int *number_out);
543 static bool ParseFloatNumber(State *state);
544 static bool ParseSeqId(State *state);
545 static bool ParseIdentifier(State *state, int length);
546 static bool ParseOperatorName(State *state, int *arity);
547 static bool ParseSpecialName(State *state);
548 static bool ParseCallOffset(State *state);
549 static bool ParseNVOffset(State *state);
550 static bool ParseVOffset(State *state);
551 static bool ParseCtorDtorName(State *state);
552 static bool ParseDecltype(State *state);
553 static bool ParseType(State *state);
554 static bool ParseCVQualifiers(State *state);
555 static bool ParseBuiltinType(State *state);
556 static bool ParseFunctionType(State *state);
557 static bool ParseBareFunctionType(State *state);
558 static bool ParseClassEnumType(State *state);
559 static bool ParseArrayType(State *state);
560 static bool ParsePointerToMemberType(State *state);
561 static bool ParseTemplateParam(State *state);
562 static bool ParseTemplateTemplateParam(State *state);
563 static bool ParseTemplateArgs(State *state);
564 static bool ParseTemplateArg(State *state);
565 static bool ParseBaseUnresolvedName(State *state);
566 static bool ParseUnresolvedName(State *state);
567 static bool ParseExpression(State *state);
568 static bool ParseExprPrimary(State *state);
569 static bool ParseExprCastValue(State *state);
570 static bool ParseLocalName(State *state);
571 static bool ParseLocalNameSuffix(State *state);
572 static bool ParseDiscriminator(State *state);
573 static bool ParseSubstitution(State *state, bool accept_std);
607 static bool ParseMangledName(State *state) { in ParseMangledName() argument
608 ComplexityGuard guard(state); in ParseMangledName()
610 return ParseTwoCharToken(state, "_Z") && ParseEncoding(state); in ParseMangledName()
616 static bool ParseEncoding(State *state) { in ParseEncoding() argument
617 ComplexityGuard guard(state); in ParseEncoding()
624 if (ParseName(state) && Optional(ParseBareFunctionType(state))) { in ParseEncoding()
628 if (ParseSpecialName(state)) { in ParseEncoding()
638 static bool ParseName(State *state) { in ParseName() argument
639 ComplexityGuard guard(state); in ParseName()
641 if (ParseNestedName(state) || ParseLocalName(state)) { in ParseName()
653 ParseState copy = state->parse_state; in ParseName()
655 if (ParseSubstitution(state, /*accept_std=*/false) && in ParseName()
656 ParseTemplateArgs(state)) { in ParseName()
659 state->parse_state = copy; in ParseName()
663 return ParseUnscopedName(state) && Optional(ParseTemplateArgs(state)); in ParseName()
668 static bool ParseUnscopedName(State *state) { in ParseUnscopedName() argument
669 ComplexityGuard guard(state); in ParseUnscopedName()
671 if (ParseUnqualifiedName(state)) { in ParseUnscopedName()
675 ParseState copy = state->parse_state; in ParseUnscopedName()
676 if (ParseTwoCharToken(state, "St") && MaybeAppend(state, "std::") && in ParseUnscopedName()
677 ParseUnqualifiedName(state)) { in ParseUnscopedName()
680 state->parse_state = copy; in ParseUnscopedName()
686 static inline bool ParseRefQualifier(State *state) { in ParseRefQualifier() argument
687 return ParseCharClass(state, "OR"); in ParseRefQualifier()
694 static bool ParseNestedName(State *state) { in ParseNestedName() argument
695 ComplexityGuard guard(state); in ParseNestedName()
697 ParseState copy = state->parse_state; in ParseNestedName()
698 if (ParseOneCharToken(state, 'N') && EnterNestedName(state) && in ParseNestedName()
699 Optional(ParseCVQualifiers(state)) && in ParseNestedName()
700 Optional(ParseRefQualifier(state)) && ParsePrefix(state) && in ParseNestedName()
701 LeaveNestedName(state, copy.nest_level) && in ParseNestedName()
702 ParseOneCharToken(state, 'E')) { in ParseNestedName()
705 state->parse_state = copy; in ParseNestedName()
720 static bool ParsePrefix(State *state) { in ParsePrefix() argument
721 ComplexityGuard guard(state); in ParsePrefix()
725 MaybeAppendSeparator(state); in ParsePrefix()
726 if (ParseTemplateParam(state) || in ParsePrefix()
727 ParseSubstitution(state, /*accept_std=*/true) || in ParsePrefix()
728 ParseUnscopedName(state) || in ParsePrefix()
729 (ParseOneCharToken(state, 'M') && ParseUnnamedTypeName(state))) { in ParsePrefix()
731 MaybeIncreaseNestLevel(state); in ParsePrefix()
734 MaybeCancelLastSeparator(state); in ParsePrefix()
735 if (has_something && ParseTemplateArgs(state)) { in ParsePrefix()
736 return ParsePrefix(state); in ParsePrefix()
749 static bool ParseUnqualifiedName(State *state) { in ParseUnqualifiedName() argument
750 ComplexityGuard guard(state); in ParseUnqualifiedName()
752 return (ParseOperatorName(state, nullptr) || ParseCtorDtorName(state) || in ParseUnqualifiedName()
753 ParseSourceName(state) || ParseLocalSourceName(state) || in ParseUnqualifiedName()
754 ParseUnnamedTypeName(state)); in ParseUnqualifiedName()
758 static bool ParseSourceName(State *state) { in ParseSourceName() argument
759 ComplexityGuard guard(state); in ParseSourceName()
761 ParseState copy = state->parse_state; in ParseSourceName()
763 if (ParseNumber(state, &length) && ParseIdentifier(state, length)) { in ParseSourceName()
766 state->parse_state = copy; in ParseSourceName()
775 static bool ParseLocalSourceName(State *state) { in ParseLocalSourceName() argument
776 ComplexityGuard guard(state); in ParseLocalSourceName()
778 ParseState copy = state->parse_state; in ParseLocalSourceName()
779 if (ParseOneCharToken(state, 'L') && ParseSourceName(state) && in ParseLocalSourceName()
780 Optional(ParseDiscriminator(state))) { in ParseLocalSourceName()
783 state->parse_state = copy; in ParseLocalSourceName()
791 static bool ParseUnnamedTypeName(State *state) { in ParseUnnamedTypeName() argument
792 ComplexityGuard guard(state); in ParseUnnamedTypeName()
794 ParseState copy = state->parse_state; in ParseUnnamedTypeName()
800 if (ParseTwoCharToken(state, "Ut") && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
802 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
803 MaybeAppend(state, "{unnamed type#"); in ParseUnnamedTypeName()
804 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
805 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
808 state->parse_state = copy; in ParseUnnamedTypeName()
812 if (ParseTwoCharToken(state, "Ul") && DisableAppend(state) && in ParseUnnamedTypeName()
813 OneOrMore(ParseType, state) && RestoreAppend(state, copy.append) && in ParseUnnamedTypeName()
814 ParseOneCharToken(state, 'E') && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
816 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
817 MaybeAppend(state, "{lambda()#"); in ParseUnnamedTypeName()
818 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
819 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
822 state->parse_state = copy; in ParseUnnamedTypeName()
830 static bool ParseNumber(State *state, int *number_out) { in ParseNumber() argument
831 ComplexityGuard guard(state); in ParseNumber()
834 if (ParseOneCharToken(state, 'n')) { in ParseNumber()
837 const char *p = RemainingInput(state); in ParseNumber()
852 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseNumber()
853 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseNumber()
865 static bool ParseFloatNumber(State *state) { in ParseFloatNumber() argument
866 ComplexityGuard guard(state); in ParseFloatNumber()
868 const char *p = RemainingInput(state); in ParseFloatNumber()
874 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseFloatNumber()
875 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseFloatNumber()
883 static bool ParseSeqId(State *state) { in ParseSeqId() argument
884 ComplexityGuard guard(state); in ParseSeqId()
886 const char *p = RemainingInput(state); in ParseSeqId()
892 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseSeqId()
893 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseSeqId()
900 static bool ParseIdentifier(State *state, int length) { in ParseIdentifier() argument
901 ComplexityGuard guard(state); in ParseIdentifier()
903 if (length < 0 || !AtLeastNumCharsRemaining(RemainingInput(state), length)) { in ParseIdentifier()
906 if (IdentifierIsAnonymousNamespace(state, length)) { in ParseIdentifier()
907 MaybeAppend(state, "(anonymous namespace)"); in ParseIdentifier()
909 MaybeAppendWithLength(state, RemainingInput(state), length); in ParseIdentifier()
911 state->parse_state.mangled_idx += length; in ParseIdentifier()
918 static bool ParseOperatorName(State *state, int *arity) { in ParseOperatorName() argument
919 ComplexityGuard guard(state); in ParseOperatorName()
921 if (!AtLeastNumCharsRemaining(RemainingInput(state), 2)) { in ParseOperatorName()
925 ParseState copy = state->parse_state; in ParseOperatorName()
926 if (ParseTwoCharToken(state, "cv") && MaybeAppend(state, "operator ") && in ParseOperatorName()
927 EnterNestedName(state) && ParseType(state) && in ParseOperatorName()
928 LeaveNestedName(state, copy.nest_level)) { in ParseOperatorName()
934 state->parse_state = copy; in ParseOperatorName()
937 if (ParseOneCharToken(state, 'v') && ParseDigit(state, arity) && in ParseOperatorName()
938 ParseSourceName(state)) { in ParseOperatorName()
941 state->parse_state = copy; in ParseOperatorName()
945 if (!(IsLower(RemainingInput(state)[0]) && in ParseOperatorName()
946 IsAlpha(RemainingInput(state)[1]))) { in ParseOperatorName()
952 if (RemainingInput(state)[0] == p->abbrev[0] && in ParseOperatorName()
953 RemainingInput(state)[1] == p->abbrev[1]) { in ParseOperatorName()
957 MaybeAppend(state, "operator"); in ParseOperatorName()
959 MaybeAppend(state, " "); in ParseOperatorName()
961 MaybeAppend(state, p->real_name); in ParseOperatorName()
962 state->parse_state.mangled_idx += 2; in ParseOperatorName()
988 static bool ParseSpecialName(State *state) { in ParseSpecialName() argument
989 ComplexityGuard guard(state); in ParseSpecialName()
991 ParseState copy = state->parse_state; in ParseSpecialName()
992 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTISH") && in ParseSpecialName()
993 ParseType(state)) { in ParseSpecialName()
996 state->parse_state = copy; in ParseSpecialName()
998 if (ParseTwoCharToken(state, "Tc") && ParseCallOffset(state) && in ParseSpecialName()
999 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1002 state->parse_state = copy; in ParseSpecialName()
1004 if (ParseTwoCharToken(state, "GV") && ParseName(state)) { in ParseSpecialName()
1007 state->parse_state = copy; in ParseSpecialName()
1009 if (ParseOneCharToken(state, 'T') && ParseCallOffset(state) && in ParseSpecialName()
1010 ParseEncoding(state)) { in ParseSpecialName()
1013 state->parse_state = copy; in ParseSpecialName()
1016 if (ParseTwoCharToken(state, "TC") && ParseType(state) && in ParseSpecialName()
1017 ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseSpecialName()
1018 DisableAppend(state) && ParseType(state)) { in ParseSpecialName()
1019 RestoreAppend(state, copy.append); in ParseSpecialName()
1022 state->parse_state = copy; in ParseSpecialName()
1024 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "FJ") && in ParseSpecialName()
1025 ParseType(state)) { in ParseSpecialName()
1028 state->parse_state = copy; in ParseSpecialName()
1030 if (ParseTwoCharToken(state, "GR") && ParseName(state)) { in ParseSpecialName()
1033 state->parse_state = copy; in ParseSpecialName()
1035 if (ParseTwoCharToken(state, "GA") && ParseEncoding(state)) { in ParseSpecialName()
1038 state->parse_state = copy; in ParseSpecialName()
1040 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "hv") && in ParseSpecialName()
1041 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1044 state->parse_state = copy; in ParseSpecialName()
1050 static bool ParseCallOffset(State *state) { in ParseCallOffset() argument
1051 ComplexityGuard guard(state); in ParseCallOffset()
1053 ParseState copy = state->parse_state; in ParseCallOffset()
1054 if (ParseOneCharToken(state, 'h') && ParseNVOffset(state) && in ParseCallOffset()
1055 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1058 state->parse_state = copy; in ParseCallOffset()
1060 if (ParseOneCharToken(state, 'v') && ParseVOffset(state) && in ParseCallOffset()
1061 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1064 state->parse_state = copy; in ParseCallOffset()
1070 static bool ParseNVOffset(State *state) { in ParseNVOffset() argument
1071 ComplexityGuard guard(state); in ParseNVOffset()
1073 return ParseNumber(state, nullptr); in ParseNVOffset()
1077 static bool ParseVOffset(State *state) { in ParseVOffset() argument
1078 ComplexityGuard guard(state); in ParseVOffset()
1080 ParseState copy = state->parse_state; in ParseVOffset()
1081 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseVOffset()
1082 ParseNumber(state, nullptr)) { in ParseVOffset()
1085 state->parse_state = copy; in ParseVOffset()
1096 static bool ParseCtorDtorName(State *state) { in ParseCtorDtorName() argument
1097 ComplexityGuard guard(state); in ParseCtorDtorName()
1099 ParseState copy = state->parse_state; in ParseCtorDtorName()
1100 if (ParseOneCharToken(state, 'C')) { in ParseCtorDtorName()
1101 if (ParseCharClass(state, "1234")) { in ParseCtorDtorName()
1103 state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1104 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1105 state->parse_state.prev_name_length); in ParseCtorDtorName()
1107 } else if (ParseOneCharToken(state, 'I') && ParseCharClass(state, "12") && in ParseCtorDtorName()
1108 ParseClassEnumType(state)) { in ParseCtorDtorName()
1112 state->parse_state = copy; in ParseCtorDtorName()
1114 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "0124")) { in ParseCtorDtorName()
1115 const char *const prev_name = state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1116 MaybeAppend(state, "~"); in ParseCtorDtorName()
1117 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1118 state->parse_state.prev_name_length); in ParseCtorDtorName()
1121 state->parse_state = copy; in ParseCtorDtorName()
1128 static bool ParseDecltype(State *state) { in ParseDecltype() argument
1129 ComplexityGuard guard(state); in ParseDecltype()
1132 ParseState copy = state->parse_state; in ParseDecltype()
1133 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "tT") && in ParseDecltype()
1134 ParseExpression(state) && ParseOneCharToken(state, 'E')) { in ParseDecltype()
1137 state->parse_state = copy; in ParseDecltype()
1161 static bool ParseType(State *state) { in ParseType() argument
1162 ComplexityGuard guard(state); in ParseType()
1164 ParseState copy = state->parse_state; in ParseType()
1179 if (ParseCVQualifiers(state)) { in ParseType()
1180 const bool result = ParseType(state); in ParseType()
1181 if (!result) state->parse_state = copy; in ParseType()
1184 state->parse_state = copy; in ParseType()
1190 if (ParseCharClass(state, "OPRCG")) { in ParseType()
1191 const bool result = ParseType(state); in ParseType()
1192 if (!result) state->parse_state = copy; in ParseType()
1195 state->parse_state = copy; in ParseType()
1197 if (ParseTwoCharToken(state, "Dp") && ParseType(state)) { in ParseType()
1200 state->parse_state = copy; in ParseType()
1202 if (ParseOneCharToken(state, 'U') && ParseSourceName(state) && in ParseType()
1203 ParseType(state)) { in ParseType()
1206 state->parse_state = copy; in ParseType()
1208 if (ParseBuiltinType(state) || ParseFunctionType(state) || in ParseType()
1209 ParseClassEnumType(state) || ParseArrayType(state) || in ParseType()
1210 ParsePointerToMemberType(state) || ParseDecltype(state) || in ParseType()
1212 ParseSubstitution(state, /*accept_std=*/false)) { in ParseType()
1216 if (ParseTemplateTemplateParam(state) && ParseTemplateArgs(state)) { in ParseType()
1219 state->parse_state = copy; in ParseType()
1222 if (ParseTemplateParam(state)) { in ParseType()
1226 if (ParseTwoCharToken(state, "Dv") && ParseNumber(state, nullptr) && in ParseType()
1227 ParseOneCharToken(state, '_')) { in ParseType()
1230 state->parse_state = copy; in ParseType()
1238 static bool ParseCVQualifiers(State *state) { in ParseCVQualifiers() argument
1239 ComplexityGuard guard(state); in ParseCVQualifiers()
1242 num_cv_qualifiers += ParseOneCharToken(state, 'r'); in ParseCVQualifiers()
1243 num_cv_qualifiers += ParseOneCharToken(state, 'V'); in ParseCVQualifiers()
1244 num_cv_qualifiers += ParseOneCharToken(state, 'K'); in ParseCVQualifiers()
1255 static bool ParseBuiltinType(State *state) { in ParseBuiltinType() argument
1256 ComplexityGuard guard(state); in ParseBuiltinType()
1262 if (ParseOneCharToken(state, p->abbrev[0])) { in ParseBuiltinType()
1263 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1266 } else if (p->abbrev[2] == '\0' && ParseTwoCharToken(state, p->abbrev)) { in ParseBuiltinType()
1267 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1272 ParseState copy = state->parse_state; in ParseBuiltinType()
1273 if (ParseOneCharToken(state, 'u') && ParseSourceName(state)) { in ParseBuiltinType()
1276 state->parse_state = copy; in ParseBuiltinType()
1287 static bool ParseExceptionSpec(State *state) { in ParseExceptionSpec() argument
1288 ComplexityGuard guard(state); in ParseExceptionSpec()
1291 if (ParseTwoCharToken(state, "Do")) return true; in ParseExceptionSpec()
1293 ParseState copy = state->parse_state; in ParseExceptionSpec()
1294 if (ParseTwoCharToken(state, "DO") && ParseExpression(state) && in ParseExceptionSpec()
1295 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1298 state->parse_state = copy; in ParseExceptionSpec()
1299 if (ParseTwoCharToken(state, "Dw") && OneOrMore(ParseType, state) && in ParseExceptionSpec()
1300 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1303 state->parse_state = copy; in ParseExceptionSpec()
1309 static bool ParseFunctionType(State *state) { in ParseFunctionType() argument
1310 ComplexityGuard guard(state); in ParseFunctionType()
1312 ParseState copy = state->parse_state; in ParseFunctionType()
1313 if (Optional(ParseExceptionSpec(state)) && ParseOneCharToken(state, 'F') && in ParseFunctionType()
1314 Optional(ParseOneCharToken(state, 'Y')) && ParseBareFunctionType(state) && in ParseFunctionType()
1315 Optional(ParseOneCharToken(state, 'O')) && in ParseFunctionType()
1316 ParseOneCharToken(state, 'E')) { in ParseFunctionType()
1319 state->parse_state = copy; in ParseFunctionType()
1324 static bool ParseBareFunctionType(State *state) { in ParseBareFunctionType() argument
1325 ComplexityGuard guard(state); in ParseBareFunctionType()
1327 ParseState copy = state->parse_state; in ParseBareFunctionType()
1328 DisableAppend(state); in ParseBareFunctionType()
1329 if (OneOrMore(ParseType, state)) { in ParseBareFunctionType()
1330 RestoreAppend(state, copy.append); in ParseBareFunctionType()
1331 MaybeAppend(state, "()"); in ParseBareFunctionType()
1334 state->parse_state = copy; in ParseBareFunctionType()
1339 static bool ParseClassEnumType(State *state) { in ParseClassEnumType() argument
1340 ComplexityGuard guard(state); in ParseClassEnumType()
1342 return ParseName(state); in ParseClassEnumType()
1347 static bool ParseArrayType(State *state) { in ParseArrayType() argument
1348 ComplexityGuard guard(state); in ParseArrayType()
1350 ParseState copy = state->parse_state; in ParseArrayType()
1351 if (ParseOneCharToken(state, 'A') && ParseNumber(state, nullptr) && in ParseArrayType()
1352 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1355 state->parse_state = copy; in ParseArrayType()
1357 if (ParseOneCharToken(state, 'A') && Optional(ParseExpression(state)) && in ParseArrayType()
1358 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1361 state->parse_state = copy; in ParseArrayType()
1366 static bool ParsePointerToMemberType(State *state) { in ParsePointerToMemberType() argument
1367 ComplexityGuard guard(state); in ParsePointerToMemberType()
1369 ParseState copy = state->parse_state; in ParsePointerToMemberType()
1370 if (ParseOneCharToken(state, 'M') && ParseType(state) && ParseType(state)) { in ParsePointerToMemberType()
1373 state->parse_state = copy; in ParsePointerToMemberType()
1379 static bool ParseTemplateParam(State *state) { in ParseTemplateParam() argument
1380 ComplexityGuard guard(state); in ParseTemplateParam()
1382 if (ParseTwoCharToken(state, "T_")) { in ParseTemplateParam()
1383 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1387 ParseState copy = state->parse_state; in ParseTemplateParam()
1388 if (ParseOneCharToken(state, 'T') && ParseNumber(state, nullptr) && in ParseTemplateParam()
1389 ParseOneCharToken(state, '_')) { in ParseTemplateParam()
1390 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1393 state->parse_state = copy; in ParseTemplateParam()
1399 static bool ParseTemplateTemplateParam(State *state) { in ParseTemplateTemplateParam() argument
1400 ComplexityGuard guard(state); in ParseTemplateTemplateParam()
1402 return (ParseTemplateParam(state) || in ParseTemplateTemplateParam()
1404 ParseSubstitution(state, /*accept_std=*/false)); in ParseTemplateTemplateParam()
1408 static bool ParseTemplateArgs(State *state) { in ParseTemplateArgs() argument
1409 ComplexityGuard guard(state); in ParseTemplateArgs()
1411 ParseState copy = state->parse_state; in ParseTemplateArgs()
1412 DisableAppend(state); in ParseTemplateArgs()
1413 if (ParseOneCharToken(state, 'I') && OneOrMore(ParseTemplateArg, state) && in ParseTemplateArgs()
1414 ParseOneCharToken(state, 'E')) { in ParseTemplateArgs()
1415 RestoreAppend(state, copy.append); in ParseTemplateArgs()
1416 MaybeAppend(state, "<>"); in ParseTemplateArgs()
1419 state->parse_state = copy; in ParseTemplateArgs()
1427 static bool ParseTemplateArg(State *state) { in ParseTemplateArg() argument
1428 ComplexityGuard guard(state); in ParseTemplateArg()
1430 ParseState copy = state->parse_state; in ParseTemplateArg()
1431 if (ParseOneCharToken(state, 'J') && ZeroOrMore(ParseTemplateArg, state) && in ParseTemplateArg()
1432 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1435 state->parse_state = copy; in ParseTemplateArg()
1505 if (ParseLocalSourceName(state) && Optional(ParseTemplateArgs(state))) { in ParseTemplateArg()
1506 copy = state->parse_state; in ParseTemplateArg()
1507 if (ParseExprCastValue(state) && ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1510 state->parse_state = copy; in ParseTemplateArg()
1516 if (ParseType(state) || ParseExprPrimary(state)) { in ParseTemplateArg()
1519 state->parse_state = copy; in ParseTemplateArg()
1521 if (ParseOneCharToken(state, 'X') && ParseExpression(state) && in ParseTemplateArg()
1522 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1525 state->parse_state = copy; in ParseTemplateArg()
1532 static inline bool ParseUnresolvedType(State *state) { in ParseUnresolvedType() argument
1534 return (ParseTemplateParam(state) && Optional(ParseTemplateArgs(state))) || in ParseUnresolvedType()
1535 ParseDecltype(state) || ParseSubstitution(state, /*accept_std=*/false); in ParseUnresolvedType()
1539 static inline bool ParseSimpleId(State *state) { in ParseSimpleId() argument
1544 return ParseSourceName(state) && Optional(ParseTemplateArgs(state)); in ParseSimpleId()
1550 static bool ParseBaseUnresolvedName(State *state) { in ParseBaseUnresolvedName() argument
1551 ComplexityGuard guard(state); in ParseBaseUnresolvedName()
1554 if (ParseSimpleId(state)) { in ParseBaseUnresolvedName()
1558 ParseState copy = state->parse_state; in ParseBaseUnresolvedName()
1559 if (ParseTwoCharToken(state, "on") && ParseOperatorName(state, nullptr) && in ParseBaseUnresolvedName()
1560 Optional(ParseTemplateArgs(state))) { in ParseBaseUnresolvedName()
1563 state->parse_state = copy; in ParseBaseUnresolvedName()
1565 if (ParseTwoCharToken(state, "dn") && in ParseBaseUnresolvedName()
1566 (ParseUnresolvedType(state) || ParseSimpleId(state))) { in ParseBaseUnresolvedName()
1569 state->parse_state = copy; in ParseBaseUnresolvedName()
1580 static bool ParseUnresolvedName(State *state) { in ParseUnresolvedName() argument
1581 ComplexityGuard guard(state); in ParseUnresolvedName()
1584 ParseState copy = state->parse_state; in ParseUnresolvedName()
1585 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
1586 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1589 state->parse_state = copy; in ParseUnresolvedName()
1591 if (ParseTwoCharToken(state, "sr") && ParseUnresolvedType(state) && in ParseUnresolvedName()
1592 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1595 state->parse_state = copy; in ParseUnresolvedName()
1597 if (ParseTwoCharToken(state, "sr") && ParseOneCharToken(state, 'N') && in ParseUnresolvedName()
1598 ParseUnresolvedType(state) && in ParseUnresolvedName()
1599 OneOrMore(/* <unresolved-qualifier-level> ::= */ ParseSimpleId, state) && in ParseUnresolvedName()
1600 ParseOneCharToken(state, 'E') && ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1603 state->parse_state = copy; in ParseUnresolvedName()
1605 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
1606 ParseTwoCharToken(state, "sr") && in ParseUnresolvedName()
1607 OneOrMore(/* <unresolved-qualifier-level> ::= */ ParseSimpleId, state) && in ParseUnresolvedName()
1608 ParseOneCharToken(state, 'E') && ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1611 state->parse_state = copy; in ParseUnresolvedName()
1636 static bool ParseExpression(State *state) { in ParseExpression() argument
1637 ComplexityGuard guard(state); in ParseExpression()
1639 if (ParseTemplateParam(state) || ParseExprPrimary(state)) { in ParseExpression()
1643 ParseState copy = state->parse_state; in ParseExpression()
1646 if (ParseTwoCharToken(state, "cl") && OneOrMore(ParseExpression, state) && in ParseExpression()
1647 ParseOneCharToken(state, 'E')) { in ParseExpression()
1650 state->parse_state = copy; in ParseExpression()
1654 if (ParseTwoCharToken(state, "cp") && ParseSimpleId(state) && in ParseExpression()
1655 ZeroOrMore(ParseExpression, state) && ParseOneCharToken(state, 'E')) { in ParseExpression()
1658 state->parse_state = copy; in ParseExpression()
1661 if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) && in ParseExpression()
1662 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseExpression()
1665 state->parse_state = copy; in ParseExpression()
1668 if (ParseTwoCharToken(state, "fL") && Optional(ParseNumber(state, nullptr)) && in ParseExpression()
1669 ParseOneCharToken(state, 'p') && Optional(ParseCVQualifiers(state)) && in ParseExpression()
1670 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseExpression()
1673 state->parse_state = copy; in ParseExpression()
1683 if (ParseTwoCharToken(state, "cv")) { in ParseExpression()
1684 if (ParseType(state)) { in ParseExpression()
1685 ParseState copy2 = state->parse_state; in ParseExpression()
1686 if (ParseOneCharToken(state, '_') && ZeroOrMore(ParseExpression, state) && in ParseExpression()
1687 ParseOneCharToken(state, 'E')) { in ParseExpression()
1690 state->parse_state = copy2; in ParseExpression()
1691 if (ParseExpression(state)) { in ParseExpression()
1702 if (ParseOperatorName(state, &arity) && in ParseExpression()
1704 (arity < 3 || ParseExpression(state)) && in ParseExpression()
1705 (arity < 2 || ParseExpression(state)) && in ParseExpression()
1706 (arity < 1 || ParseExpression(state))) { in ParseExpression()
1710 state->parse_state = copy; in ParseExpression()
1713 if (ParseTwoCharToken(state, "st") && ParseType(state)) { in ParseExpression()
1716 state->parse_state = copy; in ParseExpression()
1719 if ((ParseTwoCharToken(state, "dt") || ParseTwoCharToken(state, "pt")) && in ParseExpression()
1720 ParseExpression(state) && ParseType(state)) { in ParseExpression()
1723 state->parse_state = copy; in ParseExpression()
1728 if (ParseTwoCharToken(state, "ds") && ParseExpression(state) && in ParseExpression()
1729 ParseExpression(state)) { in ParseExpression()
1732 state->parse_state = copy; in ParseExpression()
1735 if (ParseTwoCharToken(state, "sp") && ParseExpression(state)) { in ParseExpression()
1738 state->parse_state = copy; in ParseExpression()
1740 return ParseUnresolvedName(state); in ParseExpression()
1769 static bool ParseExprPrimary(State *state) { in ParseExprPrimary() argument
1770 ComplexityGuard guard(state); in ParseExprPrimary()
1772 ParseState copy = state->parse_state; in ParseExprPrimary()
1776 if (ParseTwoCharToken(state, "LZ")) { in ParseExprPrimary()
1777 if (ParseEncoding(state) && ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1781 state->parse_state = copy; in ParseExprPrimary()
1786 if (ParseOneCharToken(state, 'L') && ParseType(state) && in ParseExprPrimary()
1787 ParseExprCastValue(state)) { in ParseExprPrimary()
1790 state->parse_state = copy; in ParseExprPrimary()
1792 if (ParseOneCharToken(state, 'L') && ParseMangledName(state) && in ParseExprPrimary()
1793 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1796 state->parse_state = copy; in ParseExprPrimary()
1802 static bool ParseExprCastValue(State *state) { in ParseExprCastValue() argument
1803 ComplexityGuard guard(state); in ParseExprCastValue()
1808 ParseState copy = state->parse_state; in ParseExprCastValue()
1809 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, 'E')) { in ParseExprCastValue()
1812 state->parse_state = copy; in ParseExprCastValue()
1814 if (ParseFloatNumber(state) && ParseOneCharToken(state, 'E')) { in ParseExprCastValue()
1817 state->parse_state = copy; in ParseExprCastValue()
1831 static bool ParseLocalNameSuffix(State *state) { in ParseLocalNameSuffix() argument
1832 ComplexityGuard guard(state); in ParseLocalNameSuffix()
1835 if (MaybeAppend(state, "::") && ParseName(state) && in ParseLocalNameSuffix()
1836 Optional(ParseDiscriminator(state))) { in ParseLocalNameSuffix()
1843 if (state->parse_state.append) { in ParseLocalNameSuffix()
1844 state->out[state->parse_state.out_cur_idx - 2] = '\0'; in ParseLocalNameSuffix()
1847 return ParseOneCharToken(state, 's') && Optional(ParseDiscriminator(state)); in ParseLocalNameSuffix()
1850 static bool ParseLocalName(State *state) { in ParseLocalName() argument
1851 ComplexityGuard guard(state); in ParseLocalName()
1853 ParseState copy = state->parse_state; in ParseLocalName()
1854 if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && in ParseLocalName()
1855 ParseOneCharToken(state, 'E') && ParseLocalNameSuffix(state)) { in ParseLocalName()
1858 state->parse_state = copy; in ParseLocalName()
1863 static bool ParseDiscriminator(State *state) { in ParseDiscriminator() argument
1864 ComplexityGuard guard(state); in ParseDiscriminator()
1866 ParseState copy = state->parse_state; in ParseDiscriminator()
1867 if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr)) { in ParseDiscriminator()
1870 state->parse_state = copy; in ParseDiscriminator()
1885 static bool ParseSubstitution(State *state, bool accept_std) { in ParseSubstitution() argument
1886 ComplexityGuard guard(state); in ParseSubstitution()
1888 if (ParseTwoCharToken(state, "S_")) { in ParseSubstitution()
1889 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1893 ParseState copy = state->parse_state; in ParseSubstitution()
1894 if (ParseOneCharToken(state, 'S') && ParseSeqId(state) && in ParseSubstitution()
1895 ParseOneCharToken(state, '_')) { in ParseSubstitution()
1896 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1899 state->parse_state = copy; in ParseSubstitution()
1902 if (ParseOneCharToken(state, 'S')) { in ParseSubstitution()
1905 if (RemainingInput(state)[0] == p->abbrev[1] && in ParseSubstitution()
1907 MaybeAppend(state, "std"); in ParseSubstitution()
1909 MaybeAppend(state, "::"); in ParseSubstitution()
1910 MaybeAppend(state, p->real_name); in ParseSubstitution()
1912 ++state->parse_state.mangled_idx; in ParseSubstitution()
1917 state->parse_state = copy; in ParseSubstitution()
1923 static bool ParseTopLevelMangledName(State *state) { in ParseTopLevelMangledName() argument
1924 ComplexityGuard guard(state); in ParseTopLevelMangledName()
1926 if (ParseMangledName(state)) { in ParseTopLevelMangledName()
1927 if (RemainingInput(state)[0] != '\0') { in ParseTopLevelMangledName() local
1929 if (IsFunctionCloneSuffix(RemainingInput(state))) { in ParseTopLevelMangledName()
1934 if (RemainingInput(state)[0] == '@') { in ParseTopLevelMangledName() local
1935 MaybeAppend(state, RemainingInput(state)); in ParseTopLevelMangledName()
1945 static bool Overflowed(const State *state) { in Overflowed() argument
1946 return state->parse_state.out_cur_idx >= state->out_end_idx; in Overflowed()
1951 State state; in Demangle() local
1952 InitState(&state, mangled, out, out_size); in Demangle()
1953 return ParseTopLevelMangledName(&state) && !Overflowed(&state) && in Demangle()
1954 state.parse_state.out_cur_idx > 0; in Demangle()