Lines Matching refs:printer
111 struct printer { struct
120 static NODISCARD overflow_status printer_print_path(struct printer *printer, bool in_value); argument
121 static NODISCARD overflow_status printer_print_type(struct printer *printer);
122 static NODISCARD overflow_status printer_print_const(struct printer *printer, bool in_value);
125 struct printer printer = { in try_parse_path() local
133 overflow_status ignore = printer_print_path(&printer, false); // can't fail since no output in try_parse_path()
135 *parser = printer.parser; in try_parse_path()
136 return printer.status; in try_parse_path()
195 struct printer printer = { in rust_demangle_v0_display_demangle() local
208 if (printer_print_path(&printer, true) == OverflowOverflow) { in rust_demangle_v0_display_demangle()
211 if (printer.out_len < OVERFLOW_MARGIN) { in rust_demangle_v0_display_demangle()
214 *printer.out = '\0'; in rust_demangle_v0_display_demangle()
952 #define PRINT_CH(printer, s) PRINT(printer_print_ch((printer), (s))) argument
953 #define PRINT_STR(printer, s) PRINT(printer_print_str((printer), (s))) argument
954 #define PRINT_U64(printer, s) PRINT(printer_print_u64((printer), (s))) argument
955 #define PRINT_IDENT(printer, s) PRINT(printer_print_ident((printer), (s))) argument
957 #define INVALID(printer) \ argument
959 PRINT_STR((printer), INVALID_SYNTAX); \
960 (printer)->status = DemangleInvalid; \
964 #define PARSE(printer, method, ...) \ argument
966 if ((printer)->status != DemangleOk) { \
967 PRINT_STR((printer), "?"); \
970 demangle_status _parse_status = method(&(printer)->parser, ## __VA_ARGS__); \
972 PRINT_STR((printer), demangle_error_message(_parse_status)); \
973 (printer)->status = _parse_status; \
979 #define PRINT_SEP_LIST(printer, body, sep) \ argument
982 PRINT_SEP_LIST_COUNT(printer, _sep_list_i, body, sep); \
985 #define PRINT_SEP_LIST_COUNT(printer, count, body, sep) \ argument
988 while ((printer)->status == DemangleOk && !printer_eat((printer), 'E')) { \
989 if (count > 0) { PRINT_STR(printer, sep); } \
995 static bool printer_eat(struct printer *printer, uint8_t b) { in printer_eat() argument
996 if (printer->status != DemangleOk) { in printer_eat()
1000 return parser_eat(&printer->parser, b); in printer_eat()
1003 static void printer_pop_depth(struct printer *printer) { in printer_pop_depth() argument
1004 if (printer->status == DemangleOk) { in printer_pop_depth()
1005 parser_pop_depth(&printer->parser); in printer_pop_depth()
1009 static NODISCARD overflow_status printer_print_buf(struct printer *printer, const char *start, size… in printer_print_buf() argument
1010 if (printer->out == NULL) { in printer_print_buf()
1013 if (printer->out_len < len) { in printer_print_buf()
1017 memcpy(printer->out, start, len); in printer_print_buf()
1018 printer->out += len; in printer_print_buf()
1019 printer->out_len -= len; in printer_print_buf()
1023 static NODISCARD overflow_status printer_print_str(struct printer *printer, const char *buf) { in printer_print_str() argument
1024 return printer_print_buf(printer, buf, strlen(buf)); in printer_print_str()
1027 static NODISCARD overflow_status printer_print_ch(struct printer *printer, char ch) { in printer_print_ch() argument
1028 return printer_print_buf(printer, &ch, 1); in printer_print_ch()
1031 static NODISCARD overflow_status printer_print_u64(struct printer *printer, uint64_t n) { in printer_print_u64() argument
1034 return printer_print_str(printer, buf); in printer_print_u64()
1037 static NODISCARD overflow_status printer_print_ident(struct printer *printer, struct ident *ident) { in printer_print_ident() argument
1038 if (printer->out == NULL) { in printer_print_ident()
1042 size_t out_len = printer->out_len; in printer_print_ident()
1044 … ident->ascii_len, ident->punycode_start, ident->punycode_len, (uint8_t*)printer->out, &out_len)) … in printer_print_ident()
1047 printer->out += out_len; in printer_print_ident()
1048 printer->out_len -= out_len; in printer_print_ident()
1052 typedef overflow_status (*printer_fn)(struct printer *printer);
1053 typedef overflow_status (*backref_fn)(struct printer *printer, bool *arg);
1055 static NODISCARD overflow_status printer_print_backref(struct printer *printer, backref_fn func, bo… in printer_print_backref() argument
1057 PARSE(printer, parser_backref, &backref); in printer_print_backref()
1059 if (printer->out == NULL) { in printer_print_backref()
1063 struct parser orig_parser = printer->parser; in printer_print_backref()
1064 …demangle_status orig_status = printer->status; // fixme not sure this is needed match for Ok on th… in printer_print_backref()
1065 printer->parser = backref; in printer_print_backref()
1066 printer->status = DemangleOk; in printer_print_backref()
1067 overflow_status status = func(printer, arg); in printer_print_backref()
1068 printer->parser = orig_parser; in printer_print_backref()
1069 printer->status = orig_status; in printer_print_backref()
1074 static NODISCARD overflow_status printer_print_lifetime_from_index(struct printer *printer, uint64_… in printer_print_lifetime_from_index() argument
1076 if (printer->out == NULL) { in printer_print_lifetime_from_index()
1080 PRINT_STR(printer, "'"); in printer_print_lifetime_from_index()
1082 PRINT_STR(printer, "_"); in printer_print_lifetime_from_index()
1086 if (printer->bound_lifetime_depth < lt) { in printer_print_lifetime_from_index()
1087 INVALID(printer); in printer_print_lifetime_from_index()
1089 uint64_t depth = printer->bound_lifetime_depth - lt; in printer_print_lifetime_from_index()
1091 PRINT_CH(printer, 'a' + depth); in printer_print_lifetime_from_index()
1093 PRINT_STR(printer, "_"); in printer_print_lifetime_from_index()
1094 PRINT_U64(printer, depth); in printer_print_lifetime_from_index()
1101 static NODISCARD overflow_status printer_in_binder(struct printer *printer, printer_fn func) { in printer_in_binder() argument
1103 PARSE(printer, parser_opt_integer_62, 'G', &bound_lifetimes); in printer_in_binder()
1106 if (printer->out == NULL) { in printer_in_binder()
1107 return func(printer); in printer_in_binder()
1111 PRINT_STR(printer, "for<"); in printer_in_binder()
1114 PRINT_STR(printer, ", "); in printer_in_binder()
1116 printer->bound_lifetime_depth++; in printer_in_binder()
1117 PRINT(printer_print_lifetime_from_index(printer, 1)); in printer_in_binder()
1119 PRINT_STR(printer, "> "); in printer_in_binder()
1122 overflow_status r = func(printer); in printer_in_binder()
1123 printer->bound_lifetime_depth -= bound_lifetimes; in printer_in_binder()
1128 static NODISCARD overflow_status printer_print_generic_arg(struct printer *printer) { in printer_print_generic_arg() argument
1129 if (printer_eat(printer, 'L')) { in printer_print_generic_arg()
1131 PARSE(printer, parser_integer_62, <); in printer_print_generic_arg()
1132 return printer_print_lifetime_from_index(printer, lt); in printer_print_generic_arg()
1133 } else if (printer_eat(printer, 'K')) { in printer_print_generic_arg()
1134 return printer_print_const(printer, false); in printer_print_generic_arg()
1136 return printer_print_type(printer); in printer_print_generic_arg()
1140 static NODISCARD overflow_status printer_print_generic_args(struct printer *printer) { in printer_print_generic_args() argument
1141 PRINT_STR(printer, "<"); in printer_print_generic_args()
1142 PRINT_SEP_LIST(printer, PRINT(printer_print_generic_arg(printer)), ", "); in printer_print_generic_args()
1143 PRINT_STR(printer, ">"); in printer_print_generic_args()
1147 static NODISCARD overflow_status printer_print_path_out_of_value(struct printer *printer, bool *_ar… in printer_print_path_out_of_value() argument
1149 return printer_print_path(printer, false); in printer_print_path_out_of_value()
1152 static NODISCARD overflow_status printer_print_path_in_value(struct printer *printer, bool *_arg) { in printer_print_path_in_value() argument
1154 return printer_print_path(printer, true); in printer_print_path_in_value()
1157 static NODISCARD overflow_status printer_print_path(struct printer *printer, bool in_value) { in printer_print_path() argument
1158 PARSE(printer, parser_push_depth); in printer_print_path()
1160 PARSE(printer, parser_ch, &tag); in printer_print_path()
1170 PARSE(printer, parser_disambiguator, &dis); in printer_print_path()
1171 PARSE(printer, parser_ident, &name); in printer_print_path()
1173 PRINT_IDENT(printer, &name); in printer_print_path()
1175 if (printer->out != NULL && !printer->alternate && dis != 0) { in printer_print_path()
1176 PRINT_STR(printer, "["); in printer_print_path()
1179 PRINT_STR(printer, buf); in printer_print_path()
1180 PRINT_STR(printer, "]"); in printer_print_path()
1184 PARSE(printer, parser_namespace, &ns); in printer_print_path()
1185 if ((st = printer_print_path(printer, in_value)) != OverflowOk) { in printer_print_path()
1194 if (printer->status != DemangleOk) { in printer_print_path()
1195 PRINT_STR(printer, "::"); in printer_print_path()
1198 PARSE(printer, parser_disambiguator, &dis); in printer_print_path()
1199 PARSE(printer, parser_ident, &name); in printer_print_path()
1202 PRINT_STR(printer, "::{"); in printer_print_path()
1204 PRINT_STR(printer, "closure"); in printer_print_path()
1206 PRINT_STR(printer, "shim"); in printer_print_path()
1208 PRINT_CH(printer, ns); in printer_print_path()
1211 PRINT_STR(printer, ":"); in printer_print_path()
1212 PRINT_IDENT(printer, &name); in printer_print_path()
1214 PRINT_STR(printer, "#"); in printer_print_path()
1215 PRINT_U64(printer, dis); in printer_print_path()
1216 PRINT_STR(printer, "}"); in printer_print_path()
1220 PRINT_STR(printer, "::"); in printer_print_path()
1221 PRINT_IDENT(printer, &name); in printer_print_path()
1228 PARSE(printer, parser_disambiguator, &dis); in printer_print_path()
1229 orig_out = printer->out; in printer_print_path()
1230 printer->out = NULL; in printer_print_path()
1231 PRINT(printer_print_path(printer, false)); in printer_print_path()
1232 printer->out = orig_out; in printer_print_path()
1236 PRINT_STR(printer, "<"); in printer_print_path()
1237 PRINT(printer_print_type(printer)); in printer_print_path()
1239 PRINT_STR(printer, " as "); in printer_print_path()
1240 PRINT(printer_print_path(printer, false)); in printer_print_path()
1242 PRINT_STR(printer, ">"); in printer_print_path()
1245 PRINT(printer_print_path(printer, in_value)); in printer_print_path()
1247 PRINT_STR(printer, "::"); in printer_print_path()
1249 PRINT(printer_print_generic_args(printer)); in printer_print_path()
1252 …PRINT(printer_print_backref(printer, in_value ? printer_print_path_in_value : printer_print_path_o… in printer_print_path()
1255 INVALID(printer); in printer_print_path()
1259 printer_pop_depth(printer); in printer_print_path()
1263 static NODISCARD overflow_status printer_print_const_uint(struct printer *printer, uint8_t tag) { in printer_print_const_uint() argument
1265 PARSE(printer, parser_hex_nibbles, &hex); in printer_print_const_uint()
1269 PRINT_U64(printer, val); in printer_print_const_uint()
1271 PRINT_STR(printer, "0x"); in printer_print_const_uint()
1272 PRINT(printer_print_buf(printer, hex.start, hex.len)); in printer_print_const_uint()
1275 if (printer->out != NULL && !printer->alternate) { in printer_print_const_uint()
1278 PRINT_STR(printer, ty); in printer_print_const_uint()
1285 static NODISCARD overflow_status printer_print_const_str_literal(struct printer *printer) { in printer_print_const_str_literal() argument
1287 PARSE(printer, parser_hex_nibbles, &hex); in printer_print_const_str_literal()
1293 if (printer->out != NULL) { in printer_print_const_str_literal()
1294 out_len = printer->out_len; in printer_print_const_str_literal()
1295 nts_status = nibbles_to_string(hex.start, hex.len, (uint8_t*)printer->out, &out_len); in printer_print_const_str_literal()
1299 printer->out += out_len; in printer_print_const_str_literal()
1300 printer->out_len -= out_len; in printer_print_const_str_literal()
1310 INVALID(printer); in printer_print_const_str_literal()
1314 static NODISCARD overflow_status printer_print_const_struct(struct printer *printer) { in printer_print_const_struct() argument
1317 PARSE(printer, parser_disambiguator, &dis); in printer_print_const_struct()
1318 PARSE(printer, parser_ident, &name); in printer_print_const_struct()
1319 PRINT_IDENT(printer, &name); in printer_print_const_struct()
1320 PRINT_STR(printer, ": "); in printer_print_const_struct()
1321 return printer_print_const(printer, true); in printer_print_const_struct()
1324 static NODISCARD overflow_status printer_print_const_out_of_value(struct printer *printer, bool *_a… in printer_print_const_out_of_value() argument
1326 return printer_print_const(printer, false); in printer_print_const_out_of_value()
1329 static NODISCARD overflow_status printer_print_const_in_value(struct printer *printer, bool *_arg) { in printer_print_const_in_value() argument
1331 return printer_print_const(printer, true); in printer_print_const_in_value()
1334 static NODISCARD overflow_status printer_print_const(struct printer *printer, bool in_value) { in printer_print_const() argument
1337 PARSE(printer, parser_ch, &tag); in printer_print_const()
1338 PARSE(printer, parser_push_depth); in printer_print_const()
1348 PRINT_STR(printer, "{"); \ in printer_print_const()
1353 PRINT_STR(printer, "_"); in printer_print_const()
1362 if (printer_eat(printer, 'n')) { in printer_print_const()
1363 PRINT_STR(printer, "-"); in printer_print_const()
1372 PRINT(printer_print_const_uint(printer, tag)); in printer_print_const()
1375 PARSE(printer, parser_hex_nibbles, &hex); in printer_print_const()
1378 PRINT_STR(printer, "false"); in printer_print_const()
1380 PRINT_STR(printer, "true"); in printer_print_const()
1382 INVALID(printer); in printer_print_const()
1385 INVALID(printer); in printer_print_const()
1389 PARSE(printer, parser_hex_nibbles, &hex); in printer_print_const()
1397 PRINT_STR(printer, "'"); in printer_print_const()
1398 PRINT(printer_print_buf(printer, escaped_buf, escaped_size)); in printer_print_const()
1399 PRINT_STR(printer, "'"); in printer_print_const()
1401 INVALID(printer); in printer_print_const()
1406 PRINT_STR(printer, "*"); in printer_print_const()
1407 PRINT(printer_print_const_str_literal(printer)); in printer_print_const()
1411 if (tag == 'R' && printer_eat(printer, 'e')) { in printer_print_const()
1412 PRINT(printer_print_const_str_literal(printer)); in printer_print_const()
1415 PRINT_STR(printer, "&"); in printer_print_const()
1417 PRINT_STR(printer, "mut "); in printer_print_const()
1419 PRINT(printer_print_const(printer, true)); in printer_print_const()
1424 PRINT_STR(printer, "["); in printer_print_const()
1425 PRINT_SEP_LIST(printer, PRINT(printer_print_const(printer, true)), ", "); in printer_print_const()
1426 PRINT_STR(printer, "]"); in printer_print_const()
1430 PRINT_STR(printer, "("); in printer_print_const()
1431 PRINT_SEP_LIST_COUNT(printer, count, PRINT(printer_print_const(printer, true)), ", "); in printer_print_const()
1433 PRINT_STR(printer, ","); in printer_print_const()
1435 PRINT_STR(printer, ")"); in printer_print_const()
1439 PRINT(printer_print_path(printer, true)); in printer_print_const()
1440 PARSE(printer, parser_ch, &tag); in printer_print_const()
1445 PRINT_STR(printer, "("); in printer_print_const()
1446 PRINT_SEP_LIST(printer, PRINT(printer_print_const(printer, true)), ", "); in printer_print_const()
1447 PRINT_STR(printer, ")"); in printer_print_const()
1450 PRINT_STR(printer, " { "); in printer_print_const()
1451 PRINT_SEP_LIST(printer, PRINT(printer_print_const_struct(printer)), ", "); in printer_print_const()
1452 PRINT_STR(printer, " }"); in printer_print_const()
1455 INVALID(printer); in printer_print_const()
1459 …PRINT(printer_print_backref(printer, in_value ? printer_print_const_in_value : printer_print_const… in printer_print_const()
1462 INVALID(printer); in printer_print_const()
1467 PRINT_STR(printer, "}"); in printer_print_const()
1469 printer_pop_depth(printer); in printer_print_const()
1479 static NODISCARD overflow_status printer_print_maybe_open_generics(struct printer *printer, bool *o… in printer_print_maybe_open_generics() argument
1480 if (printer_eat(printer, 'B')) { in printer_print_maybe_open_generics()
1484 return printer_print_backref(printer, printer_print_maybe_open_generics, open); in printer_print_maybe_open_generics()
1485 } else if(printer_eat(printer, 'I')) { in printer_print_maybe_open_generics()
1486 PRINT(printer_print_path(printer, false)); in printer_print_maybe_open_generics()
1487 PRINT_STR(printer, "<"); in printer_print_maybe_open_generics()
1488 PRINT_SEP_LIST(printer, PRINT(printer_print_generic_arg(printer)), ", "); in printer_print_maybe_open_generics()
1492 PRINT(printer_print_path(printer, false)); in printer_print_maybe_open_generics()
1498 static NODISCARD overflow_status printer_print_dyn_trait(struct printer *printer) { in printer_print_dyn_trait() argument
1500 PRINT(printer_print_maybe_open_generics(printer, &open)); in printer_print_dyn_trait()
1502 while (printer_eat(printer, 'p')) { in printer_print_dyn_trait()
1504 PRINT_STR(printer, "<"); in printer_print_dyn_trait()
1507 PRINT_STR(printer, ", "); in printer_print_dyn_trait()
1511 PARSE(printer, parser_ident, &name); in printer_print_dyn_trait()
1513 PRINT_IDENT(printer, &name); in printer_print_dyn_trait()
1514 PRINT_STR(printer, " = "); in printer_print_dyn_trait()
1515 PRINT(printer_print_type(printer)); in printer_print_dyn_trait()
1519 PRINT_STR(printer, ">"); in printer_print_dyn_trait()
1525 static NODISCARD overflow_status printer_print_object_bounds(struct printer *printer) { in printer_print_object_bounds() argument
1526 PRINT_SEP_LIST(printer, PRINT(printer_print_dyn_trait(printer)), " + "); in printer_print_object_bounds()
1530 static NODISCARD overflow_status printer_print_function_type(struct printer *printer) { in printer_print_function_type() argument
1531 bool is_unsafe = printer_eat(printer, 'U'); in printer_print_function_type()
1534 if (printer_eat(printer, 'K')) { in printer_print_function_type()
1535 if (printer_eat(printer, 'C')) { in printer_print_function_type()
1540 PARSE(printer, parser_ident, &abi_ident); in printer_print_function_type()
1542 INVALID(printer); in printer_print_function_type()
1553 PRINT_STR(printer, "unsafe "); in printer_print_function_type()
1557 PRINT_STR(printer, "extern \""); in printer_print_function_type()
1563 PRINT(printer_print_buf(printer, (const char*)abi, abi_len)); in printer_print_function_type()
1567 PRINT(printer_print_buf(printer, (const char*)abi, space_to_minus)); in printer_print_function_type()
1568 PRINT_STR(printer, "-"); in printer_print_function_type()
1574 PRINT_STR(printer, "\" "); in printer_print_function_type()
1577 PRINT_STR(printer, "fn("); in printer_print_function_type()
1578 PRINT_SEP_LIST(printer, PRINT(printer_print_type(printer)), ", "); in printer_print_function_type()
1579 PRINT_STR(printer, ")"); in printer_print_function_type()
1581 if (printer_eat(printer, 'u')) { in printer_print_function_type()
1584 PRINT_STR(printer, " -> "); in printer_print_function_type()
1585 PRINT(printer_print_type(printer)); in printer_print_function_type()
1591 static NODISCARD overflow_status printer_print_type_backref(struct printer *printer, bool *_arg) { in printer_print_type_backref() argument
1593 return printer_print_type(printer); in printer_print_type_backref()
1596 static NODISCARD overflow_status printer_print_type(struct printer *printer) { in printer_print_type() argument
1598 PARSE(printer, parser_ch, &tag); in printer_print_type()
1602 return printer_print_str(printer, basic_ty); in printer_print_type()
1608 PARSE(printer, parser_push_depth); in printer_print_type()
1612 PRINT_STR(printer, "&"); in printer_print_type()
1613 if (printer_eat(printer, 'L')) { in printer_print_type()
1614 PARSE(printer, parser_integer_62, <); in printer_print_type()
1616 PRINT(printer_print_lifetime_from_index(printer, lt)); in printer_print_type()
1617 PRINT_STR(printer, " "); in printer_print_type()
1621 PRINT_STR(printer, "mut "); in printer_print_type()
1623 PRINT(printer_print_type(printer)); in printer_print_type()
1627 PRINT_STR(printer, "*"); in printer_print_type()
1629 PRINT_STR(printer, "mut "); in printer_print_type()
1631 PRINT_STR(printer, "const "); in printer_print_type()
1633 PRINT(printer_print_type(printer)); in printer_print_type()
1637 PRINT_STR(printer, "["); in printer_print_type()
1638 PRINT(printer_print_type(printer)); in printer_print_type()
1640 PRINT_STR(printer, "; "); in printer_print_type()
1641 PRINT(printer_print_const(printer, true)); in printer_print_type()
1643 PRINT_STR(printer, "]"); in printer_print_type()
1646 PRINT_STR(printer, "("); in printer_print_type()
1647 PRINT_SEP_LIST_COUNT(printer, count, PRINT(printer_print_type(printer)), ", "); in printer_print_type()
1649 PRINT_STR(printer, ","); in printer_print_type()
1651 PRINT_STR(printer, ")"); in printer_print_type()
1654 PRINT(printer_in_binder(printer, printer_print_function_type)); in printer_print_type()
1657 PRINT_STR(printer, "dyn "); in printer_print_type()
1658 PRINT(printer_in_binder(printer, printer_print_object_bounds)); in printer_print_type()
1660 if (!printer_eat(printer, 'L')) { in printer_print_type()
1661 INVALID(printer); in printer_print_type()
1663 PARSE(printer, parser_integer_62, <); in printer_print_type()
1666 PRINT_STR(printer, " + "); in printer_print_type()
1667 PRINT(printer_print_lifetime_from_index(printer, lt)); in printer_print_type()
1671 PRINT(printer_print_backref(printer, printer_print_type_backref, NULL)); in printer_print_type()
1675 if (printer->status == DemangleOk && /* safety */ printer->parser.next > 0) { in printer_print_type()
1676 printer->parser.next--; in printer_print_type()
1678 PRINT(printer_print_path(printer, false)); in printer_print_type()
1681 printer_pop_depth(printer); in printer_print_type()
1775 struct printer printer = { in rust_demangle_legacy_display_demangle() local
1806 PRINT_STR(&printer, "::"); in rust_demangle_legacy_display_demangle()
1817 PRINT_STR(&printer, "::"); in rust_demangle_legacy_display_demangle()
1821 PRINT_STR(&printer, "."); in rust_demangle_legacy_display_demangle()
1865 PRINT(printer_print_buf(&printer, (const char*)wchr, wchr_len)); in rust_demangle_legacy_display_demangle()
1874 PRINT_CH(&printer, ch); in rust_demangle_legacy_display_demangle()
1883 PRINT(printer_print_buf(&printer, rest, j)); in rust_demangle_legacy_display_demangle()
1888 PRINT(printer_print_buf(&printer, rest, len)); in rust_demangle_legacy_display_demangle()
1891 if (printer.out_len < OVERFLOW_MARGIN) { in rust_demangle_legacy_display_demangle()
1894 *printer.out = '\0'; in rust_demangle_legacy_display_demangle()