aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Chibisov <contact@kchibisov.com>2024-12-29 00:18:14 +0300
committerGitHub <noreply@github.com>2024-12-29 00:18:14 +0300
commit40af63902e0af313722dfdc19a6d10a1d2ba29f4 (patch)
treedb577463eb1d0ed8cbc18f32f6050000e2d5b702
parentebc4a4d7259678a8626f5c269ea9348dfc3e79b2 (diff)
downloadr-alacritty-vte-40af63902e0af313722dfdc19a6d10a1d2ba29f4.tar.gz
r-alacritty-vte-40af63902e0af313722dfdc19a6d10a1d2ba29f4.tar.bz2
r-alacritty-vte-40af63902e0af313722dfdc19a6d10a1d2ba29f4.zip
Improve attrs_from_sgr_parameters performance
Instead of collecting all the data into the vector just dispatch it right away avoiding allocations.
-rw-r--r--src/ansi.rs19
-rw-r--r--src/definitions.rs4
-rw-r--r--src/lib.rs2
3 files changed, 10 insertions, 15 deletions
diff --git a/src/ansi.rs b/src/ansi.rs
index 59b17e6..8cac26d 100644
--- a/src/ansi.rs
+++ b/src/ansi.rs
@@ -1620,12 +1620,7 @@ where
if params.is_empty() {
handler.terminal_attribute(Attr::Reset);
} else {
- for attr in attrs_from_sgr_parameters(&mut params_iter) {
- match attr {
- Some(attr) => handler.terminal_attribute(attr),
- None => unhandled!(),
- }
- }
+ attrs_from_sgr_parameters(*handler, &mut params_iter);
}
},
('m', [b'>']) => {
@@ -1769,9 +1764,7 @@ where
}
#[inline]
-fn attrs_from_sgr_parameters(params: &mut ParamsIter<'_>) -> Vec<Option<Attr>> {
- let mut attrs = Vec::with_capacity(params.size_hint().0);
-
+fn attrs_from_sgr_parameters<H: Handler>(handler: &mut H, params: &mut ParamsIter<'_>) {
while let Some(param) = params.next() {
let attr = match param {
[0] => Some(Attr::Reset),
@@ -1851,10 +1844,12 @@ fn attrs_from_sgr_parameters(params: &mut ParamsIter<'_>) -> Vec<Option<Attr>> {
[107] => Some(Attr::Background(Color::Named(NamedColor::BrightWhite))),
_ => None,
};
- attrs.push(attr);
- }
- attrs
+ match attr {
+ Some(attr) => handler.terminal_attribute(attr),
+ None => continue,
+ }
+ }
}
/// Handle colon separated rgb color escape sequence.
diff --git a/src/definitions.rs b/src/definitions.rs
index 218c1eb..568a8a8 100644
--- a/src/definitions.rs
+++ b/src/definitions.rs
@@ -57,9 +57,9 @@ pub fn unpack(delta: u8) -> (State, Action) {
unsafe {
(
// State is stored in bottom 4 bits
- mem::transmute(delta & 0x0f),
+ mem::transmute::<u8, State>(delta & 0x0f),
// Action is stored in top 4 bits
- mem::transmute(delta >> 4),
+ mem::transmute::<u8, Action>(delta >> 4),
)
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 31e2a31..0f12902 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -56,7 +56,7 @@ const MAX_OSC_RAW: usize = 1024;
struct VtUtf8Receiver<'a, P: Perform>(&'a mut P, &'a mut State);
-impl<'a, P: Perform> utf8::Receiver for VtUtf8Receiver<'a, P> {
+impl<P: Perform> utf8::Receiver for VtUtf8Receiver<'_, P> {
fn codepoint(&mut self, c: char) {
self.0.print(c);
*self.1 = State::Ground;