mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-23 13:27:16 +00:00
It's like `Symbol` but for byte strings. The interner is now used for both `Symbol` and `ByteSymbol`. E.g. if you intern `"dog"` and `b"dog"` you'll get a `Symbol` and a `ByteSymbol` with the same index and the characters will only be stored once. The motivation for this is to eliminate the `Arc`s in `ast::LitKind`, to make `ast::LitKind` impl `Copy`, and to avoid the need to arena-allocate `ast::LitKind` in HIR. The latter change reduces peak memory by a non-trivial amount on literal-heavy benchmarks such as `deep-vector` and `tuple-stress`. `Encoder`, `Decoder`, `SpanEncoder`, and `SpanDecoder` all get some changes so that they can handle normal strings and byte strings. This change does slow down compilation of programs that use `include_bytes!` on large files, because the contents of those files are now interned (hashed). This makes `include_bytes!` more similar to `include_str!`, though `include_bytes!` contents still aren't escaped, and hashing is still much cheaper than escaping.
15 lines
522 B
Rust
15 lines
522 B
Rust
/// This higher-order macro declares a list of types which can be allocated by `Arena`.
|
|
/// Note that all `Copy` types can be allocated by default and need not be specified here.
|
|
#[macro_export]
|
|
macro_rules! arena_types {
|
|
($macro:path) => (
|
|
$macro!([
|
|
// HIR types
|
|
[] asm_template: rustc_ast::InlineAsmTemplatePiece,
|
|
[] attribute: rustc_hir::Attribute,
|
|
[] owner_info: rustc_hir::OwnerInfo<'tcx>,
|
|
[] macro_def: rustc_ast::MacroDef,
|
|
]);
|
|
)
|
|
}
|