ruff/crates/ruff_python_ast/src
Charlie Marsh 93b5d8a0fb
Implement our own small-integer optimization (#7584)
## Summary

This is a follow-up to #7469 that attempts to achieve similar gains, but
without introducing malachite. Instead, this PR removes the `BigInt`
type altogether, instead opting for a simple enum that allows us to
store small integers directly and only allocate for values greater than
`i64`:

```rust
/// A Python integer literal. Represents both small (fits in an `i64`) and large integers.
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct Int(Number);

#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Number {
    /// A "small" number that can be represented as an `i64`.
    Small(i64),
    /// A "large" number that cannot be represented as an `i64`.
    Big(Box<str>),
}

impl std::fmt::Display for Number {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Number::Small(value) => write!(f, "{value}"),
            Number::Big(value) => write!(f, "{value}"),
        }
    }
}
```

We typically don't care about numbers greater than `isize` -- our only
uses are comparisons against small constants (like `1`, `2`, `3`, etc.),
so there's no real loss of information, except in one or two rules where
we're now a little more conservative (with the worst-case being that we
don't flag, e.g., an `itertools.pairwise` that uses an extremely large
value for the slice start constant). For simplicity, a few diagnostics
now show a dedicated message when they see integers that are out of the
supported range (e.g., `outdated-version-block`).

An additional benefit here is that we get to remove a few dependencies,
especially `num-bigint`.

## Test Plan

`cargo test`
2023-09-25 15:13:21 +00:00
..
visitor Introduce AST nodes for `PatternMatchClass` arguments (#6881) 2023-08-26 14:45:44 +00:00
all.rs Add an implicit concatenation flag to string and bytes constants (#6512) 2023-08-14 13:46:54 +00:00
call_path.rs Store call paths rather than stringified names (#6102) 2023-08-05 15:21:50 +00:00
comparable.rs Implement our own small-integer optimization (#7584) 2023-09-25 15:13:21 +00:00
docstrings.rs Move Python whitespace utilities into new `ruff_python_whitespace` crate (#4993) 2023-06-10 00:59:57 +00:00
expression.rs Move `Ranged` into `ruff_text_size` (#6919) 2023-08-27 14:12:51 -04:00
hashable.rs Pull in RustPython parser (#6099) 2023-07-27 09:29:11 +00:00
helpers.rs Implement our own small-integer optimization (#7584) 2023-09-25 15:13:21 +00:00
identifier.rs Move `Ranged` into `ruff_text_size` (#6919) 2023-08-27 14:12:51 -04:00
imports.rs Include alias when formatting import-from structs (#5786) 2023-07-15 15:53:21 -04:00
int.rs Implement our own small-integer optimization (#7584) 2023-09-25 15:13:21 +00:00
lib.rs Implement our own small-integer optimization (#7584) 2023-09-25 15:13:21 +00:00
node.rs Introduce `ArgOrKeyword` to keep call parameter order (#7302) 2023-09-13 08:45:46 +00:00
nodes.rs Implement our own small-integer optimization (#7584) 2023-09-25 15:13:21 +00:00
parenthesize.rs Use CommentRanges in backwards lexing (#7360) 2023-09-16 03:21:45 +00:00
relocate.rs Add an implicit concatenation flag to string and bytes constants (#6512) 2023-08-14 13:46:54 +00:00
statement_visitor.rs Remove `Stmt::TryStar` (#6566) 2023-08-14 13:39:44 -04:00
stmt_if.rs Move `Ranged` into `ruff_text_size` (#6919) 2023-08-27 14:12:51 -04:00
str.rs Replace dynamic implicit concatenation detection with parser flag (#6513) 2023-08-14 10:27:17 -04:00
traversal.rs [refurb] Implement `repeated-append` rule (`FURB113`) (#6702) 2023-08-28 22:51:59 +00:00
types.rs Remove `RefEquality` (#6393) 2023-08-07 16:04:50 +00:00
visitor.rs Don't reorder parameters in function calls (#7268) 2023-09-13 09:01:49 +00:00
whitespace.rs Move `Ranged` into `ruff_text_size` (#6919) 2023-08-27 14:12:51 -04:00