• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use super::prelude::*;
2 use crate::target::ext::tracepoints::FrameRequest;
3 use crate::target::ext::tracepoints::Tracepoint;
4 
5 #[derive(Debug)]
6 pub struct QTFrame<'a>(pub FrameRequest<&'a mut [u8]>);
7 
8 impl<'a> ParseCommand<'a> for QTFrame<'a> {
9     #[inline(always)]
from_packet(buf: PacketBuf<'a>) -> Option<Self>10     fn from_packet(buf: PacketBuf<'a>) -> Option<Self> {
11         let body = buf.into_body();
12         match body {
13             [b':', body @ ..] => {
14                 let mut s = body.split_mut(|b| *b == b':');
15                 let selector = s.next()?;
16                 // Clippy incorrect thinks this as_ref isn't needed, but it is.
17                 #[allow(clippy::useless_asref)]
18                 Some(match selector.as_ref() {
19                     b"pc" => {
20                         let addr = decode_hex_buf(s.next()?).ok()?;
21                         QTFrame(FrameRequest::AtPC(addr))
22                     }
23                     b"tdp" => {
24                         let tp = Tracepoint(decode_hex(s.next()?).ok()?);
25                         QTFrame(FrameRequest::Hit(tp))
26                     }
27                     b"range" => {
28                         let start = decode_hex_buf(s.next()?).ok()?;
29                         let end = decode_hex_buf(s.next()?).ok()?;
30                         QTFrame(FrameRequest::Between(start, end))
31                     }
32                     b"outside" => {
33                         let start = decode_hex_buf(s.next()?).ok()?;
34                         let end = decode_hex_buf(s.next()?).ok()?;
35                         QTFrame(FrameRequest::Outside(start, end))
36                     }
37                     n => QTFrame(FrameRequest::Select(decode_hex(n).ok()?)),
38                 })
39             }
40             _ => None,
41         }
42     }
43 }
44