• Home
  • Raw
  • Download

Lines Matching full:state

159 // State needed for demangling.  This struct is copied in almost every stack
177 // One-off state for demangling that's not subject to backtracking -- either
189 ParseState parse_state; // Backtrackable state copied for most frames.
190 } State; typedef
197 explicit ComplexityGuard(State *state) : state_(state) { in ComplexityGuard() argument
198 ++state->recursion_depth; in ComplexityGuard()
199 ++state->steps; in ComplexityGuard()
230 State *state_;
264 static void InitState(State* state, in InitState() argument
268 state->mangled_begin = mangled; in InitState()
269 state->out = out; in InitState()
270 state->out_end_idx = static_cast<int>(out_size); in InitState()
271 state->recursion_depth = 0; in InitState()
272 state->steps = 0; in InitState()
274 state->parse_state.mangled_idx = 0; in InitState()
275 state->parse_state.out_cur_idx = 0; in InitState()
276 state->parse_state.prev_name_idx = 0; in InitState()
277 state->parse_state.prev_name_length = 0; in InitState()
278 state->parse_state.nest_level = -1; in InitState()
279 state->parse_state.append = true; in InitState()
282 static inline const char *RemainingInput(State *state) { in RemainingInput() argument
283 return &state->mangled_begin[state->parse_state.mangled_idx]; in RemainingInput()
289 static bool ParseOneCharToken(State *state, const char one_char_token) { in ParseOneCharToken() argument
290 ComplexityGuard guard(state); in ParseOneCharToken()
292 if (RemainingInput(state)[0] == one_char_token) { in ParseOneCharToken() local
293 ++state->parse_state.mangled_idx; in ParseOneCharToken()
302 static bool ParseTwoCharToken(State *state, const char *two_char_token) { in ParseTwoCharToken() argument
303 ComplexityGuard guard(state); in ParseTwoCharToken()
305 if (RemainingInput(state)[0] == two_char_token[0] && in ParseTwoCharToken()
306 RemainingInput(state)[1] == two_char_token[1]) { in ParseTwoCharToken()
307 state->parse_state.mangled_idx += 2; in ParseTwoCharToken()
315 static bool ParseCharClass(State *state, const char *char_class) { in ParseCharClass() argument
316 ComplexityGuard guard(state); in ParseCharClass()
318 if (RemainingInput(state)[0] == '\0') { in ParseCharClass() local
323 if (RemainingInput(state)[0] == *p) { in ParseCharClass()
324 ++state->parse_state.mangled_idx; in ParseCharClass()
331 static bool ParseDigit(State *state, int *digit) { in ParseDigit() argument
332 char c = RemainingInput(state)[0]; in ParseDigit()
333 if (ParseCharClass(state, "0123456789")) { in ParseDigit()
346 typedef bool (*ParseFunc)(State *);
347 static bool OneOrMore(ParseFunc parse_func, State *state) { in OneOrMore() argument
348 if (parse_func(state)) { in OneOrMore()
349 while (parse_func(state)) { in OneOrMore()
359 // ParseOneCharToken(state, 'E')).
360 static bool ZeroOrMore(ParseFunc parse_func, State *state) { in ZeroOrMore() argument
361 while (parse_func(state)) { in ZeroOrMore()
369 static void Append(State *state, const char *const str, const size_t length) { in Append() argument
371 if (state->parse_state.out_cur_idx + 1 < in Append()
372 state->out_end_idx) { // +1 for '\0' in Append()
373 state->out[state->parse_state.out_cur_idx++] = str[i]; in Append()
376 state->parse_state.out_cur_idx = state->out_end_idx + 1; in Append()
380 if (state->parse_state.out_cur_idx < state->out_end_idx) { in Append()
381 state->out[state->parse_state.out_cur_idx] = in Append()
425 static bool EndsWith(State *state, const char chr) { in EndsWith() argument
426 return state->parse_state.out_cur_idx > 0 && in EndsWith()
427 state->parse_state.out_cur_idx < state->out_end_idx && in EndsWith()
428 chr == state->out[state->parse_state.out_cur_idx - 1]; in EndsWith()
431 // Append "str" with some tweaks, iff "append" state is true.
432 static void MaybeAppendWithLength(State *state, const char *const str, in MaybeAppendWithLength() argument
434 if (state->parse_state.append && length > 0) { in MaybeAppendWithLength()
437 if (str[0] == '<' && EndsWith(state, '<')) { in MaybeAppendWithLength()
438 Append(state, " ", 1); in MaybeAppendWithLength()
442 if (state->parse_state.out_cur_idx < state->out_end_idx && in MaybeAppendWithLength()
444 state->parse_state.prev_name_idx = state->parse_state.out_cur_idx; in MaybeAppendWithLength()
445 state->parse_state.prev_name_length = static_cast<unsigned int>(length); in MaybeAppendWithLength()
447 Append(state, str, length); in MaybeAppendWithLength()
452 static bool MaybeAppendDecimal(State *state, int val) { in MaybeAppendDecimal() argument
459 if (state->parse_state.append) { in MaybeAppendDecimal()
469 Append(state, p, kMaxLength - static_cast<size_t>(p - buf)); in MaybeAppendDecimal()
477 static bool MaybeAppend(State *state, const char *const str) { in MaybeAppend() argument
478 if (state->parse_state.append) { in MaybeAppend()
480 MaybeAppendWithLength(state, str, length); in MaybeAppend()
486 static bool EnterNestedName(State *state) { in EnterNestedName() argument
487 state->parse_state.nest_level = 0; in EnterNestedName()
492 static bool LeaveNestedName(State *state, int16_t prev_value) { in LeaveNestedName() argument
493 state->parse_state.nest_level = prev_value; in LeaveNestedName()
498 static bool DisableAppend(State *state) { in DisableAppend() argument
499 state->parse_state.append = false; in DisableAppend()
503 // Restore the append mode to the previous state.
504 static bool RestoreAppend(State *state, bool prev_value) { in RestoreAppend() argument
505 state->parse_state.append = prev_value; in RestoreAppend()
510 static void MaybeIncreaseNestLevel(State *state) { in MaybeIncreaseNestLevel() argument
511 if (state->parse_state.nest_level > -1) { in MaybeIncreaseNestLevel()
512 ++state->parse_state.nest_level; in MaybeIncreaseNestLevel()
517 static void MaybeAppendSeparator(State *state) { in MaybeAppendSeparator() argument
518 if (state->parse_state.nest_level >= 1) { in MaybeAppendSeparator()
519 MaybeAppend(state, "::"); in MaybeAppendSeparator()
524 static void MaybeCancelLastSeparator(State *state) { in MaybeCancelLastSeparator() argument
525 if (state->parse_state.nest_level >= 1 && state->parse_state.append && in MaybeCancelLastSeparator()
526 state->parse_state.out_cur_idx >= 2) { in MaybeCancelLastSeparator()
527 state->parse_state.out_cur_idx -= 2; in MaybeCancelLastSeparator()
528 state->out[state->parse_state.out_cur_idx] = '\0'; in MaybeCancelLastSeparator()
534 static bool IdentifierIsAnonymousNamespace(State *state, size_t length) { in IdentifierIsAnonymousNamespace() argument
538 StrPrefix(RemainingInput(state), anon_prefix)); in IdentifierIsAnonymousNamespace()
542 static bool ParseMangledName(State *state);
543 static bool ParseEncoding(State *state);
544 static bool ParseName(State *state);
545 static bool ParseUnscopedName(State *state);
546 static bool ParseNestedName(State *state);
547 static bool ParsePrefix(State *state);
548 static bool ParseUnqualifiedName(State *state);
549 static bool ParseSourceName(State *state);
550 static bool ParseLocalSourceName(State *state);
551 static bool ParseUnnamedTypeName(State *state);
552 static bool ParseNumber(State *state, int *number_out);
553 static bool ParseFloatNumber(State *state);
554 static bool ParseSeqId(State *state);
555 static bool ParseIdentifier(State *state, size_t length);
556 static bool ParseOperatorName(State *state, int *arity);
557 static bool ParseSpecialName(State *state);
558 static bool ParseCallOffset(State *state);
559 static bool ParseNVOffset(State *state);
560 static bool ParseVOffset(State *state);
561 static bool ParseAbiTags(State *state);
562 static bool ParseCtorDtorName(State *state);
563 static bool ParseDecltype(State *state);
564 static bool ParseType(State *state);
565 static bool ParseCVQualifiers(State *state);
566 static bool ParseBuiltinType(State *state);
567 static bool ParseFunctionType(State *state);
568 static bool ParseBareFunctionType(State *state);
569 static bool ParseClassEnumType(State *state);
570 static bool ParseArrayType(State *state);
571 static bool ParsePointerToMemberType(State *state);
572 static bool ParseTemplateParam(State *state);
573 static bool ParseTemplateTemplateParam(State *state);
574 static bool ParseTemplateArgs(State *state);
575 static bool ParseTemplateArg(State *state);
576 static bool ParseBaseUnresolvedName(State *state);
577 static bool ParseUnresolvedName(State *state);
578 static bool ParseExpression(State *state);
579 static bool ParseExprPrimary(State *state);
580 static bool ParseExprCastValue(State *state);
581 static bool ParseLocalName(State *state);
582 static bool ParseLocalNameSuffix(State *state);
583 static bool ParseDiscriminator(State *state);
584 static bool ParseSubstitution(State *state, bool accept_std);
596 // Each parsing function changes the parse state and returns true on
597 // success, or returns false and doesn't change the parse state (note:
599 // To ensure that the parse state isn't changed in the latter case, we
600 // save the original state before we call multiple parsing functions
618 static bool ParseMangledName(State *state) { in ParseMangledName() argument
619 ComplexityGuard guard(state); in ParseMangledName()
621 return ParseTwoCharToken(state, "_Z") && ParseEncoding(state); in ParseMangledName()
627 static bool ParseEncoding(State *state) { in ParseEncoding() argument
628 ComplexityGuard guard(state); in ParseEncoding()
633 // Since Optional(...) can't fail, there's no need to copy the state for in ParseEncoding()
635 if (ParseName(state) && Optional(ParseBareFunctionType(state))) { in ParseEncoding()
639 if (ParseSpecialName(state)) { in ParseEncoding()
649 static bool ParseName(State *state) { in ParseName() argument
650 ComplexityGuard guard(state); in ParseName()
652 if (ParseNestedName(state) || ParseLocalName(state)) { in ParseName()
664 ParseState copy = state->parse_state; in ParseName()
666 if (ParseSubstitution(state, /*accept_std=*/false) && in ParseName()
667 ParseTemplateArgs(state)) { in ParseName()
670 state->parse_state = copy; in ParseName()
672 // Note there's no need to restore state after this since only the first in ParseName()
674 return ParseUnscopedName(state) && Optional(ParseTemplateArgs(state)); in ParseName()
679 static bool ParseUnscopedName(State *state) { in ParseUnscopedName() argument
680 ComplexityGuard guard(state); in ParseUnscopedName()
682 if (ParseUnqualifiedName(state)) { in ParseUnscopedName()
686 ParseState copy = state->parse_state; in ParseUnscopedName()
687 if (ParseTwoCharToken(state, "St") && MaybeAppend(state, "std::") && in ParseUnscopedName()
688 ParseUnqualifiedName(state)) { in ParseUnscopedName()
691 state->parse_state = copy; in ParseUnscopedName()
697 static inline bool ParseRefQualifier(State *state) { in ParseRefQualifier() argument
698 return ParseCharClass(state, "OR"); in ParseRefQualifier()
705 static bool ParseNestedName(State *state) { in ParseNestedName() argument
706 ComplexityGuard guard(state); in ParseNestedName()
708 ParseState copy = state->parse_state; in ParseNestedName()
709 if (ParseOneCharToken(state, 'N') && EnterNestedName(state) && in ParseNestedName()
710 Optional(ParseCVQualifiers(state)) && in ParseNestedName()
711 Optional(ParseRefQualifier(state)) && ParsePrefix(state) && in ParseNestedName()
712 LeaveNestedName(state, copy.nest_level) && in ParseNestedName()
713 ParseOneCharToken(state, 'E')) { in ParseNestedName()
716 state->parse_state = copy; in ParseNestedName()
731 static bool ParsePrefix(State *state) { in ParsePrefix() argument
732 ComplexityGuard guard(state); in ParsePrefix()
736 MaybeAppendSeparator(state); in ParsePrefix()
737 if (ParseTemplateParam(state) || in ParsePrefix()
738 ParseSubstitution(state, /*accept_std=*/true) || in ParsePrefix()
739 ParseUnscopedName(state) || in ParsePrefix()
740 (ParseOneCharToken(state, 'M') && ParseUnnamedTypeName(state))) { in ParsePrefix()
742 MaybeIncreaseNestLevel(state); in ParsePrefix()
745 MaybeCancelLastSeparator(state); in ParsePrefix()
746 if (has_something && ParseTemplateArgs(state)) { in ParsePrefix()
747 return ParsePrefix(state); in ParsePrefix()
762 static bool ParseUnqualifiedName(State *state) { in ParseUnqualifiedName() argument
763 ComplexityGuard guard(state); in ParseUnqualifiedName()
765 if (ParseOperatorName(state, nullptr) || ParseCtorDtorName(state) || in ParseUnqualifiedName()
766 ParseSourceName(state) || ParseLocalSourceName(state) || in ParseUnqualifiedName()
767 ParseUnnamedTypeName(state)) { in ParseUnqualifiedName()
768 return ParseAbiTags(state); in ParseUnqualifiedName()
775 static bool ParseAbiTags(State *state) { in ParseAbiTags() argument
776 ComplexityGuard guard(state); in ParseAbiTags()
779 while (ParseOneCharToken(state, 'B')) { in ParseAbiTags()
780 ParseState copy = state->parse_state; in ParseAbiTags()
781 MaybeAppend(state, "[abi:"); in ParseAbiTags()
783 if (!ParseSourceName(state)) { in ParseAbiTags()
784 state->parse_state = copy; in ParseAbiTags()
787 MaybeAppend(state, "]"); in ParseAbiTags()
794 static bool ParseSourceName(State *state) { in ParseSourceName() argument
795 ComplexityGuard guard(state); in ParseSourceName()
797 ParseState copy = state->parse_state; in ParseSourceName()
799 if (ParseNumber(state, &length) && in ParseSourceName()
800 ParseIdentifier(state, static_cast<size_t>(length))) { in ParseSourceName()
803 state->parse_state = copy; in ParseSourceName()
812 static bool ParseLocalSourceName(State *state) { in ParseLocalSourceName() argument
813 ComplexityGuard guard(state); in ParseLocalSourceName()
815 ParseState copy = state->parse_state; in ParseLocalSourceName()
816 if (ParseOneCharToken(state, 'L') && ParseSourceName(state) && in ParseLocalSourceName()
817 Optional(ParseDiscriminator(state))) { in ParseLocalSourceName()
820 state->parse_state = copy; in ParseLocalSourceName()
828 static bool ParseUnnamedTypeName(State *state) { in ParseUnnamedTypeName() argument
829 ComplexityGuard guard(state); in ParseUnnamedTypeName()
831 ParseState copy = state->parse_state; in ParseUnnamedTypeName()
837 if (ParseTwoCharToken(state, "Ut") && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
839 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
840 MaybeAppend(state, "{unnamed type#"); in ParseUnnamedTypeName()
841 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
842 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
845 state->parse_state = copy; in ParseUnnamedTypeName()
849 if (ParseTwoCharToken(state, "Ul") && DisableAppend(state) && in ParseUnnamedTypeName()
850 OneOrMore(ParseType, state) && RestoreAppend(state, copy.append) && in ParseUnnamedTypeName()
851 ParseOneCharToken(state, 'E') && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
853 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
854 MaybeAppend(state, "{lambda()#"); in ParseUnnamedTypeName()
855 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
856 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
859 state->parse_state = copy; in ParseUnnamedTypeName()
867 static bool ParseNumber(State *state, int *number_out) { in ParseNumber() argument
868 ComplexityGuard guard(state); in ParseNumber()
871 if (ParseOneCharToken(state, 'n')) { in ParseNumber()
874 const char *p = RemainingInput(state); in ParseNumber()
889 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseNumber()
890 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseNumber()
902 static bool ParseFloatNumber(State *state) { in ParseFloatNumber() argument
903 ComplexityGuard guard(state); in ParseFloatNumber()
905 const char *p = RemainingInput(state); in ParseFloatNumber()
911 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseFloatNumber()
912 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseFloatNumber()
920 static bool ParseSeqId(State *state) { in ParseSeqId() argument
921 ComplexityGuard guard(state); in ParseSeqId()
923 const char *p = RemainingInput(state); in ParseSeqId()
929 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseSeqId()
930 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseSeqId()
937 static bool ParseIdentifier(State *state, size_t length) { in ParseIdentifier() argument
938 ComplexityGuard guard(state); in ParseIdentifier()
940 if (!AtLeastNumCharsRemaining(RemainingInput(state), length)) { in ParseIdentifier()
943 if (IdentifierIsAnonymousNamespace(state, length)) { in ParseIdentifier()
944 MaybeAppend(state, "(anonymous namespace)"); in ParseIdentifier()
946 MaybeAppendWithLength(state, RemainingInput(state), length); in ParseIdentifier()
948 state->parse_state.mangled_idx += length; in ParseIdentifier()
955 static bool ParseOperatorName(State *state, int *arity) { in ParseOperatorName() argument
956 ComplexityGuard guard(state); in ParseOperatorName()
958 if (!AtLeastNumCharsRemaining(RemainingInput(state), 2)) { in ParseOperatorName()
962 ParseState copy = state->parse_state; in ParseOperatorName()
963 if (ParseTwoCharToken(state, "cv") && MaybeAppend(state, "operator ") && in ParseOperatorName()
964 EnterNestedName(state) && ParseType(state) && in ParseOperatorName()
965 LeaveNestedName(state, copy.nest_level)) { in ParseOperatorName()
971 state->parse_state = copy; in ParseOperatorName()
974 if (ParseOneCharToken(state, 'v') && ParseDigit(state, arity) && in ParseOperatorName()
975 ParseSourceName(state)) { in ParseOperatorName()
978 state->parse_state = copy; in ParseOperatorName()
982 if (!(IsLower(RemainingInput(state)[0]) && in ParseOperatorName()
983 IsAlpha(RemainingInput(state)[1]))) { in ParseOperatorName()
989 if (RemainingInput(state)[0] == p->abbrev[0] && in ParseOperatorName()
990 RemainingInput(state)[1] == p->abbrev[1]) { in ParseOperatorName()
994 MaybeAppend(state, "operator"); in ParseOperatorName()
996 MaybeAppend(state, " "); in ParseOperatorName()
998 MaybeAppend(state, p->real_name); in ParseOperatorName()
999 state->parse_state.mangled_idx += 2; in ParseOperatorName()
1025 static bool ParseSpecialName(State *state) { in ParseSpecialName() argument
1026 ComplexityGuard guard(state); in ParseSpecialName()
1028 ParseState copy = state->parse_state; in ParseSpecialName()
1029 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTISH") && in ParseSpecialName()
1030 ParseType(state)) { in ParseSpecialName()
1033 state->parse_state = copy; in ParseSpecialName()
1035 if (ParseTwoCharToken(state, "Tc") && ParseCallOffset(state) && in ParseSpecialName()
1036 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1039 state->parse_state = copy; in ParseSpecialName()
1041 if (ParseTwoCharToken(state, "GV") && ParseName(state)) { in ParseSpecialName()
1044 state->parse_state = copy; in ParseSpecialName()
1046 if (ParseOneCharToken(state, 'T') && ParseCallOffset(state) && in ParseSpecialName()
1047 ParseEncoding(state)) { in ParseSpecialName()
1050 state->parse_state = copy; in ParseSpecialName()
1053 if (ParseTwoCharToken(state, "TC") && ParseType(state) && in ParseSpecialName()
1054 ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseSpecialName()
1055 DisableAppend(state) && ParseType(state)) { in ParseSpecialName()
1056 RestoreAppend(state, copy.append); in ParseSpecialName()
1059 state->parse_state = copy; in ParseSpecialName()
1061 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "FJ") && in ParseSpecialName()
1062 ParseType(state)) { in ParseSpecialName()
1065 state->parse_state = copy; in ParseSpecialName()
1067 if (ParseTwoCharToken(state, "GR") && ParseName(state)) { in ParseSpecialName()
1070 state->parse_state = copy; in ParseSpecialName()
1072 if (ParseTwoCharToken(state, "GA") && ParseEncoding(state)) { in ParseSpecialName()
1075 state->parse_state = copy; in ParseSpecialName()
1077 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "hv") && in ParseSpecialName()
1078 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1081 state->parse_state = copy; in ParseSpecialName()
1087 static bool ParseCallOffset(State *state) { in ParseCallOffset() argument
1088 ComplexityGuard guard(state); in ParseCallOffset()
1090 ParseState copy = state->parse_state; in ParseCallOffset()
1091 if (ParseOneCharToken(state, 'h') && ParseNVOffset(state) && in ParseCallOffset()
1092 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1095 state->parse_state = copy; in ParseCallOffset()
1097 if (ParseOneCharToken(state, 'v') && ParseVOffset(state) && in ParseCallOffset()
1098 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1101 state->parse_state = copy; in ParseCallOffset()
1107 static bool ParseNVOffset(State *state) { in ParseNVOffset() argument
1108 ComplexityGuard guard(state); in ParseNVOffset()
1110 return ParseNumber(state, nullptr); in ParseNVOffset()
1114 static bool ParseVOffset(State *state) { in ParseVOffset() argument
1115 ComplexityGuard guard(state); in ParseVOffset()
1117 ParseState copy = state->parse_state; in ParseVOffset()
1118 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseVOffset()
1119 ParseNumber(state, nullptr)) { in ParseVOffset()
1122 state->parse_state = copy; in ParseVOffset()
1133 static bool ParseCtorDtorName(State *state) { in ParseCtorDtorName() argument
1134 ComplexityGuard guard(state); in ParseCtorDtorName()
1136 ParseState copy = state->parse_state; in ParseCtorDtorName()
1137 if (ParseOneCharToken(state, 'C')) { in ParseCtorDtorName()
1138 if (ParseCharClass(state, "1234")) { in ParseCtorDtorName()
1140 state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1141 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1142 state->parse_state.prev_name_length); in ParseCtorDtorName()
1144 } else if (ParseOneCharToken(state, 'I') && ParseCharClass(state, "12") && in ParseCtorDtorName()
1145 ParseClassEnumType(state)) { in ParseCtorDtorName()
1149 state->parse_state = copy; in ParseCtorDtorName()
1151 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "0124")) { in ParseCtorDtorName()
1152 const char *const prev_name = state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1153 MaybeAppend(state, "~"); in ParseCtorDtorName()
1154 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1155 state->parse_state.prev_name_length); in ParseCtorDtorName()
1158 state->parse_state = copy; in ParseCtorDtorName()
1165 static bool ParseDecltype(State *state) { in ParseDecltype() argument
1166 ComplexityGuard guard(state); in ParseDecltype()
1169 ParseState copy = state->parse_state; in ParseDecltype()
1170 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "tT") && in ParseDecltype()
1171 ParseExpression(state) && ParseOneCharToken(state, 'E')) { in ParseDecltype()
1174 state->parse_state = copy; in ParseDecltype()
1198 static bool ParseType(State *state) { in ParseType() argument
1199 ComplexityGuard guard(state); in ParseType()
1201 ParseState copy = state->parse_state; in ParseType()
1216 if (ParseCVQualifiers(state)) { in ParseType()
1217 const bool result = ParseType(state); in ParseType()
1218 if (!result) state->parse_state = copy; in ParseType()
1221 state->parse_state = copy; in ParseType()
1227 if (ParseCharClass(state, "OPRCG")) { in ParseType()
1228 const bool result = ParseType(state); in ParseType()
1229 if (!result) state->parse_state = copy; in ParseType()
1232 state->parse_state = copy; in ParseType()
1234 if (ParseTwoCharToken(state, "Dp") && ParseType(state)) { in ParseType()
1237 state->parse_state = copy; in ParseType()
1239 if (ParseOneCharToken(state, 'U') && ParseSourceName(state) && in ParseType()
1240 ParseType(state)) { in ParseType()
1243 state->parse_state = copy; in ParseType()
1245 if (ParseBuiltinType(state) || ParseFunctionType(state) || in ParseType()
1246 ParseClassEnumType(state) || ParseArrayType(state) || in ParseType()
1247 ParsePointerToMemberType(state) || ParseDecltype(state) || in ParseType()
1249 ParseSubstitution(state, /*accept_std=*/false)) { in ParseType()
1253 if (ParseTemplateTemplateParam(state) && ParseTemplateArgs(state)) { in ParseType()
1256 state->parse_state = copy; in ParseType()
1259 if (ParseTemplateParam(state)) { in ParseType()
1263 if (ParseTwoCharToken(state, "Dv") && ParseNumber(state, nullptr) && in ParseType()
1264 ParseOneCharToken(state, '_')) { in ParseType()
1267 state->parse_state = copy; in ParseType()
1275 static bool ParseCVQualifiers(State *state) { in ParseCVQualifiers() argument
1276 ComplexityGuard guard(state); in ParseCVQualifiers()
1279 num_cv_qualifiers += ParseOneCharToken(state, 'r'); in ParseCVQualifiers()
1280 num_cv_qualifiers += ParseOneCharToken(state, 'V'); in ParseCVQualifiers()
1281 num_cv_qualifiers += ParseOneCharToken(state, 'K'); in ParseCVQualifiers()
1292 static bool ParseBuiltinType(State *state) { in ParseBuiltinType() argument
1293 ComplexityGuard guard(state); in ParseBuiltinType()
1299 if (ParseOneCharToken(state, p->abbrev[0])) { in ParseBuiltinType()
1300 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1303 } else if (p->abbrev[2] == '\0' && ParseTwoCharToken(state, p->abbrev)) { in ParseBuiltinType()
1304 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1309 ParseState copy = state->parse_state; in ParseBuiltinType()
1310 if (ParseOneCharToken(state, 'u') && ParseSourceName(state)) { in ParseBuiltinType()
1313 state->parse_state = copy; in ParseBuiltinType()
1324 static bool ParseExceptionSpec(State *state) { in ParseExceptionSpec() argument
1325 ComplexityGuard guard(state); in ParseExceptionSpec()
1328 if (ParseTwoCharToken(state, "Do")) return true; in ParseExceptionSpec()
1330 ParseState copy = state->parse_state; in ParseExceptionSpec()
1331 if (ParseTwoCharToken(state, "DO") && ParseExpression(state) && in ParseExceptionSpec()
1332 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1335 state->parse_state = copy; in ParseExceptionSpec()
1336 if (ParseTwoCharToken(state, "Dw") && OneOrMore(ParseType, state) && in ParseExceptionSpec()
1337 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1340 state->parse_state = copy; in ParseExceptionSpec()
1346 static bool ParseFunctionType(State *state) { in ParseFunctionType() argument
1347 ComplexityGuard guard(state); in ParseFunctionType()
1349 ParseState copy = state->parse_state; in ParseFunctionType()
1350 if (Optional(ParseExceptionSpec(state)) && ParseOneCharToken(state, 'F') && in ParseFunctionType()
1351 Optional(ParseOneCharToken(state, 'Y')) && ParseBareFunctionType(state) && in ParseFunctionType()
1352 Optional(ParseOneCharToken(state, 'O')) && in ParseFunctionType()
1353 ParseOneCharToken(state, 'E')) { in ParseFunctionType()
1356 state->parse_state = copy; in ParseFunctionType()
1361 static bool ParseBareFunctionType(State *state) { in ParseBareFunctionType() argument
1362 ComplexityGuard guard(state); in ParseBareFunctionType()
1364 ParseState copy = state->parse_state; in ParseBareFunctionType()
1365 DisableAppend(state); in ParseBareFunctionType()
1366 if (OneOrMore(ParseType, state)) { in ParseBareFunctionType()
1367 RestoreAppend(state, copy.append); in ParseBareFunctionType()
1368 MaybeAppend(state, "()"); in ParseBareFunctionType()
1371 state->parse_state = copy; in ParseBareFunctionType()
1376 static bool ParseClassEnumType(State *state) { in ParseClassEnumType() argument
1377 ComplexityGuard guard(state); in ParseClassEnumType()
1379 return ParseName(state); in ParseClassEnumType()
1384 static bool ParseArrayType(State *state) { in ParseArrayType() argument
1385 ComplexityGuard guard(state); in ParseArrayType()
1387 ParseState copy = state->parse_state; in ParseArrayType()
1388 if (ParseOneCharToken(state, 'A') && ParseNumber(state, nullptr) && in ParseArrayType()
1389 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1392 state->parse_state = copy; in ParseArrayType()
1394 if (ParseOneCharToken(state, 'A') && Optional(ParseExpression(state)) && in ParseArrayType()
1395 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1398 state->parse_state = copy; in ParseArrayType()
1403 static bool ParsePointerToMemberType(State *state) { in ParsePointerToMemberType() argument
1404 ComplexityGuard guard(state); in ParsePointerToMemberType()
1406 ParseState copy = state->parse_state; in ParsePointerToMemberType()
1407 if (ParseOneCharToken(state, 'M') && ParseType(state) && ParseType(state)) { in ParsePointerToMemberType()
1410 state->parse_state = copy; in ParsePointerToMemberType()
1416 static bool ParseTemplateParam(State *state) { in ParseTemplateParam() argument
1417 ComplexityGuard guard(state); in ParseTemplateParam()
1419 if (ParseTwoCharToken(state, "T_")) { in ParseTemplateParam()
1420 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1424 ParseState copy = state->parse_state; in ParseTemplateParam()
1425 if (ParseOneCharToken(state, 'T') && ParseNumber(state, nullptr) && in ParseTemplateParam()
1426 ParseOneCharToken(state, '_')) { in ParseTemplateParam()
1427 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1430 state->parse_state = copy; in ParseTemplateParam()
1436 static bool ParseTemplateTemplateParam(State *state) { in ParseTemplateTemplateParam() argument
1437 ComplexityGuard guard(state); in ParseTemplateTemplateParam()
1439 return (ParseTemplateParam(state) || in ParseTemplateTemplateParam()
1441 ParseSubstitution(state, /*accept_std=*/false)); in ParseTemplateTemplateParam()
1445 static bool ParseTemplateArgs(State *state) { in ParseTemplateArgs() argument
1446 ComplexityGuard guard(state); in ParseTemplateArgs()
1448 ParseState copy = state->parse_state; in ParseTemplateArgs()
1449 DisableAppend(state); in ParseTemplateArgs()
1450 if (ParseOneCharToken(state, 'I') && OneOrMore(ParseTemplateArg, state) && in ParseTemplateArgs()
1451 ParseOneCharToken(state, 'E')) { in ParseTemplateArgs()
1452 RestoreAppend(state, copy.append); in ParseTemplateArgs()
1453 MaybeAppend(state, "<>"); in ParseTemplateArgs()
1456 state->parse_state = copy; in ParseTemplateArgs()
1464 static bool ParseTemplateArg(State *state) { in ParseTemplateArg() argument
1465 ComplexityGuard guard(state); in ParseTemplateArg()
1467 ParseState copy = state->parse_state; in ParseTemplateArg()
1468 if (ParseOneCharToken(state, 'J') && ZeroOrMore(ParseTemplateArg, state) && in ParseTemplateArg()
1469 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1472 state->parse_state = copy; in ParseTemplateArg()
1542 if (ParseLocalSourceName(state) && Optional(ParseTemplateArgs(state))) { in ParseTemplateArg()
1543 copy = state->parse_state; in ParseTemplateArg()
1544 if (ParseExprCastValue(state) && ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1547 state->parse_state = copy; in ParseTemplateArg()
1553 if (ParseType(state) || ParseExprPrimary(state)) { in ParseTemplateArg()
1556 state->parse_state = copy; in ParseTemplateArg()
1558 if (ParseOneCharToken(state, 'X') && ParseExpression(state) && in ParseTemplateArg()
1559 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1562 state->parse_state = copy; in ParseTemplateArg()
1569 static inline bool ParseUnresolvedType(State *state) { in ParseUnresolvedType() argument
1570 // No ComplexityGuard because we don't copy the state in this stack frame. in ParseUnresolvedType()
1571 return (ParseTemplateParam(state) && Optional(ParseTemplateArgs(state))) || in ParseUnresolvedType()
1572 ParseDecltype(state) || ParseSubstitution(state, /*accept_std=*/false); in ParseUnresolvedType()
1576 static inline bool ParseSimpleId(State *state) { in ParseSimpleId() argument
1577 // No ComplexityGuard because we don't copy the state in this stack frame. in ParseSimpleId()
1581 return ParseSourceName(state) && Optional(ParseTemplateArgs(state)); in ParseSimpleId()
1587 static bool ParseBaseUnresolvedName(State *state) { in ParseBaseUnresolvedName() argument
1588 ComplexityGuard guard(state); in ParseBaseUnresolvedName()
1591 if (ParseSimpleId(state)) { in ParseBaseUnresolvedName()
1595 ParseState copy = state->parse_state; in ParseBaseUnresolvedName()
1596 if (ParseTwoCharToken(state, "on") && ParseOperatorName(state, nullptr) && in ParseBaseUnresolvedName()
1597 Optional(ParseTemplateArgs(state))) { in ParseBaseUnresolvedName()
1600 state->parse_state = copy; in ParseBaseUnresolvedName()
1602 if (ParseTwoCharToken(state, "dn") && in ParseBaseUnresolvedName()
1603 (ParseUnresolvedType(state) || ParseSimpleId(state))) { in ParseBaseUnresolvedName()
1606 state->parse_state = copy; in ParseBaseUnresolvedName()
1617 static bool ParseUnresolvedName(State *state) { in ParseUnresolvedName() argument
1618 ComplexityGuard guard(state); in ParseUnresolvedName()
1621 ParseState copy = state->parse_state; in ParseUnresolvedName()
1622 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
1623 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1626 state->parse_state = copy; in ParseUnresolvedName()
1628 if (ParseTwoCharToken(state, "sr") && ParseUnresolvedType(state) && in ParseUnresolvedName()
1629 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1632 state->parse_state = copy; in ParseUnresolvedName()
1634 if (ParseTwoCharToken(state, "sr") && ParseOneCharToken(state, 'N') && in ParseUnresolvedName()
1635 ParseUnresolvedType(state) && in ParseUnresolvedName()
1636 OneOrMore(/* <unresolved-qualifier-level> ::= */ ParseSimpleId, state) && in ParseUnresolvedName()
1637 ParseOneCharToken(state, 'E') && ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1640 state->parse_state = copy; in ParseUnresolvedName()
1642 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
1643 ParseTwoCharToken(state, "sr") && in ParseUnresolvedName()
1644 OneOrMore(/* <unresolved-qualifier-level> ::= */ ParseSimpleId, state) && in ParseUnresolvedName()
1645 ParseOneCharToken(state, 'E') && ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1648 state->parse_state = copy; in ParseUnresolvedName()
1673 static bool ParseExpression(State *state) { in ParseExpression() argument
1674 ComplexityGuard guard(state); in ParseExpression()
1676 if (ParseTemplateParam(state) || ParseExprPrimary(state)) { in ParseExpression()
1680 ParseState copy = state->parse_state; in ParseExpression()
1683 if (ParseTwoCharToken(state, "cl") && OneOrMore(ParseExpression, state) && in ParseExpression()
1684 ParseOneCharToken(state, 'E')) { in ParseExpression()
1687 state->parse_state = copy; in ParseExpression()
1691 if (ParseTwoCharToken(state, "cp") && ParseSimpleId(state) && in ParseExpression()
1692 ZeroOrMore(ParseExpression, state) && ParseOneCharToken(state, 'E')) { in ParseExpression()
1695 state->parse_state = copy; in ParseExpression()
1698 if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) && in ParseExpression()
1699 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseExpression()
1702 state->parse_state = copy; in ParseExpression()
1705 if (ParseTwoCharToken(state, "fL") && Optional(ParseNumber(state, nullptr)) && in ParseExpression()
1706 ParseOneCharToken(state, 'p') && Optional(ParseCVQualifiers(state)) && in ParseExpression()
1707 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseExpression()
1710 state->parse_state = copy; in ParseExpression()
1720 if (ParseTwoCharToken(state, "cv")) { in ParseExpression()
1721 if (ParseType(state)) { in ParseExpression()
1722 ParseState copy2 = state->parse_state; in ParseExpression()
1723 if (ParseOneCharToken(state, '_') && ZeroOrMore(ParseExpression, state) && in ParseExpression()
1724 ParseOneCharToken(state, 'E')) { in ParseExpression()
1727 state->parse_state = copy2; in ParseExpression()
1728 if (ParseExpression(state)) { in ParseExpression()
1739 if (ParseOperatorName(state, &arity) && in ParseExpression()
1741 (arity < 3 || ParseExpression(state)) && in ParseExpression()
1742 (arity < 2 || ParseExpression(state)) && in ParseExpression()
1743 (arity < 1 || ParseExpression(state))) { in ParseExpression()
1747 state->parse_state = copy; in ParseExpression()
1750 if (ParseTwoCharToken(state, "st") && ParseType(state)) { in ParseExpression()
1753 state->parse_state = copy; in ParseExpression()
1756 if ((ParseTwoCharToken(state, "dt") || ParseTwoCharToken(state, "pt")) && in ParseExpression()
1757 ParseExpression(state) && ParseType(state)) { in ParseExpression()
1760 state->parse_state = copy; in ParseExpression()
1765 if (ParseTwoCharToken(state, "ds") && ParseExpression(state) && in ParseExpression()
1766 ParseExpression(state)) { in ParseExpression()
1769 state->parse_state = copy; in ParseExpression()
1772 if (ParseTwoCharToken(state, "sp") && ParseExpression(state)) { in ParseExpression()
1775 state->parse_state = copy; in ParseExpression()
1777 return ParseUnresolvedName(state); in ParseExpression()
1806 static bool ParseExprPrimary(State *state) { in ParseExprPrimary() argument
1807 ComplexityGuard guard(state); in ParseExprPrimary()
1809 ParseState copy = state->parse_state; in ParseExprPrimary()
1813 if (ParseTwoCharToken(state, "LZ")) { in ParseExprPrimary()
1814 if (ParseEncoding(state) && ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1818 state->parse_state = copy; in ParseExprPrimary()
1823 if (ParseOneCharToken(state, 'L') && ParseType(state) && in ParseExprPrimary()
1824 ParseExprCastValue(state)) { in ParseExprPrimary()
1827 state->parse_state = copy; in ParseExprPrimary()
1829 if (ParseOneCharToken(state, 'L') && ParseMangledName(state) && in ParseExprPrimary()
1830 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1833 state->parse_state = copy; in ParseExprPrimary()
1839 static bool ParseExprCastValue(State *state) { in ParseExprCastValue() argument
1840 ComplexityGuard guard(state); in ParseExprCastValue()
1845 ParseState copy = state->parse_state; in ParseExprCastValue()
1846 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, 'E')) { in ParseExprCastValue()
1849 state->parse_state = copy; in ParseExprCastValue()
1851 if (ParseFloatNumber(state) && ParseOneCharToken(state, 'E')) { in ParseExprCastValue()
1854 state->parse_state = copy; in ParseExprCastValue()
1868 static bool ParseLocalNameSuffix(State *state) { in ParseLocalNameSuffix() argument
1869 ComplexityGuard guard(state); in ParseLocalNameSuffix()
1872 if (MaybeAppend(state, "::") && ParseName(state) && in ParseLocalNameSuffix()
1873 Optional(ParseDiscriminator(state))) { in ParseLocalNameSuffix()
1880 if (state->parse_state.append) { in ParseLocalNameSuffix()
1881 state->out[state->parse_state.out_cur_idx - 2] = '\0'; in ParseLocalNameSuffix()
1884 return ParseOneCharToken(state, 's') && Optional(ParseDiscriminator(state)); in ParseLocalNameSuffix()
1887 static bool ParseLocalName(State *state) { in ParseLocalName() argument
1888 ComplexityGuard guard(state); in ParseLocalName()
1890 ParseState copy = state->parse_state; in ParseLocalName()
1891 if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && in ParseLocalName()
1892 ParseOneCharToken(state, 'E') && ParseLocalNameSuffix(state)) { in ParseLocalName()
1895 state->parse_state = copy; in ParseLocalName()
1900 static bool ParseDiscriminator(State *state) { in ParseDiscriminator() argument
1901 ComplexityGuard guard(state); in ParseDiscriminator()
1903 ParseState copy = state->parse_state; in ParseDiscriminator()
1904 if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr)) { in ParseDiscriminator()
1907 state->parse_state = copy; in ParseDiscriminator()
1922 static bool ParseSubstitution(State *state, bool accept_std) { in ParseSubstitution() argument
1923 ComplexityGuard guard(state); in ParseSubstitution()
1925 if (ParseTwoCharToken(state, "S_")) { in ParseSubstitution()
1926 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1930 ParseState copy = state->parse_state; in ParseSubstitution()
1931 if (ParseOneCharToken(state, 'S') && ParseSeqId(state) && in ParseSubstitution()
1932 ParseOneCharToken(state, '_')) { in ParseSubstitution()
1933 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1936 state->parse_state = copy; in ParseSubstitution()
1939 if (ParseOneCharToken(state, 'S')) { in ParseSubstitution()
1942 if (RemainingInput(state)[0] == p->abbrev[1] && in ParseSubstitution()
1944 MaybeAppend(state, "std"); in ParseSubstitution()
1946 MaybeAppend(state, "::"); in ParseSubstitution()
1947 MaybeAppend(state, p->real_name); in ParseSubstitution()
1949 ++state->parse_state.mangled_idx; in ParseSubstitution()
1954 state->parse_state = copy; in ParseSubstitution()
1960 static bool ParseTopLevelMangledName(State *state) { in ParseTopLevelMangledName() argument
1961 ComplexityGuard guard(state); in ParseTopLevelMangledName()
1963 if (ParseMangledName(state)) { in ParseTopLevelMangledName()
1964 if (RemainingInput(state)[0] != '\0') { in ParseTopLevelMangledName() local
1966 if (IsFunctionCloneSuffix(RemainingInput(state))) { in ParseTopLevelMangledName()
1971 if (RemainingInput(state)[0] == '@') { in ParseTopLevelMangledName() local
1972 MaybeAppend(state, RemainingInput(state)); in ParseTopLevelMangledName()
1982 static bool Overflowed(const State *state) { in Overflowed() argument
1983 return state->parse_state.out_cur_idx >= state->out_end_idx; in Overflowed()
1988 State state; in Demangle() local
1989 InitState(&state, mangled, out, out_size); in Demangle()
1990 return ParseTopLevelMangledName(&state) && !Overflowed(&state) && in Demangle()
1991 state.parse_state.out_cur_idx > 0; in Demangle()