• Home
  • Raw
  • Download

Lines Matching full:state

151 // State needed for demangling.  This struct is copied in almost every stack
169 // One-off state for demangling that's not subject to backtracking -- either
181 ParseState parse_state; // Backtrackable state copied for most frames.
182 } State; typedef
189 explicit ComplexityGuard(State *state) : state_(state) { in ComplexityGuard() argument
190 ++state->recursion_depth; in ComplexityGuard()
191 ++state->steps; in ComplexityGuard()
222 State *state_;
256 static void InitState(State* state, in InitState() argument
260 state->mangled_begin = mangled; in InitState()
261 state->out = out; in InitState()
262 state->out_end_idx = static_cast<int>(out_size); in InitState()
263 state->recursion_depth = 0; in InitState()
264 state->steps = 0; in InitState()
266 state->parse_state.mangled_idx = 0; in InitState()
267 state->parse_state.out_cur_idx = 0; in InitState()
268 state->parse_state.prev_name_idx = 0; in InitState()
269 state->parse_state.prev_name_length = 0; in InitState()
270 state->parse_state.nest_level = -1; in InitState()
271 state->parse_state.append = true; in InitState()
274 static inline const char *RemainingInput(State *state) { in RemainingInput() argument
275 return &state->mangled_begin[state->parse_state.mangled_idx]; in RemainingInput()
281 static bool ParseOneCharToken(State *state, const char one_char_token) { in ParseOneCharToken() argument
282 ComplexityGuard guard(state); in ParseOneCharToken()
284 if (RemainingInput(state)[0] == one_char_token) { in ParseOneCharToken() local
285 ++state->parse_state.mangled_idx; in ParseOneCharToken()
294 static bool ParseTwoCharToken(State *state, const char *two_char_token) { in ParseTwoCharToken() argument
295 ComplexityGuard guard(state); in ParseTwoCharToken()
297 if (RemainingInput(state)[0] == two_char_token[0] && in ParseTwoCharToken()
298 RemainingInput(state)[1] == two_char_token[1]) { in ParseTwoCharToken()
299 state->parse_state.mangled_idx += 2; in ParseTwoCharToken()
307 static bool ParseCharClass(State *state, const char *char_class) { in ParseCharClass() argument
308 ComplexityGuard guard(state); in ParseCharClass()
310 if (RemainingInput(state)[0] == '\0') { in ParseCharClass() local
315 if (RemainingInput(state)[0] == *p) { in ParseCharClass()
316 ++state->parse_state.mangled_idx; in ParseCharClass()
323 static bool ParseDigit(State *state, int *digit) { in ParseDigit() argument
324 char c = RemainingInput(state)[0]; in ParseDigit()
325 if (ParseCharClass(state, "0123456789")) { in ParseDigit()
338 typedef bool (*ParseFunc)(State *);
339 static bool OneOrMore(ParseFunc parse_func, State *state) { in OneOrMore() argument
340 if (parse_func(state)) { in OneOrMore()
341 while (parse_func(state)) { in OneOrMore()
351 // ParseOneCharToken(state, 'E')).
352 static bool ZeroOrMore(ParseFunc parse_func, State *state) { in ZeroOrMore() argument
353 while (parse_func(state)) { in ZeroOrMore()
361 static void Append(State *state, const char *const str, const size_t length) { in Append() argument
363 if (state->parse_state.out_cur_idx + 1 < in Append()
364 state->out_end_idx) { // +1 for '\0' in Append()
365 state->out[state->parse_state.out_cur_idx++] = str[i]; in Append()
368 state->parse_state.out_cur_idx = state->out_end_idx + 1; in Append()
372 if (state->parse_state.out_cur_idx < state->out_end_idx) { in Append()
373 state->out[state->parse_state.out_cur_idx] = in Append()
417 static bool EndsWith(State *state, const char chr) { in EndsWith() argument
418 return state->parse_state.out_cur_idx > 0 && in EndsWith()
419 state->parse_state.out_cur_idx < state->out_end_idx && in EndsWith()
420 chr == state->out[state->parse_state.out_cur_idx - 1]; in EndsWith()
423 // Append "str" with some tweaks, iff "append" state is true.
424 static void MaybeAppendWithLength(State *state, const char *const str, in MaybeAppendWithLength() argument
426 if (state->parse_state.append && length > 0) { in MaybeAppendWithLength()
429 if (str[0] == '<' && EndsWith(state, '<')) { in MaybeAppendWithLength()
430 Append(state, " ", 1); in MaybeAppendWithLength()
434 if (state->parse_state.out_cur_idx < state->out_end_idx && in MaybeAppendWithLength()
436 state->parse_state.prev_name_idx = state->parse_state.out_cur_idx; in MaybeAppendWithLength()
437 state->parse_state.prev_name_length = static_cast<unsigned int>(length); in MaybeAppendWithLength()
439 Append(state, str, length); in MaybeAppendWithLength()
444 static bool MaybeAppendDecimal(State *state, int val) { in MaybeAppendDecimal() argument
451 if (state->parse_state.append) { in MaybeAppendDecimal()
461 Append(state, p, kMaxLength - static_cast<size_t>(p - buf)); in MaybeAppendDecimal()
469 static bool MaybeAppend(State *state, const char *const str) { in MaybeAppend() argument
470 if (state->parse_state.append) { in MaybeAppend()
472 MaybeAppendWithLength(state, str, length); in MaybeAppend()
478 static bool EnterNestedName(State *state) { in EnterNestedName() argument
479 state->parse_state.nest_level = 0; in EnterNestedName()
484 static bool LeaveNestedName(State *state, int16_t prev_value) { in LeaveNestedName() argument
485 state->parse_state.nest_level = prev_value; in LeaveNestedName()
490 static bool DisableAppend(State *state) { in DisableAppend() argument
491 state->parse_state.append = false; in DisableAppend()
495 // Restore the append mode to the previous state.
496 static bool RestoreAppend(State *state, bool prev_value) { in RestoreAppend() argument
497 state->parse_state.append = prev_value; in RestoreAppend()
502 static void MaybeIncreaseNestLevel(State *state) { in MaybeIncreaseNestLevel() argument
503 if (state->parse_state.nest_level > -1) { in MaybeIncreaseNestLevel()
504 ++state->parse_state.nest_level; in MaybeIncreaseNestLevel()
509 static void MaybeAppendSeparator(State *state) { in MaybeAppendSeparator() argument
510 if (state->parse_state.nest_level >= 1) { in MaybeAppendSeparator()
511 MaybeAppend(state, "::"); in MaybeAppendSeparator()
516 static void MaybeCancelLastSeparator(State *state) { in MaybeCancelLastSeparator() argument
517 if (state->parse_state.nest_level >= 1 && state->parse_state.append && in MaybeCancelLastSeparator()
518 state->parse_state.out_cur_idx >= 2) { in MaybeCancelLastSeparator()
519 state->parse_state.out_cur_idx -= 2; in MaybeCancelLastSeparator()
520 state->out[state->parse_state.out_cur_idx] = '\0'; in MaybeCancelLastSeparator()
526 static bool IdentifierIsAnonymousNamespace(State *state, size_t length) { in IdentifierIsAnonymousNamespace() argument
530 StrPrefix(RemainingInput(state), anon_prefix)); in IdentifierIsAnonymousNamespace()
534 static bool ParseMangledName(State *state);
535 static bool ParseEncoding(State *state);
536 static bool ParseName(State *state);
537 static bool ParseUnscopedName(State *state);
538 static bool ParseNestedName(State *state);
539 static bool ParsePrefix(State *state);
540 static bool ParseUnqualifiedName(State *state);
541 static bool ParseSourceName(State *state);
542 static bool ParseLocalSourceName(State *state);
543 static bool ParseUnnamedTypeName(State *state);
544 static bool ParseNumber(State *state, int *number_out);
545 static bool ParseFloatNumber(State *state);
546 static bool ParseSeqId(State *state);
547 static bool ParseIdentifier(State *state, size_t length);
548 static bool ParseOperatorName(State *state, int *arity);
549 static bool ParseSpecialName(State *state);
550 static bool ParseCallOffset(State *state);
551 static bool ParseNVOffset(State *state);
552 static bool ParseVOffset(State *state);
553 static bool ParseAbiTags(State *state);
554 static bool ParseCtorDtorName(State *state);
555 static bool ParseDecltype(State *state);
556 static bool ParseType(State *state);
557 static bool ParseCVQualifiers(State *state);
558 static bool ParseBuiltinType(State *state);
559 static bool ParseFunctionType(State *state);
560 static bool ParseBareFunctionType(State *state);
561 static bool ParseClassEnumType(State *state);
562 static bool ParseArrayType(State *state);
563 static bool ParsePointerToMemberType(State *state);
564 static bool ParseTemplateParam(State *state);
565 static bool ParseTemplateTemplateParam(State *state);
566 static bool ParseTemplateArgs(State *state);
567 static bool ParseTemplateArg(State *state);
568 static bool ParseBaseUnresolvedName(State *state);
569 static bool ParseUnresolvedName(State *state);
570 static bool ParseExpression(State *state);
571 static bool ParseExprPrimary(State *state);
572 static bool ParseExprCastValue(State *state);
573 static bool ParseLocalName(State *state);
574 static bool ParseLocalNameSuffix(State *state);
575 static bool ParseDiscriminator(State *state);
576 static bool ParseSubstitution(State *state, bool accept_std);
588 // Each parsing function changes the parse state and returns true on
589 // success, or returns false and doesn't change the parse state (note:
591 // To ensure that the parse state isn't changed in the latter case, we
592 // save the original state before we call multiple parsing functions
610 static bool ParseMangledName(State *state) { in ParseMangledName() argument
611 ComplexityGuard guard(state); in ParseMangledName()
613 return ParseTwoCharToken(state, "_Z") && ParseEncoding(state); in ParseMangledName()
619 static bool ParseEncoding(State *state) { in ParseEncoding() argument
620 ComplexityGuard guard(state); in ParseEncoding()
625 // Since Optional(...) can't fail, there's no need to copy the state for in ParseEncoding()
627 if (ParseName(state) && Optional(ParseBareFunctionType(state))) { in ParseEncoding()
631 if (ParseSpecialName(state)) { in ParseEncoding()
641 static bool ParseName(State *state) { in ParseName() argument
642 ComplexityGuard guard(state); in ParseName()
644 if (ParseNestedName(state) || ParseLocalName(state)) { in ParseName()
656 ParseState copy = state->parse_state; in ParseName()
658 if (ParseSubstitution(state, /*accept_std=*/false) && in ParseName()
659 ParseTemplateArgs(state)) { in ParseName()
662 state->parse_state = copy; in ParseName()
664 // Note there's no need to restore state after this since only the first in ParseName()
666 return ParseUnscopedName(state) && Optional(ParseTemplateArgs(state)); in ParseName()
671 static bool ParseUnscopedName(State *state) { in ParseUnscopedName() argument
672 ComplexityGuard guard(state); in ParseUnscopedName()
674 if (ParseUnqualifiedName(state)) { in ParseUnscopedName()
678 ParseState copy = state->parse_state; in ParseUnscopedName()
679 if (ParseTwoCharToken(state, "St") && MaybeAppend(state, "std::") && in ParseUnscopedName()
680 ParseUnqualifiedName(state)) { in ParseUnscopedName()
683 state->parse_state = copy; in ParseUnscopedName()
689 static inline bool ParseRefQualifier(State *state) { in ParseRefQualifier() argument
690 return ParseCharClass(state, "OR"); in ParseRefQualifier()
697 static bool ParseNestedName(State *state) { in ParseNestedName() argument
698 ComplexityGuard guard(state); in ParseNestedName()
700 ParseState copy = state->parse_state; in ParseNestedName()
701 if (ParseOneCharToken(state, 'N') && EnterNestedName(state) && in ParseNestedName()
702 Optional(ParseCVQualifiers(state)) && in ParseNestedName()
703 Optional(ParseRefQualifier(state)) && ParsePrefix(state) && in ParseNestedName()
704 LeaveNestedName(state, copy.nest_level) && in ParseNestedName()
705 ParseOneCharToken(state, 'E')) { in ParseNestedName()
708 state->parse_state = copy; in ParseNestedName()
723 static bool ParsePrefix(State *state) { in ParsePrefix() argument
724 ComplexityGuard guard(state); in ParsePrefix()
728 MaybeAppendSeparator(state); in ParsePrefix()
729 if (ParseTemplateParam(state) || in ParsePrefix()
730 ParseSubstitution(state, /*accept_std=*/true) || in ParsePrefix()
731 ParseUnscopedName(state) || in ParsePrefix()
732 (ParseOneCharToken(state, 'M') && ParseUnnamedTypeName(state))) { in ParsePrefix()
734 MaybeIncreaseNestLevel(state); in ParsePrefix()
737 MaybeCancelLastSeparator(state); in ParsePrefix()
738 if (has_something && ParseTemplateArgs(state)) { in ParsePrefix()
739 return ParsePrefix(state); in ParsePrefix()
754 static bool ParseUnqualifiedName(State *state) { in ParseUnqualifiedName() argument
755 ComplexityGuard guard(state); in ParseUnqualifiedName()
757 if (ParseOperatorName(state, nullptr) || ParseCtorDtorName(state) || in ParseUnqualifiedName()
758 ParseSourceName(state) || ParseLocalSourceName(state) || in ParseUnqualifiedName()
759 ParseUnnamedTypeName(state)) { in ParseUnqualifiedName()
760 return ParseAbiTags(state); in ParseUnqualifiedName()
767 static bool ParseAbiTags(State *state) { in ParseAbiTags() argument
768 ComplexityGuard guard(state); in ParseAbiTags()
771 while (ParseOneCharToken(state, 'B')) { in ParseAbiTags()
772 ParseState copy = state->parse_state; in ParseAbiTags()
773 MaybeAppend(state, "[abi:"); in ParseAbiTags()
775 if (!ParseSourceName(state)) { in ParseAbiTags()
776 state->parse_state = copy; in ParseAbiTags()
779 MaybeAppend(state, "]"); in ParseAbiTags()
786 static bool ParseSourceName(State *state) { in ParseSourceName() argument
787 ComplexityGuard guard(state); in ParseSourceName()
789 ParseState copy = state->parse_state; in ParseSourceName()
791 if (ParseNumber(state, &length) && in ParseSourceName()
792 ParseIdentifier(state, static_cast<size_t>(length))) { in ParseSourceName()
795 state->parse_state = copy; in ParseSourceName()
804 static bool ParseLocalSourceName(State *state) { in ParseLocalSourceName() argument
805 ComplexityGuard guard(state); in ParseLocalSourceName()
807 ParseState copy = state->parse_state; in ParseLocalSourceName()
808 if (ParseOneCharToken(state, 'L') && ParseSourceName(state) && in ParseLocalSourceName()
809 Optional(ParseDiscriminator(state))) { in ParseLocalSourceName()
812 state->parse_state = copy; in ParseLocalSourceName()
820 static bool ParseUnnamedTypeName(State *state) { in ParseUnnamedTypeName() argument
821 ComplexityGuard guard(state); in ParseUnnamedTypeName()
823 ParseState copy = state->parse_state; in ParseUnnamedTypeName()
829 if (ParseTwoCharToken(state, "Ut") && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
831 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
832 MaybeAppend(state, "{unnamed type#"); in ParseUnnamedTypeName()
833 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
834 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
837 state->parse_state = copy; in ParseUnnamedTypeName()
841 if (ParseTwoCharToken(state, "Ul") && DisableAppend(state) && in ParseUnnamedTypeName()
842 OneOrMore(ParseType, state) && RestoreAppend(state, copy.append) && in ParseUnnamedTypeName()
843 ParseOneCharToken(state, 'E') && Optional(ParseNumber(state, &which)) && in ParseUnnamedTypeName()
845 ParseOneCharToken(state, '_')) { in ParseUnnamedTypeName()
846 MaybeAppend(state, "{lambda()#"); in ParseUnnamedTypeName()
847 MaybeAppendDecimal(state, 2 + which); in ParseUnnamedTypeName()
848 MaybeAppend(state, "}"); in ParseUnnamedTypeName()
851 state->parse_state = copy; in ParseUnnamedTypeName()
859 static bool ParseNumber(State *state, int *number_out) { in ParseNumber() argument
860 ComplexityGuard guard(state); in ParseNumber()
863 if (ParseOneCharToken(state, 'n')) { in ParseNumber()
866 const char *p = RemainingInput(state); in ParseNumber()
881 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseNumber()
882 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseNumber()
894 static bool ParseFloatNumber(State *state) { in ParseFloatNumber() argument
895 ComplexityGuard guard(state); in ParseFloatNumber()
897 const char *p = RemainingInput(state); in ParseFloatNumber()
903 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseFloatNumber()
904 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseFloatNumber()
912 static bool ParseSeqId(State *state) { in ParseSeqId() argument
913 ComplexityGuard guard(state); in ParseSeqId()
915 const char *p = RemainingInput(state); in ParseSeqId()
921 if (p != RemainingInput(state)) { // Conversion succeeded. in ParseSeqId()
922 state->parse_state.mangled_idx += p - RemainingInput(state); in ParseSeqId()
929 static bool ParseIdentifier(State *state, size_t length) { in ParseIdentifier() argument
930 ComplexityGuard guard(state); in ParseIdentifier()
932 if (!AtLeastNumCharsRemaining(RemainingInput(state), length)) { in ParseIdentifier()
935 if (IdentifierIsAnonymousNamespace(state, length)) { in ParseIdentifier()
936 MaybeAppend(state, "(anonymous namespace)"); in ParseIdentifier()
938 MaybeAppendWithLength(state, RemainingInput(state), length); in ParseIdentifier()
940 state->parse_state.mangled_idx += length; in ParseIdentifier()
947 static bool ParseOperatorName(State *state, int *arity) { in ParseOperatorName() argument
948 ComplexityGuard guard(state); in ParseOperatorName()
950 if (!AtLeastNumCharsRemaining(RemainingInput(state), 2)) { in ParseOperatorName()
954 ParseState copy = state->parse_state; in ParseOperatorName()
955 if (ParseTwoCharToken(state, "cv") && MaybeAppend(state, "operator ") && in ParseOperatorName()
956 EnterNestedName(state) && ParseType(state) && in ParseOperatorName()
957 LeaveNestedName(state, copy.nest_level)) { in ParseOperatorName()
963 state->parse_state = copy; in ParseOperatorName()
966 if (ParseOneCharToken(state, 'v') && ParseDigit(state, arity) && in ParseOperatorName()
967 ParseSourceName(state)) { in ParseOperatorName()
970 state->parse_state = copy; in ParseOperatorName()
974 if (!(IsLower(RemainingInput(state)[0]) && in ParseOperatorName()
975 IsAlpha(RemainingInput(state)[1]))) { in ParseOperatorName()
981 if (RemainingInput(state)[0] == p->abbrev[0] && in ParseOperatorName()
982 RemainingInput(state)[1] == p->abbrev[1]) { in ParseOperatorName()
986 MaybeAppend(state, "operator"); in ParseOperatorName()
988 MaybeAppend(state, " "); in ParseOperatorName()
990 MaybeAppend(state, p->real_name); in ParseOperatorName()
991 state->parse_state.mangled_idx += 2; in ParseOperatorName()
1017 static bool ParseSpecialName(State *state) { in ParseSpecialName() argument
1018 ComplexityGuard guard(state); in ParseSpecialName()
1020 ParseState copy = state->parse_state; in ParseSpecialName()
1021 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTISH") && in ParseSpecialName()
1022 ParseType(state)) { in ParseSpecialName()
1025 state->parse_state = copy; in ParseSpecialName()
1027 if (ParseTwoCharToken(state, "Tc") && ParseCallOffset(state) && in ParseSpecialName()
1028 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1031 state->parse_state = copy; in ParseSpecialName()
1033 if (ParseTwoCharToken(state, "GV") && ParseName(state)) { in ParseSpecialName()
1036 state->parse_state = copy; in ParseSpecialName()
1038 if (ParseOneCharToken(state, 'T') && ParseCallOffset(state) && in ParseSpecialName()
1039 ParseEncoding(state)) { in ParseSpecialName()
1042 state->parse_state = copy; in ParseSpecialName()
1045 if (ParseTwoCharToken(state, "TC") && ParseType(state) && in ParseSpecialName()
1046 ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseSpecialName()
1047 DisableAppend(state) && ParseType(state)) { in ParseSpecialName()
1048 RestoreAppend(state, copy.append); in ParseSpecialName()
1051 state->parse_state = copy; in ParseSpecialName()
1053 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "FJ") && in ParseSpecialName()
1054 ParseType(state)) { in ParseSpecialName()
1057 state->parse_state = copy; in ParseSpecialName()
1059 if (ParseTwoCharToken(state, "GR") && ParseName(state)) { in ParseSpecialName()
1062 state->parse_state = copy; in ParseSpecialName()
1064 if (ParseTwoCharToken(state, "GA") && ParseEncoding(state)) { in ParseSpecialName()
1067 state->parse_state = copy; in ParseSpecialName()
1069 if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "hv") && in ParseSpecialName()
1070 ParseCallOffset(state) && ParseEncoding(state)) { in ParseSpecialName()
1073 state->parse_state = copy; in ParseSpecialName()
1079 static bool ParseCallOffset(State *state) { in ParseCallOffset() argument
1080 ComplexityGuard guard(state); in ParseCallOffset()
1082 ParseState copy = state->parse_state; in ParseCallOffset()
1083 if (ParseOneCharToken(state, 'h') && ParseNVOffset(state) && in ParseCallOffset()
1084 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1087 state->parse_state = copy; in ParseCallOffset()
1089 if (ParseOneCharToken(state, 'v') && ParseVOffset(state) && in ParseCallOffset()
1090 ParseOneCharToken(state, '_')) { in ParseCallOffset()
1093 state->parse_state = copy; in ParseCallOffset()
1099 static bool ParseNVOffset(State *state) { in ParseNVOffset() argument
1100 ComplexityGuard guard(state); in ParseNVOffset()
1102 return ParseNumber(state, nullptr); in ParseNVOffset()
1106 static bool ParseVOffset(State *state) { in ParseVOffset() argument
1107 ComplexityGuard guard(state); in ParseVOffset()
1109 ParseState copy = state->parse_state; in ParseVOffset()
1110 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') && in ParseVOffset()
1111 ParseNumber(state, nullptr)) { in ParseVOffset()
1114 state->parse_state = copy; in ParseVOffset()
1125 static bool ParseCtorDtorName(State *state) { in ParseCtorDtorName() argument
1126 ComplexityGuard guard(state); in ParseCtorDtorName()
1128 ParseState copy = state->parse_state; in ParseCtorDtorName()
1129 if (ParseOneCharToken(state, 'C')) { in ParseCtorDtorName()
1130 if (ParseCharClass(state, "1234")) { in ParseCtorDtorName()
1132 state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1133 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1134 state->parse_state.prev_name_length); in ParseCtorDtorName()
1136 } else if (ParseOneCharToken(state, 'I') && ParseCharClass(state, "12") && in ParseCtorDtorName()
1137 ParseClassEnumType(state)) { in ParseCtorDtorName()
1141 state->parse_state = copy; in ParseCtorDtorName()
1143 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "0124")) { in ParseCtorDtorName()
1144 const char *const prev_name = state->out + state->parse_state.prev_name_idx; in ParseCtorDtorName()
1145 MaybeAppend(state, "~"); in ParseCtorDtorName()
1146 MaybeAppendWithLength(state, prev_name, in ParseCtorDtorName()
1147 state->parse_state.prev_name_length); in ParseCtorDtorName()
1150 state->parse_state = copy; in ParseCtorDtorName()
1157 static bool ParseDecltype(State *state) { in ParseDecltype() argument
1158 ComplexityGuard guard(state); in ParseDecltype()
1161 ParseState copy = state->parse_state; in ParseDecltype()
1162 if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "tT") && in ParseDecltype()
1163 ParseExpression(state) && ParseOneCharToken(state, 'E')) { in ParseDecltype()
1166 state->parse_state = copy; in ParseDecltype()
1190 static bool ParseType(State *state) { in ParseType() argument
1191 ComplexityGuard guard(state); in ParseType()
1193 ParseState copy = state->parse_state; in ParseType()
1208 if (ParseCVQualifiers(state)) { in ParseType()
1209 const bool result = ParseType(state); in ParseType()
1210 if (!result) state->parse_state = copy; in ParseType()
1213 state->parse_state = copy; in ParseType()
1219 if (ParseCharClass(state, "OPRCG")) { in ParseType()
1220 const bool result = ParseType(state); in ParseType()
1221 if (!result) state->parse_state = copy; in ParseType()
1224 state->parse_state = copy; in ParseType()
1226 if (ParseTwoCharToken(state, "Dp") && ParseType(state)) { in ParseType()
1229 state->parse_state = copy; in ParseType()
1231 if (ParseOneCharToken(state, 'U') && ParseSourceName(state) && in ParseType()
1232 ParseType(state)) { in ParseType()
1235 state->parse_state = copy; in ParseType()
1237 if (ParseBuiltinType(state) || ParseFunctionType(state) || in ParseType()
1238 ParseClassEnumType(state) || ParseArrayType(state) || in ParseType()
1239 ParsePointerToMemberType(state) || ParseDecltype(state) || in ParseType()
1241 ParseSubstitution(state, /*accept_std=*/false)) { in ParseType()
1245 if (ParseTemplateTemplateParam(state) && ParseTemplateArgs(state)) { in ParseType()
1248 state->parse_state = copy; in ParseType()
1251 if (ParseTemplateParam(state)) { in ParseType()
1255 if (ParseTwoCharToken(state, "Dv") && ParseNumber(state, nullptr) && in ParseType()
1256 ParseOneCharToken(state, '_')) { in ParseType()
1259 state->parse_state = copy; in ParseType()
1267 static bool ParseCVQualifiers(State *state) { in ParseCVQualifiers() argument
1268 ComplexityGuard guard(state); in ParseCVQualifiers()
1271 num_cv_qualifiers += ParseOneCharToken(state, 'r'); in ParseCVQualifiers()
1272 num_cv_qualifiers += ParseOneCharToken(state, 'V'); in ParseCVQualifiers()
1273 num_cv_qualifiers += ParseOneCharToken(state, 'K'); in ParseCVQualifiers()
1284 static bool ParseBuiltinType(State *state) { in ParseBuiltinType() argument
1285 ComplexityGuard guard(state); in ParseBuiltinType()
1291 if (ParseOneCharToken(state, p->abbrev[0])) { in ParseBuiltinType()
1292 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1295 } else if (p->abbrev[2] == '\0' && ParseTwoCharToken(state, p->abbrev)) { in ParseBuiltinType()
1296 MaybeAppend(state, p->real_name); in ParseBuiltinType()
1301 ParseState copy = state->parse_state; in ParseBuiltinType()
1302 if (ParseOneCharToken(state, 'u') && ParseSourceName(state)) { in ParseBuiltinType()
1305 state->parse_state = copy; in ParseBuiltinType()
1316 static bool ParseExceptionSpec(State *state) { in ParseExceptionSpec() argument
1317 ComplexityGuard guard(state); in ParseExceptionSpec()
1320 if (ParseTwoCharToken(state, "Do")) return true; in ParseExceptionSpec()
1322 ParseState copy = state->parse_state; in ParseExceptionSpec()
1323 if (ParseTwoCharToken(state, "DO") && ParseExpression(state) && in ParseExceptionSpec()
1324 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1327 state->parse_state = copy; in ParseExceptionSpec()
1328 if (ParseTwoCharToken(state, "Dw") && OneOrMore(ParseType, state) && in ParseExceptionSpec()
1329 ParseOneCharToken(state, 'E')) { in ParseExceptionSpec()
1332 state->parse_state = copy; in ParseExceptionSpec()
1338 static bool ParseFunctionType(State *state) { in ParseFunctionType() argument
1339 ComplexityGuard guard(state); in ParseFunctionType()
1341 ParseState copy = state->parse_state; in ParseFunctionType()
1342 if (Optional(ParseExceptionSpec(state)) && ParseOneCharToken(state, 'F') && in ParseFunctionType()
1343 Optional(ParseOneCharToken(state, 'Y')) && ParseBareFunctionType(state) && in ParseFunctionType()
1344 Optional(ParseOneCharToken(state, 'O')) && in ParseFunctionType()
1345 ParseOneCharToken(state, 'E')) { in ParseFunctionType()
1348 state->parse_state = copy; in ParseFunctionType()
1353 static bool ParseBareFunctionType(State *state) { in ParseBareFunctionType() argument
1354 ComplexityGuard guard(state); in ParseBareFunctionType()
1356 ParseState copy = state->parse_state; in ParseBareFunctionType()
1357 DisableAppend(state); in ParseBareFunctionType()
1358 if (OneOrMore(ParseType, state)) { in ParseBareFunctionType()
1359 RestoreAppend(state, copy.append); in ParseBareFunctionType()
1360 MaybeAppend(state, "()"); in ParseBareFunctionType()
1363 state->parse_state = copy; in ParseBareFunctionType()
1368 static bool ParseClassEnumType(State *state) { in ParseClassEnumType() argument
1369 ComplexityGuard guard(state); in ParseClassEnumType()
1371 return ParseName(state); in ParseClassEnumType()
1376 static bool ParseArrayType(State *state) { in ParseArrayType() argument
1377 ComplexityGuard guard(state); in ParseArrayType()
1379 ParseState copy = state->parse_state; in ParseArrayType()
1380 if (ParseOneCharToken(state, 'A') && ParseNumber(state, nullptr) && in ParseArrayType()
1381 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1384 state->parse_state = copy; in ParseArrayType()
1386 if (ParseOneCharToken(state, 'A') && Optional(ParseExpression(state)) && in ParseArrayType()
1387 ParseOneCharToken(state, '_') && ParseType(state)) { in ParseArrayType()
1390 state->parse_state = copy; in ParseArrayType()
1395 static bool ParsePointerToMemberType(State *state) { in ParsePointerToMemberType() argument
1396 ComplexityGuard guard(state); in ParsePointerToMemberType()
1398 ParseState copy = state->parse_state; in ParsePointerToMemberType()
1399 if (ParseOneCharToken(state, 'M') && ParseType(state) && ParseType(state)) { in ParsePointerToMemberType()
1402 state->parse_state = copy; in ParsePointerToMemberType()
1408 static bool ParseTemplateParam(State *state) { in ParseTemplateParam() argument
1409 ComplexityGuard guard(state); in ParseTemplateParam()
1411 if (ParseTwoCharToken(state, "T_")) { in ParseTemplateParam()
1412 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1416 ParseState copy = state->parse_state; in ParseTemplateParam()
1417 if (ParseOneCharToken(state, 'T') && ParseNumber(state, nullptr) && in ParseTemplateParam()
1418 ParseOneCharToken(state, '_')) { in ParseTemplateParam()
1419 MaybeAppend(state, "?"); // We don't support template substitutions. in ParseTemplateParam()
1422 state->parse_state = copy; in ParseTemplateParam()
1428 static bool ParseTemplateTemplateParam(State *state) { in ParseTemplateTemplateParam() argument
1429 ComplexityGuard guard(state); in ParseTemplateTemplateParam()
1431 return (ParseTemplateParam(state) || in ParseTemplateTemplateParam()
1433 ParseSubstitution(state, /*accept_std=*/false)); in ParseTemplateTemplateParam()
1437 static bool ParseTemplateArgs(State *state) { in ParseTemplateArgs() argument
1438 ComplexityGuard guard(state); in ParseTemplateArgs()
1440 ParseState copy = state->parse_state; in ParseTemplateArgs()
1441 DisableAppend(state); in ParseTemplateArgs()
1442 if (ParseOneCharToken(state, 'I') && OneOrMore(ParseTemplateArg, state) && in ParseTemplateArgs()
1443 ParseOneCharToken(state, 'E')) { in ParseTemplateArgs()
1444 RestoreAppend(state, copy.append); in ParseTemplateArgs()
1445 MaybeAppend(state, "<>"); in ParseTemplateArgs()
1448 state->parse_state = copy; in ParseTemplateArgs()
1456 static bool ParseTemplateArg(State *state) { in ParseTemplateArg() argument
1457 ComplexityGuard guard(state); in ParseTemplateArg()
1459 ParseState copy = state->parse_state; in ParseTemplateArg()
1460 if (ParseOneCharToken(state, 'J') && ZeroOrMore(ParseTemplateArg, state) && in ParseTemplateArg()
1461 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1464 state->parse_state = copy; in ParseTemplateArg()
1534 if (ParseLocalSourceName(state) && Optional(ParseTemplateArgs(state))) { in ParseTemplateArg()
1535 copy = state->parse_state; in ParseTemplateArg()
1536 if (ParseExprCastValue(state) && ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1539 state->parse_state = copy; in ParseTemplateArg()
1545 if (ParseType(state) || ParseExprPrimary(state)) { in ParseTemplateArg()
1548 state->parse_state = copy; in ParseTemplateArg()
1550 if (ParseOneCharToken(state, 'X') && ParseExpression(state) && in ParseTemplateArg()
1551 ParseOneCharToken(state, 'E')) { in ParseTemplateArg()
1554 state->parse_state = copy; in ParseTemplateArg()
1561 static inline bool ParseUnresolvedType(State *state) { in ParseUnresolvedType() argument
1562 // No ComplexityGuard because we don't copy the state in this stack frame. in ParseUnresolvedType()
1563 return (ParseTemplateParam(state) && Optional(ParseTemplateArgs(state))) || in ParseUnresolvedType()
1564 ParseDecltype(state) || ParseSubstitution(state, /*accept_std=*/false); in ParseUnresolvedType()
1568 static inline bool ParseSimpleId(State *state) { in ParseSimpleId() argument
1569 // No ComplexityGuard because we don't copy the state in this stack frame. in ParseSimpleId()
1573 return ParseSourceName(state) && Optional(ParseTemplateArgs(state)); in ParseSimpleId()
1579 static bool ParseBaseUnresolvedName(State *state) { in ParseBaseUnresolvedName() argument
1580 ComplexityGuard guard(state); in ParseBaseUnresolvedName()
1583 if (ParseSimpleId(state)) { in ParseBaseUnresolvedName()
1587 ParseState copy = state->parse_state; in ParseBaseUnresolvedName()
1588 if (ParseTwoCharToken(state, "on") && ParseOperatorName(state, nullptr) && in ParseBaseUnresolvedName()
1589 Optional(ParseTemplateArgs(state))) { in ParseBaseUnresolvedName()
1592 state->parse_state = copy; in ParseBaseUnresolvedName()
1594 if (ParseTwoCharToken(state, "dn") && in ParseBaseUnresolvedName()
1595 (ParseUnresolvedType(state) || ParseSimpleId(state))) { in ParseBaseUnresolvedName()
1598 state->parse_state = copy; in ParseBaseUnresolvedName()
1609 static bool ParseUnresolvedName(State *state) { in ParseUnresolvedName() argument
1610 ComplexityGuard guard(state); in ParseUnresolvedName()
1613 ParseState copy = state->parse_state; in ParseUnresolvedName()
1614 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
1615 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1618 state->parse_state = copy; in ParseUnresolvedName()
1620 if (ParseTwoCharToken(state, "sr") && ParseUnresolvedType(state) && in ParseUnresolvedName()
1621 ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1624 state->parse_state = copy; in ParseUnresolvedName()
1626 if (ParseTwoCharToken(state, "sr") && ParseOneCharToken(state, 'N') && in ParseUnresolvedName()
1627 ParseUnresolvedType(state) && in ParseUnresolvedName()
1628 OneOrMore(/* <unresolved-qualifier-level> ::= */ ParseSimpleId, state) && in ParseUnresolvedName()
1629 ParseOneCharToken(state, 'E') && ParseBaseUnresolvedName(state)) { in ParseUnresolvedName()
1632 state->parse_state = copy; in ParseUnresolvedName()
1634 if (Optional(ParseTwoCharToken(state, "gs")) && in ParseUnresolvedName()
1635 ParseTwoCharToken(state, "sr") && 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()
1665 static bool ParseExpression(State *state) { in ParseExpression() argument
1666 ComplexityGuard guard(state); in ParseExpression()
1668 if (ParseTemplateParam(state) || ParseExprPrimary(state)) { in ParseExpression()
1672 ParseState copy = state->parse_state; in ParseExpression()
1675 if (ParseTwoCharToken(state, "cl") && OneOrMore(ParseExpression, state) && in ParseExpression()
1676 ParseOneCharToken(state, 'E')) { in ParseExpression()
1679 state->parse_state = copy; in ParseExpression()
1683 if (ParseTwoCharToken(state, "cp") && ParseSimpleId(state) && in ParseExpression()
1684 ZeroOrMore(ParseExpression, state) && ParseOneCharToken(state, 'E')) { in ParseExpression()
1687 state->parse_state = copy; in ParseExpression()
1690 if (ParseTwoCharToken(state, "fp") && Optional(ParseCVQualifiers(state)) && in ParseExpression()
1691 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseExpression()
1694 state->parse_state = copy; in ParseExpression()
1697 if (ParseTwoCharToken(state, "fL") && Optional(ParseNumber(state, nullptr)) && in ParseExpression()
1698 ParseOneCharToken(state, 'p') && Optional(ParseCVQualifiers(state)) && in ParseExpression()
1699 Optional(ParseNumber(state, nullptr)) && ParseOneCharToken(state, '_')) { in ParseExpression()
1702 state->parse_state = copy; in ParseExpression()
1712 if (ParseTwoCharToken(state, "cv")) { in ParseExpression()
1713 if (ParseType(state)) { in ParseExpression()
1714 ParseState copy2 = state->parse_state; in ParseExpression()
1715 if (ParseOneCharToken(state, '_') && ZeroOrMore(ParseExpression, state) && in ParseExpression()
1716 ParseOneCharToken(state, 'E')) { in ParseExpression()
1719 state->parse_state = copy2; in ParseExpression()
1720 if (ParseExpression(state)) { in ParseExpression()
1731 if (ParseOperatorName(state, &arity) && in ParseExpression()
1733 (arity < 3 || ParseExpression(state)) && in ParseExpression()
1734 (arity < 2 || ParseExpression(state)) && in ParseExpression()
1735 (arity < 1 || ParseExpression(state))) { in ParseExpression()
1739 state->parse_state = copy; in ParseExpression()
1742 if (ParseTwoCharToken(state, "st") && ParseType(state)) { in ParseExpression()
1745 state->parse_state = copy; in ParseExpression()
1748 if ((ParseTwoCharToken(state, "dt") || ParseTwoCharToken(state, "pt")) && in ParseExpression()
1749 ParseExpression(state) && ParseType(state)) { in ParseExpression()
1752 state->parse_state = copy; in ParseExpression()
1757 if (ParseTwoCharToken(state, "ds") && ParseExpression(state) && in ParseExpression()
1758 ParseExpression(state)) { in ParseExpression()
1761 state->parse_state = copy; in ParseExpression()
1764 if (ParseTwoCharToken(state, "sp") && ParseExpression(state)) { in ParseExpression()
1767 state->parse_state = copy; in ParseExpression()
1769 return ParseUnresolvedName(state); in ParseExpression()
1798 static bool ParseExprPrimary(State *state) { in ParseExprPrimary() argument
1799 ComplexityGuard guard(state); in ParseExprPrimary()
1801 ParseState copy = state->parse_state; in ParseExprPrimary()
1805 if (ParseTwoCharToken(state, "LZ")) { in ParseExprPrimary()
1806 if (ParseEncoding(state) && ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1810 state->parse_state = copy; in ParseExprPrimary()
1815 if (ParseOneCharToken(state, 'L') && ParseType(state) && in ParseExprPrimary()
1816 ParseExprCastValue(state)) { in ParseExprPrimary()
1819 state->parse_state = copy; in ParseExprPrimary()
1821 if (ParseOneCharToken(state, 'L') && ParseMangledName(state) && in ParseExprPrimary()
1822 ParseOneCharToken(state, 'E')) { in ParseExprPrimary()
1825 state->parse_state = copy; in ParseExprPrimary()
1831 static bool ParseExprCastValue(State *state) { in ParseExprCastValue() argument
1832 ComplexityGuard guard(state); in ParseExprCastValue()
1837 ParseState copy = state->parse_state; in ParseExprCastValue()
1838 if (ParseNumber(state, nullptr) && ParseOneCharToken(state, 'E')) { in ParseExprCastValue()
1841 state->parse_state = copy; in ParseExprCastValue()
1843 if (ParseFloatNumber(state) && ParseOneCharToken(state, 'E')) { in ParseExprCastValue()
1846 state->parse_state = copy; in ParseExprCastValue()
1860 static bool ParseLocalNameSuffix(State *state) { in ParseLocalNameSuffix() argument
1861 ComplexityGuard guard(state); in ParseLocalNameSuffix()
1864 if (MaybeAppend(state, "::") && ParseName(state) && in ParseLocalNameSuffix()
1865 Optional(ParseDiscriminator(state))) { in ParseLocalNameSuffix()
1872 if (state->parse_state.append) { in ParseLocalNameSuffix()
1873 state->out[state->parse_state.out_cur_idx - 2] = '\0'; in ParseLocalNameSuffix()
1876 return ParseOneCharToken(state, 's') && Optional(ParseDiscriminator(state)); in ParseLocalNameSuffix()
1879 static bool ParseLocalName(State *state) { in ParseLocalName() argument
1880 ComplexityGuard guard(state); in ParseLocalName()
1882 ParseState copy = state->parse_state; in ParseLocalName()
1883 if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && in ParseLocalName()
1884 ParseOneCharToken(state, 'E') && ParseLocalNameSuffix(state)) { in ParseLocalName()
1887 state->parse_state = copy; in ParseLocalName()
1892 static bool ParseDiscriminator(State *state) { in ParseDiscriminator() argument
1893 ComplexityGuard guard(state); in ParseDiscriminator()
1895 ParseState copy = state->parse_state; in ParseDiscriminator()
1896 if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr)) { in ParseDiscriminator()
1899 state->parse_state = copy; in ParseDiscriminator()
1914 static bool ParseSubstitution(State *state, bool accept_std) { in ParseSubstitution() argument
1915 ComplexityGuard guard(state); in ParseSubstitution()
1917 if (ParseTwoCharToken(state, "S_")) { in ParseSubstitution()
1918 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1922 ParseState copy = state->parse_state; in ParseSubstitution()
1923 if (ParseOneCharToken(state, 'S') && ParseSeqId(state) && in ParseSubstitution()
1924 ParseOneCharToken(state, '_')) { in ParseSubstitution()
1925 MaybeAppend(state, "?"); // We don't support substitutions. in ParseSubstitution()
1928 state->parse_state = copy; in ParseSubstitution()
1931 if (ParseOneCharToken(state, 'S')) { in ParseSubstitution()
1934 if (RemainingInput(state)[0] == p->abbrev[1] && in ParseSubstitution()
1936 MaybeAppend(state, "std"); in ParseSubstitution()
1938 MaybeAppend(state, "::"); in ParseSubstitution()
1939 MaybeAppend(state, p->real_name); in ParseSubstitution()
1941 ++state->parse_state.mangled_idx; in ParseSubstitution()
1946 state->parse_state = copy; in ParseSubstitution()
1952 static bool ParseTopLevelMangledName(State *state) { in ParseTopLevelMangledName() argument
1953 ComplexityGuard guard(state); in ParseTopLevelMangledName()
1955 if (ParseMangledName(state)) { in ParseTopLevelMangledName()
1956 if (RemainingInput(state)[0] != '\0') { in ParseTopLevelMangledName() local
1958 if (IsFunctionCloneSuffix(RemainingInput(state))) { in ParseTopLevelMangledName()
1963 if (RemainingInput(state)[0] == '@') { in ParseTopLevelMangledName() local
1964 MaybeAppend(state, RemainingInput(state)); in ParseTopLevelMangledName()
1974 static bool Overflowed(const State *state) { in Overflowed() argument
1975 return state->parse_state.out_cur_idx >= state->out_end_idx; in Overflowed()
1980 State state; in Demangle() local
1981 InitState(&state, mangled, out, out_size); in Demangle()
1982 return ParseTopLevelMangledName(&state) && !Overflowed(&state) && in Demangle()
1983 state.parse_state.out_cur_idx > 0; in Demangle()