10 #define _LIBCPP_EXTERN_TEMPLATE(...)
11 #define _LIBCPP_NO_EXCEPTIONS
24 #define snprintf _snprintf_s
44 const char* parse_type(
const char*
first,
const char* last,
C& db);
46 const char* parse_encoding(
const char*
first,
const char* last,
C& db);
49 bool* ends_with_template_args = 0);
51 const char* parse_expression(
const char*
first,
const char* last,
C& db);
53 const char* parse_template_args(
const char*
first,
const char* last,
C& db);
55 const char* parse_operator_name(
const char*
first,
const char* last,
C& db);
57 const char* parse_unqualified_name(
const char*
first,
const char* last,
C& db);
59 const char* parse_decltype(
const char*
first,
const char* last,
C& db);
63 print_stack(
const C& db)
65 fprintf(
stderr,
"---------\n");
66 fprintf(
stderr,
"names:\n");
67 for (
auto& s : db.names)
68 fprintf(
stderr,
"{%s#%s}\n", s.first.c_str(), s.second.c_str());
70 fprintf(
stderr,
"subs:\n");
71 for (
auto&
v : db.subs)
78 fprintf(
stderr,
"{%s#%s}", s.first.c_str(), s.second.c_str());
82 fprintf(
stderr,
"template_param:\n");
83 for (
auto& t : db.template_param)
94 fprintf(
stderr,
"{%s#%s}", s.first.c_str(), s.second.c_str());
99 fprintf(
stderr,
"---------\n\n");
104 print_state(
const char*
msg,
const char*
first,
const char* last,
const C& db)
120 const char* t =
first;
129 else if (
'1' <= *t && *t <=
'9')
140 template <
class Float>
144 struct float_data<float>
146 static const size_t mangled_size = 8;
147 static const size_t max_demangled_size = 24;
148 static constexpr
const char*
spec =
"%af";
154 struct float_data<double>
156 static const size_t mangled_size = 16;
157 static const size_t max_demangled_size = 32;
158 static constexpr
const char*
spec =
"%a";
164 struct float_data<
long double>
166 #if defined(__mips__) && defined(__mips_n64) || defined(__aarch64__) || \
168 static const size_t mangled_size = 32;
169 #elif defined(__arm__) || defined(__mips__) || defined(__hexagon__)
170 static const size_t mangled_size = 16;
172 static const size_t mangled_size = 20;
174 static const size_t max_demangled_size = 40;
175 static constexpr
const char*
spec =
"%LaL";
180 template <
class Float,
class C>
182 parse_floating_number(
const char*
first,
const char* last,
C& db)
184 const size_t N = float_data<Float>::mangled_size;
185 if (
static_cast<std::size_t
>(last -
first) >
N)
193 const char* t =
first;
195 for (; t != last; ++t, ++e)
199 unsigned d1 = isdigit(*t) ?
static_cast<unsigned>(*t -
'0') :
200 static_cast<unsigned>(*t -
'a' + 10);
202 unsigned d0 = isdigit(*t) ?
static_cast<unsigned>(*t -
'0') :
203 static_cast<unsigned>(*t -
'a' + 10);
204 *e =
static_cast<char>((d1 << 4) + d0);
208 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
211 char num[float_data<Float>::max_demangled_size] = {0};
213 if (
static_cast<std::size_t
>(
n) >=
sizeof(
num))
215 db.names.push_back(
typename C::String(
num,
static_cast<std::size_t
>(
n)));
226 parse_source_name(
const char*
first,
const char* last,
C& db)
231 if (isdigit(c) &&
first+1 != last)
233 const char* t =
first+1;
234 size_t n =
static_cast<size_t>(c -
'0');
235 for (c = *t; isdigit(c); c = *t)
237 n =
n * 10 +
static_cast<size_t>(c -
'0');
241 if (
static_cast<size_t>(last - t) >=
n)
243 typename C::String
r(t,
n);
244 if (
r.substr(0, 10) ==
"_GLOBAL__N")
245 db.names.push_back(
"(anonymous namespace)");
268 parse_substitution(
const char*
first,
const char* last,
C& db)
270 if (last -
first >= 2)
277 db.names.push_back(
"std::allocator");
281 db.names.push_back(
"std::basic_string");
285 db.names.push_back(
"std::string");
289 db.names.push_back(
"std::istream");
293 db.names.push_back(
"std::ostream");
297 db.names.push_back(
"std::iostream");
301 if (!db.subs.empty())
303 for (
const auto&
n : db.subs.front())
304 db.names.push_back(
n);
309 if (std::isdigit(
first[1]) || std::isupper(
first[1]))
312 const char* t =
first+1;
313 if (std::isdigit(*t))
314 sub =
static_cast<size_t>(*t -
'0');
316 sub =
static_cast<size_t>(*t -
'A') + 10;
317 for (++t; t != last && (std::isdigit(*t) || std::isupper(*t)); ++t)
320 if (std::isdigit(*t))
321 sub +=
static_cast<size_t>(*t -
'0');
323 sub +=
static_cast<size_t>(*t -
'A') + 10;
325 if (t == last || *t !=
'_')
328 if (sub < db.subs.size())
330 for (
const auto&
n : db.subs[sub])
331 db.names.push_back(
n);
376 parse_builtin_type(
const char*
first,
const char* last,
C& db)
383 db.names.push_back(
"void");
387 db.names.push_back(
"wchar_t");
391 db.names.push_back(
"bool");
395 db.names.push_back(
"char");
399 db.names.push_back(
"signed char");
403 db.names.push_back(
"unsigned char");
407 db.names.push_back(
"short");
411 db.names.push_back(
"unsigned short");
415 db.names.push_back(
"int");
419 db.names.push_back(
"unsigned int");
423 db.names.push_back(
"long");
427 db.names.push_back(
"unsigned long");
431 db.names.push_back(
"long long");
435 db.names.push_back(
"unsigned long long");
439 db.names.push_back(
"__int128");
443 db.names.push_back(
"unsigned __int128");
447 db.names.push_back(
"float");
451 db.names.push_back(
"double");
455 db.names.push_back(
"long double");
459 db.names.push_back(
"__float128");
463 db.names.push_back(
"...");
468 const char*t = parse_source_name(
first+1, last, db);
479 db.names.push_back(
"decimal64");
483 db.names.push_back(
"decimal128");
487 db.names.push_back(
"decimal32");
491 db.names.push_back(
"decimal16");
495 db.names.push_back(
"char32_t");
499 db.names.push_back(
"char16_t");
503 db.names.push_back(
"auto");
507 db.names.push_back(
"decltype(auto)");
511 db.names.push_back(
"std::nullptr_t");
525 parse_cv_qualifiers(
const char*
first,
const char* last,
unsigned&
cv)
554 parse_template_param(
const char*
first,
const char* last,
C& db)
556 if (last -
first >= 2)
562 if (db.template_param.empty())
564 if (!db.template_param.back().empty())
566 for (
auto& t : db.template_param.back().front())
567 db.names.push_back(t);
572 db.names.push_back(
"T_");
574 db.fix_forward_references =
true;
577 else if (isdigit(
first[1]))
579 const char* t =
first+1;
580 size_t sub =
static_cast<size_t>(*t -
'0');
581 for (++t; t != last && isdigit(*t); ++t)
584 sub +=
static_cast<size_t>(*t -
'0');
586 if (t == last || *t !=
'_' || db.template_param.empty())
589 if (sub < db.template_param.back().size())
591 for (
auto&
temp : db.template_param.back()[sub])
592 db.names.push_back(
temp);
597 db.names.push_back(
typename C::String(
first, t+1));
599 db.fix_forward_references =
true;
611 parse_const_cast_expr(
const char*
first,
const char* last,
C& db)
615 const char* t = parse_type(
first+2, last, db);
618 const char*
t1 = parse_expression(t, last, db);
621 if (db.names.size() < 2)
623 auto expr = db.names.back().move_full();
625 db.names.back() =
"const_cast<" + db.names.back().move_full() +
">(" + expr +
")";
637 parse_dynamic_cast_expr(
const char*
first,
const char* last,
C& db)
641 const char* t = parse_type(
first+2, last, db);
644 const char*
t1 = parse_expression(t, last, db);
647 if (db.names.size() < 2)
649 auto expr = db.names.back().move_full();
651 db.names.back() =
"dynamic_cast<" + db.names.back().move_full() +
">(" + expr +
")";
663 parse_reinterpret_cast_expr(
const char*
first,
const char* last,
C& db)
667 const char* t = parse_type(
first+2, last, db);
670 const char*
t1 = parse_expression(t, last, db);
673 if (db.names.size() < 2)
675 auto expr = db.names.back().move_full();
677 db.names.back() =
"reinterpret_cast<" + db.names.back().move_full() +
">(" + expr +
")";
689 parse_static_cast_expr(
const char*
first,
const char* last,
C& db)
693 const char* t = parse_type(
first+2, last, db);
696 const char*
t1 = parse_expression(t, last, db);
699 if (db.names.size() < 2)
701 auto expr = db.names.back().move_full();
703 db.names.back() =
"static_cast<" + db.names.back().move_full() +
">(" + expr +
")";
715 parse_pack_expansion(
const char*
first,
const char* last,
C& db)
719 const char* t = parse_expression(
first+2, last, db);
730 parse_sizeof_type_expr(
const char*
first,
const char* last,
C& db)
734 const char* t = parse_type(
first+2, last, db);
737 if (db.names.empty())
739 db.names.back() =
"sizeof (" + db.names.back().move_full() +
")";
750 parse_sizeof_expr_expr(
const char*
first,
const char* last,
C& db)
754 const char* t = parse_expression(
first+2, last, db);
757 if (db.names.empty())
759 db.names.back() =
"sizeof (" + db.names.back().move_full() +
")";
770 parse_sizeof_param_pack_expr(
const char*
first,
const char* last,
C& db)
774 size_t k0 = db.names.size();
775 const char* t = parse_template_param(
first+2, last, db);
776 size_t k1 = db.names.size();
779 typename C::String
tmp(
"sizeof...(");
783 tmp += db.names[
k].move_full();
784 for (++
k;
k !=
k1; ++
k)
785 tmp +=
", " + db.names[
k].move_full();
804 parse_function_param(
const char*
first,
const char* last,
C& db)
811 const char* t = parse_cv_qualifiers(
first+2, last,
cv);
813 if (
t1 != last && *
t1 ==
'_')
815 db.names.push_back(
"fp" +
typename C::String(t,
t1));
819 else if (
first[1] ==
'L')
823 if (
t0 != last && *
t0 ==
'p')
826 const char* t = parse_cv_qualifiers(
t0, last,
cv);
828 if (
t1 != last && *
t1 ==
'_')
830 db.names.push_back(
"fp" +
typename C::String(t,
t1));
843 parse_sizeof_function_param_pack_expr(
const char*
first,
const char* last,
C& db)
847 const char* t = parse_function_param(
first+2, last, db);
850 if (db.names.empty())
852 db.names.back() =
"sizeof...(" + db.names.back().move_full() +
")";
864 parse_typeid_expr(
const char*
first,
const char* last,
C& db)
870 t = parse_expression(
first+2, last, db);
872 t = parse_type(
first+2, last, db);
875 if (db.names.empty())
877 db.names.back() =
"typeid(" + db.names.back().move_full() +
")";
888 parse_throw_expr(
const char*
first,
const char* last,
C& db)
892 const char* t = parse_expression(
first+2, last, db);
895 if (db.names.empty())
897 db.names.back() =
"throw " + db.names.back().move_full();
908 parse_dot_star_expr(
const char*
first,
const char* last,
C& db)
912 const char* t = parse_expression(
first+2, last, db);
915 const char*
t1 = parse_expression(t, last, db);
918 if (db.names.size() < 2)
920 auto expr = db.names.back().move_full();
922 db.names.back().first +=
".*" + expr;
934 parse_simple_id(
const char*
first,
const char* last,
C& db)
938 const char* t = parse_source_name(
first, last, db);
941 const char*
t1 = parse_template_args(t, last, db);
944 if (db.names.size() < 2)
946 auto args = db.names.back().move_full();
964 parse_unresolved_type(
const char*
first,
const char* last,
C& db)
968 const char* t =
first;
973 size_t k0 = db.names.size();
974 t = parse_template_param(
first, last, db);
975 size_t k1 = db.names.size();
978 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
989 t = parse_decltype(
first, last, db);
992 if (db.names.empty())
994 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
999 t = parse_substitution(
first, last, db);
1006 t = parse_unqualified_name(
first+2, last, db);
1009 if (db.names.empty())
1011 db.names.back().first.insert(0,
"std::");
1012 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1028 parse_destructor_name(
const char*
first,
const char* last,
C& db)
1032 const char* t = parse_unresolved_type(
first, last, db);
1034 t = parse_simple_id(
first, last, db);
1037 if (db.names.empty())
1039 db.names.back().first.insert(0,
"~");
1056 parse_base_unresolved_name(
const char*
first,
const char* last,
C& db)
1058 if (last -
first >= 2)
1062 if (
first[0] ==
'o')
1064 const char* t = parse_operator_name(
first+2, last, db);
1067 first = parse_template_args(t, last, db);
1070 if (db.names.size() < 2)
1072 auto args = db.names.back().move_full();
1073 db.names.pop_back();
1080 const char* t = parse_destructor_name(
first+2, last, db);
1087 const char* t = parse_simple_id(
first, last, db);
1090 t = parse_operator_name(
first, last, db);
1093 first = parse_template_args(t, last, db);
1096 if (db.names.size() < 2)
1098 auto args = db.names.back().move_full();
1099 db.names.pop_back();
1115 parse_unresolved_qualifier_level(
const char*
first,
const char* last,
C& db)
1117 return parse_simple_id(
first, last, db);
1132 parse_unresolved_name(
const char*
first,
const char* last,
C& db)
1134 if (last -
first > 2)
1136 const char* t =
first;
1137 bool global =
false;
1138 if (t[0] ==
'g' && t[1] ==
's')
1143 const char* t2 = parse_base_unresolved_name(t, last, db);
1148 if (db.names.empty())
1150 db.names.back().first.insert(0,
"::");
1154 else if (last - t > 2 && t[0] ==
's' && t[1] ==
'r')
1159 const char*
t1 = parse_unresolved_type(t, last, db);
1160 if (
t1 == t ||
t1 == last)
1163 t1 = parse_template_args(t, last, db);
1166 if (db.names.size() < 2)
1168 auto args = db.names.back().move_full();
1169 db.names.pop_back();
1174 db.names.pop_back();
1180 t1 = parse_unresolved_qualifier_level(t, last, db);
1181 if (
t1 == t ||
t1 == last || db.names.size() < 2)
1183 auto s = db.names.back().move_full();
1184 db.names.pop_back();
1185 db.names.back().first +=
"::" +
std::move(s);
1189 t1 = parse_base_unresolved_name(t, last, db);
1192 if (!db.names.empty())
1193 db.names.pop_back();
1196 if (db.names.size() < 2)
1198 auto s = db.names.back().move_full();
1199 db.names.pop_back();
1200 db.names.back().first +=
"::" +
std::move(s);
1206 const char*
t1 = parse_unresolved_type(t, last, db);
1210 t1 = parse_template_args(t, last, db);
1213 if (db.names.size() < 2)
1215 auto args = db.names.back().move_full();
1216 db.names.pop_back();
1220 t1 = parse_base_unresolved_name(t, last, db);
1223 if (!db.names.empty())
1224 db.names.pop_back();
1227 if (db.names.size() < 2)
1229 auto s = db.names.back().move_full();
1230 db.names.pop_back();
1231 db.names.back().first +=
"::" +
std::move(s);
1236 t1 = parse_unresolved_qualifier_level(t, last, db);
1237 if (
t1 == t ||
t1 == last)
1242 if (db.names.empty())
1244 db.names.back().first.insert(0,
"::");
1248 t1 = parse_unresolved_qualifier_level(t, last, db);
1249 if (
t1 == t ||
t1 == last || db.names.size() < 2)
1251 auto s = db.names.back().move_full();
1252 db.names.pop_back();
1253 db.names.back().first +=
"::" +
std::move(s);
1257 t1 = parse_base_unresolved_name(t, last, db);
1260 if (!db.names.empty())
1261 db.names.pop_back();
1264 if (db.names.size() < 2)
1266 auto s = db.names.back().move_full();
1267 db.names.pop_back();
1268 db.names.back().first +=
"::" +
std::move(s);
1281 parse_dot_expr(
const char*
first,
const char* last,
C& db)
1285 const char* t = parse_expression(
first+2, last, db);
1288 const char*
t1 = parse_unresolved_name(t, last, db);
1291 if (db.names.size() < 2)
1293 auto name = db.names.back().move_full();
1294 db.names.pop_back();
1295 db.names.back().first +=
"." +
name;
1307 parse_call_expr(
const char*
first,
const char* last,
C& db)
1311 const char* t = parse_expression(
first+2, last, db);
1316 if (db.names.empty())
1318 db.names.back().first += db.names.back().second;
1319 db.names.back().second =
typename C::String();
1320 db.names.back().first.append(
"(");
1321 bool first_expr =
true;
1324 const char*
t1 = parse_expression(t, last, db);
1325 if (
t1 == t ||
t1 == last)
1327 if (db.names.empty())
1329 auto tmp = db.names.back().move_full();
1330 db.names.pop_back();
1333 if (db.names.empty())
1337 db.names.back().first.append(
", ");
1340 db.names.back().first.append(
tmp);
1345 if (db.names.empty())
1347 db.names.back().first.append(
")");
1362 parse_new_expr(
const char*
first,
const char* last,
C& db)
1364 if (last -
first >= 4)
1366 const char* t =
first;
1367 bool parsed_gs =
false;
1368 if (t[0] ==
'g' && t[1] ==
's')
1373 if (t[0] ==
'n' && (t[1] ==
'w' || t[1] ==
'a'))
1375 bool is_array = t[1] ==
'a';
1379 bool has_expr_list =
false;
1380 bool first_expr =
true;
1383 const char*
t1 = parse_expression(t, last, db);
1384 if (
t1 == t ||
t1 == last)
1386 has_expr_list =
true;
1389 if (db.names.empty())
1391 auto tmp = db.names.back().move_full();
1392 db.names.pop_back();
1395 if (db.names.empty())
1397 db.names.back().first.append(
", ");
1398 db.names.back().first.append(
tmp);
1405 const char*
t1 = parse_type(t, last, db);
1406 if (
t1 == t ||
t1 == last)
1409 bool has_init =
false;
1410 if (last - t >= 3 && t[0] ==
'p' && t[1] ==
'i')
1417 t1 = parse_expression(t, last, db);
1418 if (
t1 == t ||
t1 == last)
1422 if (db.names.empty())
1424 auto tmp = db.names.back().move_full();
1425 db.names.pop_back();
1428 if (db.names.empty())
1430 db.names.back().first.append(
", ");
1431 db.names.back().first.append(
tmp);
1440 typename C::String init_list;
1443 if (db.names.empty())
1445 init_list = db.names.back().move_full();
1446 db.names.pop_back();
1448 if (db.names.empty())
1450 auto type = db.names.back().move_full();
1451 db.names.pop_back();
1452 typename C::String expr_list;
1455 if (db.names.empty())
1457 expr_list = db.names.back().move_full();
1458 db.names.pop_back();
1460 typename C::String
r;
1468 r +=
"(" + expr_list +
") ";
1471 r +=
" (" + init_list +
")";
1484 parse_conversion_expr(
const char*
first,
const char* last,
C& db)
1489 db.try_to_parse_template_args =
false;
1490 const char* t = parse_type(
first+2, last, db);
1492 if (t !=
first+2 && t != last)
1496 const char*
t1 = parse_expression(t, last, db);
1507 db.names.emplace_back();
1510 bool first_expr =
true;
1513 const char*
t1 = parse_expression(t, last, db);
1514 if (
t1 == t ||
t1 == last)
1518 if (db.names.empty())
1520 auto tmp = db.names.back().move_full();
1521 db.names.pop_back();
1524 if (db.names.empty())
1526 db.names.back().first.append(
", ");
1527 db.names.back().first.append(
tmp);
1536 if (db.names.size() < 2)
1538 auto tmp = db.names.back().move_full();
1539 db.names.pop_back();
1540 db.names.back() =
"(" + db.names.back().move_full() +
")(" +
tmp +
")";
1551 parse_arrow_expr(
const char*
first,
const char* last,
C& db)
1555 const char* t = parse_expression(
first+2, last, db);
1558 const char*
t1 = parse_expression(t, last, db);
1561 if (db.names.size() < 2)
1563 auto tmp = db.names.back().move_full();
1564 db.names.pop_back();
1565 db.names.back().first +=
"->";
1566 db.names.back().first +=
tmp;
1581 parse_function_type(
const char*
first,
const char* last,
C& db)
1585 const char* t =
first+1;
1594 const char*
t1 = parse_type(t, last, db);
1598 typename C::String sig(
"(");
1604 db.names.pop_back();
1617 if (*t ==
'R' && t+1 != last && t[1] ==
'E')
1623 if (*t ==
'O' && t+1 != last && t[1] ==
'E')
1629 size_t k0 = db.names.size();
1630 t1 = parse_type(t, last, db);
1631 size_t k1 = db.names.size();
1632 if (
t1 == t ||
t1 == last)
1634 for (
size_t k =
k0;
k <
k1; ++
k)
1638 sig += db.names[
k].move_full();
1640 for (
size_t k =
k0;
k <
k1; ++
k)
1641 db.names.pop_back();
1654 if (db.names.empty())
1656 db.names.back().first +=
" ";
1657 db.names.back().second.insert(0, sig);
1669 parse_pointer_to_member_type(
const char*
first,
const char* last,
C& db)
1673 const char* t = parse_type(
first+1, last, db);
1676 const char* t2 = parse_type(t, last, db);
1679 if (db.names.size() < 2)
1682 db.names.pop_back();
1683 auto class_type =
std::move(db.names.back());
1684 if (!
func.second.empty() &&
func.second.front() ==
'(')
1686 db.names.back().first =
std::move(
func.first) +
"(" + class_type.move_full() +
"::*";
1691 db.names.back().first =
std::move(
func.first) +
" " + class_type.move_full() +
"::*";
1706 parse_array_type(
const char*
first,
const char* last,
C& db)
1710 if (
first[1] ==
'_')
1712 const char* t = parse_type(
first+2, last, db);
1715 if (db.names.empty())
1717 if (db.names.back().second.substr(0, 2) ==
" [")
1718 db.names.back().second.erase(0, 1);
1719 db.names.back().second.insert(0,
" []");
1726 if (t != last && *t ==
'_')
1728 const char* t2 = parse_type(t+1, last, db);
1731 if (db.names.empty())
1733 if (db.names.back().second.substr(0, 2) ==
" [")
1734 db.names.back().second.erase(0, 1);
1735 db.names.back().second.insert(0,
" [" +
typename C::String(
first+1, t) +
"]");
1742 const char* t = parse_expression(
first+1, last, db);
1743 if (t !=
first+1 && t != last && *t ==
'_')
1745 const char* t2 = parse_type(++t, last, db);
1748 if (db.names.size() < 2)
1751 db.names.pop_back();
1754 if (
type.second.substr(0, 2) ==
" [")
1755 type.second.erase(0, 1);
1756 db.names.back().second =
" [" + expr.move_full() +
"]" +
std::move(
type.second);
1770 parse_decltype(
const char*
first,
const char* last,
C& db)
1779 const char* t = parse_expression(
first+2, last, db);
1780 if (t !=
first+2 && t != last && *t ==
'E')
1782 if (db.names.empty())
1784 db.names.back() =
"decltype(" + db.names.back().move_full() +
")";
1803 parse_vector_type(
const char*
first,
const char* last,
C& db)
1810 if (t == last || *t !=
'_')
1813 size_t sz =
static_cast<size_t>(t -
num);
1818 const char*
t1 = parse_type(t, last, db);
1821 if (db.names.empty())
1823 db.names.back().first +=
" vector[" +
typename C::String(
num, sz) +
"]";
1830 db.names.push_back(
"pixel vector[" +
typename C::String(
num, sz) +
"]");
1837 typename C::String
num;
1841 const char* t = parse_expression(
t1, last, db);
1844 if (db.names.empty())
1846 num = db.names.back().move_full();
1847 db.names.pop_back();
1851 if (
t1 != last && *
t1 ==
'_' && ++
t1 != last)
1853 const char* t = parse_type(
t1, last, db);
1856 if (db.names.empty())
1858 db.names.back().first +=
" vector[" +
num +
"]";
1892 parse_type(
const char*
first,
const char* last,
C& db)
1903 const char* t = parse_cv_qualifiers(
first, last,
cv);
1906 bool is_function = *t ==
'F';
1907 size_t k0 = db.names.size();
1908 const char*
t1 = parse_type(t, last, db);
1909 size_t k1 = db.names.size();
1914 db.subs.emplace_back(db.names.get_allocator());
1915 for (
size_t k =
k0;
k <
k1; ++
k)
1919 size_t p = db.names[
k].second.size();
1920 if (db.names[
k].second[p-2] ==
'&')
1922 else if (db.names[
k].second.back() ==
'&')
1926 db.names[
k].second.insert(p,
" const");
1931 db.names[
k].second.insert(p,
" volatile");
1935 db.names[
k].second.insert(p,
" restrict");
1940 db.names[
k].first.append(
" const");
1942 db.names[
k].first.append(
" volatile");
1944 db.names[
k].first.append(
" restrict");
1946 db.subs.back().push_back(db.names[
k]);
1955 const char* t = parse_builtin_type(
first, last, db);
1965 t = parse_array_type(
first, last, db);
1968 if (db.names.empty())
1971 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1975 t = parse_type(
first+1, last, db);
1978 if (db.names.empty())
1980 db.names.back().first.append(
" complex");
1982 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1986 t = parse_function_type(
first, last, db);
1989 if (db.names.empty())
1992 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
1996 t = parse_type(
first+1, last, db);
1999 if (db.names.empty())
2001 db.names.back().first.append(
" imaginary");
2003 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2007 t = parse_pointer_to_member_type(
first, last, db);
2010 if (db.names.empty())
2013 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2018 size_t k0 = db.names.size();
2019 t = parse_type(
first+1, last, db);
2020 size_t k1 = db.names.size();
2023 db.subs.emplace_back(db.names.get_allocator());
2024 for (
size_t k =
k0;
k <
k1; ++
k)
2026 if (db.names[
k].second.substr(0, 2) ==
" [")
2028 db.names[
k].first +=
" (";
2029 db.names[
k].second.insert(0,
")");
2031 else if (!db.names[
k].second.empty() &&
2032 db.names[
k].second.front() ==
'(')
2034 db.names[
k].first +=
"(";
2035 db.names[
k].second.insert(0,
")");
2037 db.names[
k].first.append(
"&&");
2038 db.subs.back().push_back(db.names[
k]);
2046 size_t k0 = db.names.size();
2047 t = parse_type(
first+1, last, db);
2048 size_t k1 = db.names.size();
2051 db.subs.emplace_back(db.names.get_allocator());
2052 for (
size_t k =
k0;
k <
k1; ++
k)
2054 if (db.names[
k].second.substr(0, 2) ==
" [")
2056 db.names[
k].first +=
" (";
2057 db.names[
k].second.insert(0,
")");
2059 else if (!db.names[
k].second.empty() &&
2060 db.names[
k].second.front() ==
'(')
2062 db.names[
k].first +=
"(";
2063 db.names[
k].second.insert(0,
")");
2065 if (
first[1] !=
'U' || db.names[
k].first.substr(0, 12) !=
"objc_object<")
2067 db.names[
k].first.append(
"*");
2071 db.names[
k].first.replace(0, 11,
"id");
2073 db.subs.back().push_back(db.names[
k]);
2081 size_t k0 = db.names.size();
2082 t = parse_type(
first+1, last, db);
2083 size_t k1 = db.names.size();
2086 db.subs.emplace_back(db.names.get_allocator());
2087 for (
size_t k =
k0;
k <
k1; ++
k)
2089 if (db.names[
k].second.substr(0, 2) ==
" [")
2091 db.names[
k].first +=
" (";
2092 db.names[
k].second.insert(0,
")");
2094 else if (!db.names[
k].second.empty() &&
2095 db.names[
k].second.front() ==
'(')
2097 db.names[
k].first +=
"(";
2098 db.names[
k].second.insert(0,
")");
2100 db.names[
k].first.append(
"&");
2101 db.subs.back().push_back(db.names[
k]);
2109 size_t k0 = db.names.size();
2110 t = parse_template_param(
first, last, db);
2111 size_t k1 = db.names.size();
2114 db.subs.emplace_back(db.names.get_allocator());
2115 for (
size_t k =
k0;
k <
k1; ++
k)
2116 db.subs.back().push_back(db.names[
k]);
2117 if (db.try_to_parse_template_args &&
k1 ==
k0+1)
2119 const char*
t1 = parse_template_args(t, last, db);
2122 auto args = db.names.back().move_full();
2123 db.names.pop_back();
2125 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2134 if (
first+1 != last)
2136 t = parse_source_name(
first+1, last, db);
2139 const char* t2 = parse_type(t, last, db);
2142 if (db.names.size() < 2)
2144 auto type = db.names.back().move_full();
2145 db.names.pop_back();
2146 if (db.names.back().first.substr(0, 9) !=
"objcproto")
2148 db.names.back() =
type +
" " + db.names.back().move_full();
2152 auto proto = db.names.back().move_full();
2153 db.names.pop_back();
2154 t = parse_source_name(proto.data() + 9, proto.data() + proto.size(), db);
2155 if (t != proto.data() + 9)
2157 db.names.back() =
type +
"<" + db.names.back().move_full() +
">";
2161 db.names.push_back(
type +
" " + proto);
2164 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2176 if (db.names.empty())
2178 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2184 t = parse_substitution(
first, last, db);
2190 t = parse_template_args(
first, last, db);
2193 if (db.names.size() < 2)
2195 auto template_args = db.names.back().move_full();
2196 db.names.pop_back();
2197 db.names.back().first += template_args;
2199 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2206 if (
first+1 != last)
2212 size_t k0 = db.names.size();
2213 t = parse_type(
first+2, last, db);
2214 size_t k1 = db.names.size();
2217 db.subs.emplace_back(db.names.get_allocator());
2218 for (
size_t k =
k0;
k <
k1; ++
k)
2219 db.subs.back().push_back(db.names[
k]);
2227 t = parse_decltype(
first, last, db);
2230 if (db.names.empty())
2232 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2238 t = parse_vector_type(
first, last, db);
2241 if (db.names.empty())
2243 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2254 t = parse_builtin_type(
first, last, db);
2264 if (db.names.empty())
2266 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
2334 parse_operator_name(
const char*
first,
const char* last,
C& db)
2336 if (last -
first >= 2)
2344 db.names.push_back(
"operator&&");
2349 db.names.push_back(
"operator&");
2353 db.names.push_back(
"operator&=");
2357 db.names.push_back(
"operator=");
2366 db.names.push_back(
"operator()");
2370 db.names.push_back(
"operator,");
2374 db.names.push_back(
"operator~");
2380 db.try_to_parse_template_args =
false;
2381 const char* t = parse_type(
first+2, last, db);
2385 if (db.names.empty())
2387 db.names.back().first.insert(0,
"operator ");
2388 db.parsed_ctor_dtor_cv =
true;
2399 db.names.push_back(
"operator delete[]");
2403 db.names.push_back(
"operator*");
2407 db.names.push_back(
"operator delete");
2411 db.names.push_back(
"operator/");
2415 db.names.push_back(
"operator/=");
2424 db.names.push_back(
"operator^");
2428 db.names.push_back(
"operator^=");
2432 db.names.push_back(
"operator==");
2441 db.names.push_back(
"operator>=");
2445 db.names.push_back(
"operator>");
2451 if (
first[1] ==
'x')
2453 db.names.push_back(
"operator[]");
2461 db.names.push_back(
"operator<=");
2466 const char* t = parse_source_name(
first+2, last, db);
2469 if (db.names.empty())
2471 db.names.back().first.insert(0,
"operator\"\" ");
2477 db.names.push_back(
"operator<<");
2481 db.names.push_back(
"operator<<=");
2485 db.names.push_back(
"operator<");
2494 db.names.push_back(
"operator-");
2498 db.names.push_back(
"operator-=");
2502 db.names.push_back(
"operator*");
2506 db.names.push_back(
"operator*=");
2510 db.names.push_back(
"operator--");
2519 db.names.push_back(
"operator new[]");
2523 db.names.push_back(
"operator!=");
2527 db.names.push_back(
"operator-");
2531 db.names.push_back(
"operator!");
2535 db.names.push_back(
"operator new");
2544 db.names.push_back(
"operator||");
2548 db.names.push_back(
"operator|");
2552 db.names.push_back(
"operator|=");
2561 db.names.push_back(
"operator->*");
2565 db.names.push_back(
"operator+");
2569 db.names.push_back(
"operator+=");
2573 db.names.push_back(
"operator++");
2577 db.names.push_back(
"operator+");
2581 db.names.push_back(
"operator->");
2587 if (
first[1] ==
'u')
2589 db.names.push_back(
"operator?");
2597 db.names.push_back(
"operator%");
2601 db.names.push_back(
"operator%=");
2605 db.names.push_back(
"operator>>");
2609 db.names.push_back(
"operator>>=");
2615 if (std::isdigit(
first[1]))
2617 const char* t = parse_source_name(
first+2, last, db);
2620 if (db.names.empty())
2622 db.names.back().first.insert(0,
"operator ");
2634 parse_integer_literal(
const char*
first,
const char* last,
const typename C::String& lit,
C& db)
2637 if (t !=
first && t != last && *t ==
'E')
2640 db.names.push_back(
"(" + lit +
")");
2642 db.names.emplace_back();
2645 db.names.back().first +=
'-';
2648 db.names.back().first.append(
first, t);
2649 if (lit.size() <= 3)
2650 db.names.back().first += lit;
2665 parse_expr_primary(
const char*
first,
const char* last,
C& db)
2673 const char* t = parse_integer_literal(
first+2, last,
"wchar_t", db);
2679 if (
first[3] ==
'E')
2684 db.names.push_back(
"false");
2688 db.names.push_back(
"true");
2696 const char* t = parse_integer_literal(
first+2, last,
"char", db);
2703 const char* t = parse_integer_literal(
first+2, last,
"signed char", db);
2710 const char* t = parse_integer_literal(
first+2, last,
"unsigned char", db);
2717 const char* t = parse_integer_literal(
first+2, last,
"short", db);
2724 const char* t = parse_integer_literal(
first+2, last,
"unsigned short", db);
2731 const char* t = parse_integer_literal(
first+2, last,
"", db);
2738 const char* t = parse_integer_literal(
first+2, last,
"u", db);
2745 const char* t = parse_integer_literal(
first+2, last,
"l", db);
2752 const char* t = parse_integer_literal(
first+2, last,
"ul", db);
2759 const char* t = parse_integer_literal(
first+2, last,
"ll", db);
2766 const char* t = parse_integer_literal(
first+2, last,
"ull", db);
2773 const char* t = parse_integer_literal(
first+2, last,
"__int128", db);
2780 const char* t = parse_integer_literal(
first+2, last,
"unsigned __int128", db);
2787 const char* t = parse_floating_number<float>(
first+2, last, db);
2794 const char* t = parse_floating_number<double>(
first+2, last, db);
2801 const char* t = parse_floating_number<long double>(
first+2, last, db);
2807 if (
first[2] ==
'Z')
2809 const char* t = parse_encoding(
first+3, last, db);
2810 if (t !=
first+3 && t != last && *t ==
'E')
2821 const char* t = parse_type(
first+1, last, db);
2822 if (t !=
first+1 && t != last)
2827 for (;
n != last && isdigit(*
n); ++
n)
2829 if (
n != t &&
n != last && *
n ==
'E')
2831 if (db.names.empty())
2833 db.names.back() =
"(" + db.names.back().move_full() +
")" +
typename C::String(t,
n);
2850 template <
class String>
2852 base_name(String& s)
2856 if (s ==
"std::string")
2858 s =
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >";
2859 return "basic_string";
2861 if (s ==
"std::istream")
2863 s =
"std::basic_istream<char, std::char_traits<char> >";
2864 return "basic_istream";
2866 if (s ==
"std::ostream")
2868 s =
"std::basic_ostream<char, std::char_traits<char> >";
2869 return "basic_ostream";
2871 if (s ==
"std::iostream")
2873 s =
"std::basic_iostream<char, std::char_traits<char> >";
2874 return "basic_iostream";
2876 const char*
const pf = s.data();
2877 const char* pe = pf + s.size();
2893 else if (pe[-1] ==
'>')
2897 const char* p0 = pe - 1;
2898 for (; p0 != pf; --p0)
2906 return String(p0, pe);
2920 parse_ctor_dtor_name(
const char*
first,
const char* last,
C& db)
2922 if (last-
first >= 2 && !db.names.empty())
2933 if (db.names.empty())
2935 db.names.push_back(base_name(db.names.back().first));
2937 db.parsed_ctor_dtor_cv =
true;
2948 if (db.names.empty())
2950 db.names.push_back(
"~" + base_name(db.names.back().first));
2952 db.parsed_ctor_dtor_cv =
true;
2970 parse_unnamed_type_name(
const char*
first,
const char* last,
C& db)
2979 db.names.push_back(
typename C::String(
"'unnamed"));
2983 db.names.pop_back();
2986 if (std::isdigit(*
t0))
2988 const char*
t1 =
t0 + 1;
2989 while (
t1 != last && std::isdigit(*
t1))
2991 db.names.back().first.append(
t0,
t1);
2994 db.names.back().first.push_back(
'\'');
2995 if (
t0 == last || *
t0 !=
'_')
2997 db.names.pop_back();
3005 db.names.push_back(
typename C::String(
"'lambda'("));
3007 if (
first[2] ==
'v')
3009 db.names.back().first +=
')';
3014 const char*
t1 = parse_type(
t0, last, db);
3017 db.names.pop_back();
3020 if (db.names.size() < 2)
3022 auto tmp = db.names.back().move_full();
3023 db.names.pop_back();
3024 db.names.back().first.append(
tmp);
3028 t1 = parse_type(
t0, last, db);
3031 if (db.names.size() < 2)
3033 tmp = db.names.back().move_full();
3034 db.names.pop_back();
3037 db.names.back().first.append(
", ");
3038 db.names.back().first.append(
tmp);
3042 db.names.back().first.append(
")");
3044 if (
t0 == last || *
t0 !=
'E')
3046 db.names.pop_back();
3052 db.names.pop_back();
3055 if (std::isdigit(*
t0))
3057 const char*
t1 =
t0 + 1;
3058 while (
t1 != last && std::isdigit(*
t1))
3060 db.names.back().first.insert(db.names.back().first.begin()+7,
t0,
t1);
3063 if (
t0 == last || *
t0 !=
'_')
3065 db.names.pop_back();
3083 parse_unqualified_name(
const char*
first,
const char* last,
C& db)
3092 t = parse_ctor_dtor_name(
first, last, db);
3097 t = parse_unnamed_type_name(
first, last, db);
3110 t = parse_source_name(
first, last, db);
3115 t = parse_operator_name(
first, last, db);
3130 parse_unscoped_name(
const char*
first,
const char* last,
C& db)
3132 if (last -
first >= 2)
3140 if (
t0 != last && *
t0 ==
'L')
3143 const char*
t1 = parse_unqualified_name(
t0, last, db);
3148 if (db.names.empty())
3150 db.names.back().first.insert(0,
"std::");
3162 parse_alignof_type(
const char*
first,
const char* last,
C& db)
3166 const char* t = parse_type(
first+2, last, db);
3169 if (db.names.empty())
3171 db.names.back().first =
"alignof (" + db.names.back().move_full() +
")";
3182 parse_alignof_expr(
const char*
first,
const char* last,
C& db)
3186 const char* t = parse_expression(
first+2, last, db);
3189 if (db.names.empty())
3191 db.names.back().first =
"alignof (" + db.names.back().move_full() +
")";
3200 parse_noexcept_expression(
const char*
first,
const char* last,
C& db)
3202 const char*
t1 = parse_expression(
first, last, db);
3205 if (db.names.empty())
3207 db.names.back().first =
"noexcept (" + db.names.back().move_full() +
")";
3215 parse_prefix_expression(
const char*
first,
const char* last,
const typename C::String&
op,
C& db)
3217 const char*
t1 = parse_expression(
first, last, db);
3220 if (db.names.empty())
3222 db.names.back().first =
op +
"(" + db.names.back().move_full() +
")";
3230 parse_binary_expression(
const char*
first,
const char* last,
const typename C::String&
op,
C& db)
3232 const char*
t1 = parse_expression(
first, last, db);
3235 const char* t2 = parse_expression(
t1, last, db);
3238 if (db.names.size() < 2)
3240 auto op2 = db.names.back().move_full();
3241 db.names.pop_back();
3242 auto op1 = db.names.back().move_full();
3243 auto&
nm = db.names.back().first;
3247 nm +=
"(" + op1 +
") " +
op +
" (" + op2 +
")";
3253 db.names.pop_back();
3300 parse_expression(
const char*
first,
const char* last,
C& db)
3302 if (last -
first >= 2)
3304 const char* t =
first;
3305 bool parsed_gs =
false;
3306 if (last -
first >= 4 && t[0] ==
'g' && t[1] ==
's')
3317 first = parse_template_param(
first, last, db);
3320 first = parse_function_param(
first, last, db);
3326 t = parse_binary_expression(
first+2, last,
"&&", db);
3331 t = parse_prefix_expression(
first+2, last,
"&", db);
3336 t = parse_binary_expression(
first+2, last,
"&", db);
3341 t = parse_binary_expression(
first+2, last,
"&=", db);
3346 t = parse_binary_expression(
first+2, last,
"=", db);
3362 first = parse_const_cast_expr(
first, last, db);
3368 t = parse_binary_expression(
first+2, last,
",", db);
3373 t = parse_prefix_expression(
first+2, last,
"~", db);
3378 first = parse_conversion_expr(
first, last, db);
3387 const char*
t1 = parse_expression(t+2, last, db);
3390 if (db.names.empty())
3392 db.names.back().first = (parsed_gs ?
typename C::String(
"::") :
typename C::String()) +
3393 "delete[] " + db.names.back().move_full();
3399 first = parse_dynamic_cast_expr(
first, last, db);
3402 t = parse_prefix_expression(
first+2, last,
"*", db);
3408 const char*
t1 = parse_expression(t+2, last, db);
3411 if (db.names.empty())
3413 db.names.back().first = (parsed_gs ?
typename C::String(
"::") :
typename C::String()) +
3414 "delete " + db.names.back().move_full();
3420 return parse_unresolved_name(
first, last, db);
3422 first = parse_dot_star_expr(
first, last, db);
3428 t = parse_binary_expression(
first+2, last,
"/", db);
3433 t = parse_binary_expression(
first+2, last,
"/=", db);
3443 t = parse_binary_expression(
first+2, last,
"^", db);
3448 t = parse_binary_expression(
first+2, last,
"^=", db);
3453 t = parse_binary_expression(
first+2, last,
"==", db);
3463 t = parse_binary_expression(
first+2, last,
">=", db);
3468 t = parse_binary_expression(
first+2, last,
">", db);
3477 const char*
t1 = parse_expression(
first+2, last, db);
3480 const char* t2 = parse_expression(
t1, last, db);
3483 if (db.names.size() < 2)
3485 auto op2 = db.names.back().move_full();
3486 db.names.pop_back();
3487 auto op1 = db.names.back().move_full();
3488 db.names.back() =
"(" + op1 +
")[" + op2 +
"]";
3492 db.names.pop_back();
3500 t = parse_binary_expression(
first+2, last,
"<=", db);
3505 t = parse_binary_expression(
first+2, last,
"<<", db);
3510 t = parse_binary_expression(
first+2, last,
"<<=", db);
3515 t = parse_binary_expression(
first+2, last,
"<", db);
3525 t = parse_binary_expression(
first+2, last,
"-", db);
3530 t = parse_binary_expression(
first+2, last,
"-=", db);
3535 t = parse_binary_expression(
first+2, last,
"*", db);
3540 t = parse_binary_expression(
first+2, last,
"*=", db);
3547 t = parse_prefix_expression(
first+3, last,
"--", db);
3553 const char*
t1 = parse_expression(
first+2, last, db);
3556 if (db.names.empty())
3558 db.names.back() =
"(" + db.names.back().move_full() +
")--";
3573 t = parse_binary_expression(
first+2, last,
"!=", db);
3578 t = parse_prefix_expression(
first+2, last,
"-", db);
3583 t = parse_prefix_expression(
first+2, last,
"!", db);
3588 t = parse_noexcept_expression(
first+2, last, db);
3598 return parse_unresolved_name(
first, last, db);
3600 t = parse_binary_expression(
first+2, last,
"||", db);
3605 t = parse_binary_expression(
first+2, last,
"|", db);
3610 t = parse_binary_expression(
first+2, last,
"|=", db);
3620 t = parse_binary_expression(
first+2, last,
"->*", db);
3625 t = parse_binary_expression(
first+2, last,
"+", db);
3630 t = parse_binary_expression(
first+2, last,
"+=", db);
3637 t = parse_prefix_expression(
first+3, last,
"++", db);
3643 const char*
t1 = parse_expression(
first+2, last, db);
3646 if (db.names.empty())
3648 db.names.back() =
"(" + db.names.back().move_full() +
")++";
3654 t = parse_prefix_expression(
first+2, last,
"+", db);
3666 const char*
t1 = parse_expression(
first+2, last, db);
3669 const char* t2 = parse_expression(
t1, last, db);
3672 const char* t3 = parse_expression(t2, last, db);
3675 if (db.names.size() < 3)
3677 auto op3 = db.names.back().move_full();
3678 db.names.pop_back();
3679 auto op2 = db.names.back().move_full();
3680 db.names.pop_back();
3681 auto op1 = db.names.back().move_full();
3682 db.names.back() =
"(" + op1 +
") ? (" + op2 +
") : (" + op3 +
")";
3687 db.names.pop_back();
3688 db.names.pop_back();
3692 db.names.pop_back();
3700 first = parse_reinterpret_cast_expr(
first, last, db);
3703 t = parse_binary_expression(
first+2, last,
"%", db);
3708 t = parse_binary_expression(
first+2, last,
"%=", db);
3713 t = parse_binary_expression(
first+2, last,
">>", db);
3718 t = parse_binary_expression(
first+2, last,
">>=", db);
3728 first = parse_static_cast_expr(
first, last, db);
3731 first = parse_pack_expansion(
first, last, db);
3734 return parse_unresolved_name(
first, last, db);
3736 first = parse_sizeof_type_expr(
first, last, db);
3739 first = parse_sizeof_expr_expr(
first, last, db);
3747 first = parse_sizeof_param_pack_expr(
first, last, db);
3750 first = parse_sizeof_function_param_pack_expr(
first, last, db);
3765 db.names.push_back(
"throw");
3782 return parse_unresolved_name(
first, last, db);
3796 parse_template_arg(
const char*
first,
const char* last,
C& db)
3804 t = parse_expression(
first+1, last, db);
3807 if (t != last && *t ==
'E')
3817 const char*
t1 = parse_template_arg(t, last, db);
3828 t = parse_encoding(
first+2, last, db);
3829 if (t !=
first+2 && t != last && *t ==
'E')
3849 parse_template_args(
const char*
first,
const char* last,
C& db)
3853 if (db.tag_templates)
3854 db.template_param.back().clear();
3855 const char* t =
first+1;
3856 typename C::String
args(
"<");
3859 if (db.tag_templates)
3860 db.template_param.emplace_back(db.names.get_allocator());
3861 size_t k0 = db.names.size();
3862 const char*
t1 = parse_template_arg(t, last, db);
3863 size_t k1 = db.names.size();
3864 if (db.tag_templates)
3865 db.template_param.pop_back();
3866 if (
t1 == t ||
t1 == last)
3868 if (db.tag_templates)
3870 db.template_param.back().emplace_back(db.names.get_allocator());
3871 for (
size_t k =
k0;
k <
k1; ++
k)
3872 db.template_param.back().back().push_back(db.names[
k]);
3874 for (
size_t k =
k0;
k <
k1; ++
k)
3876 if (
args.size() > 1)
3878 args += db.names[
k].move_full();
3881 db.names.pop_back();
3885 if (
args.back() !=
'>')
3913 parse_nested_name(
const char*
first,
const char* last,
C& db,
3914 bool* ends_with_template_args)
3919 const char*
t0 = parse_cv_qualifiers(
first+1, last,
cv);
3928 else if (*
t0 ==
'O')
3933 db.names.emplace_back();
3934 if (last -
t0 >= 2 &&
t0[0] ==
'S' &&
t0[1] ==
't')
3937 db.names.back().first =
"std";
3941 db.names.pop_back();
3944 bool pop_subs =
false;
3945 bool component_ends_with_template_args =
false;
3948 component_ends_with_template_args =
false;
3953 if (
t0 + 1 != last &&
t0[1] ==
't')
3954 goto do_parse_unqualified_name;
3955 t1 = parse_substitution(
t0, last, db);
3956 if (
t1 !=
t0 &&
t1 != last)
3958 auto name = db.names.back().move_full();
3959 db.names.pop_back();
3960 if (!db.names.back().first.empty())
3962 db.names.back().first +=
"::" +
name;
3963 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3966 db.names.back().first =
name;
3974 t1 = parse_template_param(
t0, last, db);
3975 if (
t1 !=
t0 &&
t1 != last)
3977 auto name = db.names.back().move_full();
3978 db.names.pop_back();
3979 if (!db.names.back().first.empty())
3980 db.names.back().first +=
"::" +
name;
3982 db.names.back().first =
name;
3983 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
3991 if (
t0 + 1 != last &&
t0[1] !=
't' &&
t0[1] !=
'T')
3992 goto do_parse_unqualified_name;
3993 t1 = parse_decltype(
t0, last, db);
3994 if (
t1 !=
t0 &&
t1 != last)
3996 auto name = db.names.back().move_full();
3997 db.names.pop_back();
3998 if (!db.names.back().first.empty())
3999 db.names.back().first +=
"::" +
name;
4001 db.names.back().first =
name;
4002 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4010 t1 = parse_template_args(
t0, last, db);
4011 if (
t1 !=
t0 &&
t1 != last)
4013 auto name = db.names.back().move_full();
4014 db.names.pop_back();
4015 db.names.back().first +=
name;
4016 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4018 component_ends_with_template_args =
true;
4028 do_parse_unqualified_name:
4029 t1 = parse_unqualified_name(
t0, last, db);
4030 if (
t1 !=
t0 &&
t1 != last)
4032 auto name = db.names.back().move_full();
4033 db.names.pop_back();
4034 if (!db.names.back().first.empty())
4035 db.names.back().first +=
"::" +
name;
4037 db.names.back().first =
name;
4038 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4048 if (pop_subs && !db.subs.empty())
4050 if (ends_with_template_args)
4051 *ends_with_template_args = component_ends_with_template_args;
4061 parse_discriminator(
const char*
first,
const char* last)
4071 if (std::isdigit(*
t1))
4073 else if (*
t1 ==
'_')
4075 for (++
t1;
t1 != last && std::isdigit(*
t1); ++
t1)
4077 if (
t1 != last && *
t1 ==
'_')
4082 else if (std::isdigit(*
first))
4085 for (;
t1 != last && std::isdigit(*
t1); ++
t1)
4100 parse_local_name(
const char*
first,
const char* last,
C& db,
4101 bool* ends_with_template_args)
4105 const char* t = parse_encoding(
first+1, last, db);
4106 if (t !=
first+1 && t != last && *t ==
'E' && ++t != last)
4111 first = parse_discriminator(t+1, last);
4112 if (db.names.empty())
4114 db.names.back().first.append(
"::string literal");
4120 if (
t1 != last && *
t1 ==
'_')
4124 ends_with_template_args);
4127 if (db.names.size() < 2)
4129 auto name = db.names.back().move_full();
4130 db.names.pop_back();
4131 db.names.back().first.append(
"::");
4132 db.names.back().first.append(
name);
4136 db.names.pop_back();
4143 ends_with_template_args);
4147 first = parse_discriminator(
t1, last);
4148 if (db.names.size() < 2)
4150 auto name = db.names.back().move_full();
4151 db.names.pop_back();
4152 db.names.back().first.append(
"::");
4153 db.names.back().first.append(
name);
4156 db.names.pop_back();
4176 bool* ends_with_template_args)
4178 if (last -
first >= 2)
4188 const char*
t1 = parse_nested_name(
t0, last, db,
4189 ends_with_template_args);
4196 const char*
t1 = parse_local_name(
t0, last, db,
4197 ends_with_template_args);
4204 const char*
t1 = parse_unscoped_name(
t0, last, db);
4207 if (
t1 != last && *
t1 ==
'I')
4209 if (db.names.empty())
4211 db.subs.push_back(
typename C::sub_type(1, db.names.back(), db.names.get_allocator()));
4213 t1 = parse_template_args(
t0, last, db);
4216 if (db.names.size() < 2)
4218 auto tmp = db.names.back().move_full();
4219 db.names.pop_back();
4220 db.names.back().first +=
tmp;
4222 if (ends_with_template_args)
4223 *ends_with_template_args =
true;
4231 t1 = parse_substitution(
t0, last, db);
4232 if (
t1 !=
t0 &&
t1 != last && *
t1 ==
'I')
4235 t1 = parse_template_args(
t0, last, db);
4238 if (db.names.size() < 2)
4240 auto tmp = db.names.back().move_full();
4241 db.names.pop_back();
4242 db.names.back().first +=
tmp;
4244 if (ends_with_template_args)
4245 *ends_with_template_args =
true;
4266 parse_call_offset(
const char*
first,
const char* last)
4275 if (t !=
first + 1 && t != last && *t ==
'_')
4282 if (t !=
first + 1 && t != last && *t ==
'_')
4285 if (t2 != t && t2 != last && *t2 ==
'_')
4312 parse_special_name(
const char*
first,
const char* last,
C& db)
4314 if (last -
first > 2)
4324 t = parse_type(
first+2, last, db);
4327 if (db.names.empty())
4329 db.names.back().first.insert(0,
"vtable for ");
4335 t = parse_type(
first+2, last, db);
4338 if (db.names.empty())
4340 db.names.back().first.insert(0,
"VTT for ");
4346 t = parse_type(
first+2, last, db);
4349 if (db.names.empty())
4351 db.names.back().first.insert(0,
"typeinfo for ");
4357 t = parse_type(
first+2, last, db);
4360 if (db.names.empty())
4362 db.names.back().first.insert(0,
"typeinfo name for ");
4369 const char*
t0 = parse_call_offset(
first+2, last);
4372 const char*
t1 = parse_call_offset(
t0, last);
4375 t = parse_encoding(
t1, last, db);
4378 if (db.names.empty())
4380 db.names.back().first.insert(0,
"covariant return thunk to ");
4387 t = parse_type(
first+2, last, db);
4391 if (
t0 != t &&
t0 != last && *
t0 ==
'_')
4393 const char*
t1 = parse_type(++
t0, last, db);
4396 if (db.names.size() < 2)
4398 auto left = db.names.back().move_full();
4399 db.names.pop_back();
4400 db.names.back().first =
"construction vtable for " +
4402 db.names.back().move_full();
4411 const char*
t0 = parse_call_offset(
first+1, last);
4414 t = parse_encoding(
t0, last, db);
4417 if (db.names.empty())
4419 if (
first[1] ==
'v')
4421 db.names.back().first.insert(0,
"virtual thunk to ");
4426 db.names.back().first.insert(0,
"non-virtual thunk to ");
4442 if (db.names.empty())
4444 db.names.back().first.insert(0,
"guard variable for ");
4453 if (db.names.empty())
4455 db.names.back().first.insert(0,
"reference temporary for ");
4472 save_value(
T& restore)
4482 save_value(
const save_value&) =
delete;
4483 save_value& operator=(
const save_value&) =
delete;
4492 parse_encoding(
const char*
first,
const char* last, C& db)
4496 save_value<decltype(db.encoding_depth)> su(db.encoding_depth);
4497 ++db.encoding_depth;
4498 save_value<decltype(db.tag_templates)> sb(db.tag_templates);
4499 if (db.encoding_depth > 1)
4500 db.tag_templates =
true;
4509 bool ends_with_template_args =
false;
4511 &ends_with_template_args);
4512 unsigned cv = db.cv;
4513 unsigned ref = db.ref;
4516 if (t != last && *t !=
'E' && *t !=
'.')
4518 save_value<bool> sb2(db.tag_templates);
4519 db.tag_templates =
false;
4521 typename C::String ret2;
4522 if (db.names.empty())
4524 const typename C::String&
nm = db.names.back().first;
4527 if (!db.parsed_ctor_dtor_cv && ends_with_template_args)
4529 t2 = parse_type(t, last, db);
4532 if (db.names.size() < 2)
4534 auto ret1 =
std::move(db.names.back().first);
4535 ret2 =
std::move(db.names.back().second);
4538 db.names.pop_back();
4539 db.names.back().first.insert(0, ret1);
4542 db.names.back().first +=
'(';
4543 if (t != last && *t ==
'v')
4549 bool first_arg =
true;
4552 size_t k0 = db.names.size();
4553 t2 = parse_type(t, last, db);
4554 size_t k1 = db.names.size();
4559 typename C::String
tmp;
4560 for (
size_t k =
k0;
k <
k1; ++
k)
4564 tmp += db.names[
k].move_full();
4566 for (
size_t k =
k0;
k <
k1; ++
k)
4567 db.names.pop_back();
4570 if (db.names.empty())
4573 db.names.back().first +=
", ";
4576 db.names.back().first +=
tmp;
4582 if (db.names.empty())
4584 db.names.back().first +=
')';
4586 db.names.back().first.append(
" const");
4588 db.names.back().first.append(
" volatile");
4590 db.names.back().first.append(
" restrict");
4592 db.names.back().first.append(
" &");
4594 db.names.back().first.append(
" &&");
4595 db.names.back().first += ret2;
4614 parse_block_invoke(
const char*
first,
const char* last, C& db)
4616 if (last -
first >= 13)
4618 const char test[] =
"_block_invoke";
4620 for (
int i = 0;
i < 13; ++
i, ++
t)
4630 if (++t == last || !std::isdigit(*t))
4635 while (t != last && isdigit(*t))
4638 if (db.names.empty())
4640 db.names.back().first.insert(0,
"invocation function for block in ");
4651 parse_dot_suffix(
const char*
first,
const char* last, C& db)
4655 if (db.names.empty())
4657 db.names.back().first +=
" (" +
typename C::String(
first, last) +
")";
4671 demangle(
const char*
first,
const char* last, C& db,
int&
status)
4675 status = invalid_mangled_name;
4680 if (last -
first >= 4)
4682 if (
first[1] ==
'Z')
4684 const char*
t = parse_encoding(
first+2, last, db);
4685 if (t !=
first+2 && t != last && *t ==
'.')
4686 t = parse_dot_suffix(t, last, db);
4688 status = invalid_mangled_name;
4692 const char*
t = parse_encoding(
first+4, last, db);
4693 if (t !=
first+4 && t != last)
4695 const char*
t1 = parse_block_invoke(t, last, db);
4697 status = invalid_mangled_name;
4700 status = invalid_mangled_name;
4703 status = invalid_mangled_name;
4706 status = invalid_mangled_name;
4710 const char*
t = parse_type(
first, last, db);
4712 status = invalid_mangled_name;
4714 if (
status == success && db.names.empty())
4715 status = invalid_mangled_name;
4718 template <std::
size_t N>
4730 pointer_in_buffer(
char* p) noexcept
4739 char* allocate(std::size_t n);
4740 void deallocate(
char* p, std::size_t n) noexcept;
4742 static constexpr std::size_t
size() {
return N;}
4743 std::size_t used()
const {
return static_cast<std::size_t
>(
ptr_ -
buf_);}
4747 template <std::
size_t N>
4749 arena<N>::allocate(std::size_t n)
4752 if (
static_cast<std::size_t
>(
buf_ +
N -
ptr_) >= n)
4758 return static_cast<char*
>(std::malloc(n));
4761 template <std::
size_t N>
4763 arena<N>::deallocate(
char* p, std::size_t n) noexcept
4765 if (pointer_in_buffer(p))
4775 template <
class T, std::
size_t N>
4783 template <
class _Up>
struct rebind {
typedef short_alloc<_Up, N> other;};
4785 short_alloc(arena<N>& a) noexcept :
a_(a) {}
4787 short_alloc(
const short_alloc<U, N>& a) noexcept
4789 short_alloc(
const short_alloc&) =
default;
4790 short_alloc& operator=(
const short_alloc&) =
delete;
4792 T* allocate(std::size_t n)
4794 return reinterpret_cast<T*
>(
a_.allocate(n*
sizeof(
T)));
4796 void deallocate(
T* p, std::size_t n) noexcept
4798 a_.deallocate(
reinterpret_cast<char*
>(p), n*
sizeof(
T));
4801 template <
class T1, std::
size_t N1,
class U, std::
size_t M>
4804 operator==(
const short_alloc<T1, N1>& x,
const short_alloc<U, M>&
y) noexcept;
4806 template <
class U, std::
size_t M>
friend class short_alloc;
4809 template <
class T, std::
size_t N,
class U, std::
size_t M>
4812 operator==(
const short_alloc<T, N>&
x,
const short_alloc<U, M>&
y) noexcept
4814 return N == M && &
x.a_ == &
y.a_;
4817 template <
class T, std::
size_t N,
class U, std::
size_t M>
4820 operator!=(
const short_alloc<T, N>&
x,
const short_alloc<U, M>&
y) noexcept
4830 typedef T& reference;
4834 typedef std::size_t size_type;
4835 typedef std::ptrdiff_t difference_type;
4837 malloc_alloc() =
default;
4838 template <
class U> malloc_alloc(
const malloc_alloc<U>&) noexcept {}
4840 T* allocate(std::size_t n)
4842 return static_cast<T*
>(std::malloc(n*
sizeof(
T)));
4844 void deallocate(
T* p, std::size_t) noexcept
4849 template <
class U>
struct rebind {
using other = malloc_alloc<U>; };
4850 template <
class U,
class...
Args>
4853 ::new ((
void*)p) U(std::forward<Args>(
args)...);
4861 template <
class T,
class U>
4864 operator==(
const malloc_alloc<T>&,
const malloc_alloc<U>&) noexcept
4869 template <
class T,
class U>
4872 operator!=(
const malloc_alloc<T>& x,
const malloc_alloc<U>&
y) noexcept
4877 const size_t bs = 4 * 1024;
4878 template <
class T>
using Alloc = short_alloc<T, bs>;
4879 template <
class T>
using Vector = std::vector<T, Alloc<T>>;
4881 template <
class StrT>
4887 string_pair() =
default;
4889 string_pair(StrT f, StrT s)
4892 string_pair(
const char (&s)[
N]) :
first(
s,
N-1) {}
4901 typedef std::basic_string<char, std::char_traits<char>,
4902 malloc_alloc<char>> String;
4903 typedef Vector<string_pair<String>> sub_type;
4904 typedef Vector<sub_type> template_param_type;
4926 extern "C" _LIBCXXABI_FUNC_VIS
char *
4928 if (mangled_name ==
nullptr || (
buf !=
nullptr &&
n ==
nullptr))
4934 size_t internal_size =
buf !=
nullptr ? *
n : 0;
4939 db.encoding_depth = 0;
4940 db.parsed_ctor_dtor_cv =
false;
4941 db.tag_templates =
true;
4942 db.template_param.emplace_back(
a);
4943 db.fix_forward_references =
false;
4944 db.try_to_parse_template_args =
true;
4945 int internal_status = success;
4946 size_t len = std::strlen(mangled_name);
4947 demangle(mangled_name, mangled_name +
len, db,
4949 if (internal_status == success && db.fix_forward_references &&
4950 !db.template_param.empty() && !db.template_param.front().empty())
4952 db.fix_forward_references =
false;
4953 db.tag_templates =
false;
4956 demangle(mangled_name, mangled_name +
len, db, internal_status);
4957 if (db.fix_forward_references)
4958 internal_status = invalid_mangled_name;
4960 if (internal_status == success)
4962 size_t sz = db.names.back().size() + 1;
4963 if (sz > internal_size)
4965 char* newbuf =
static_cast<char*
>(std::realloc(
buf, sz));
4966 if (newbuf ==
nullptr)
4968 internal_status = memory_alloc_failure;
4980 db.names.back().first += db.names.back().second;
4982 buf[sz-1] = char(0);
4988 *
status = internal_status;