Parse a frame table section from a byte-slice as produced by [`crate::compile::FrameTableBuilder`].
(data: &'a [u8], original_text: &'a [u8])
| 65 | /// Parse a frame table section from a byte-slice as produced by |
| 66 | /// [`crate::compile::FrameTableBuilder`]. |
| 67 | pub fn parse(data: &'a [u8], original_text: &'a [u8]) -> anyhow::Result<FrameTable<'a>> { |
| 68 | let mut data = Bytes(data); |
| 69 | let num_frame_descriptors = data |
| 70 | .read::<U32<LittleEndian>>() |
| 71 | .map_err(|_| anyhow::anyhow!("Unable to read frame descriptor count prefix"))?; |
| 72 | let num_frame_descriptors = usize::try_from(num_frame_descriptors.get(LittleEndian))?; |
| 73 | let num_progpoint_descriptors = data |
| 74 | .read::<U32<LittleEndian>>() |
| 75 | .map_err(|_| anyhow::anyhow!("Unable to read progpoint descriptor count prefix"))?; |
| 76 | let num_progpoint_descriptors = |
| 77 | usize::try_from(num_progpoint_descriptors.get(LittleEndian))?; |
| 78 | let num_breakpoints = data |
| 79 | .read::<U32<LittleEndian>>() |
| 80 | .map_err(|_| anyhow::anyhow!("Unable to read breakpoint count prefix"))?; |
| 81 | let num_breakpoints = usize::try_from(num_breakpoints.get(LittleEndian))?; |
| 82 | |
| 83 | let frame_descriptor_pool_length = data |
| 84 | .read::<U32<LittleEndian>>() |
| 85 | .map_err(|_| anyhow::anyhow!("Unable to read frame descriptor pool length"))?; |
| 86 | let frame_descriptor_pool_length = |
| 87 | usize::try_from(frame_descriptor_pool_length.get(LittleEndian))?; |
| 88 | let progpoint_descriptor_pool_length = data |
| 89 | .read::<U32<LittleEndian>>() |
| 90 | .map_err(|_| anyhow::anyhow!("Unable to read progpoint descriptor pool length"))?; |
| 91 | let progpoint_descriptor_pool_length = |
| 92 | usize::try_from(progpoint_descriptor_pool_length.get(LittleEndian))?; |
| 93 | let breakpoint_patch_pool_length = data |
| 94 | .read::<U32<LittleEndian>>() |
| 95 | .map_err(|_| anyhow::anyhow!("Unable to read breakpoint patch pool length"))?; |
| 96 | let breakpoint_patch_pool_length = |
| 97 | usize::try_from(breakpoint_patch_pool_length.get(LittleEndian))?; |
| 98 | |
| 99 | let (frame_descriptor_ranges, data) = |
| 100 | object::slice_from_bytes::<U32<LittleEndian>>(data.0, 2 * num_frame_descriptors) |
| 101 | .map_err(|_| anyhow::anyhow!("Unable to read frame descriptor ranges slice"))?; |
| 102 | let (frame_descriptor_fp_offsets, data) = |
| 103 | object::slice_from_bytes::<U32<LittleEndian>>(data, num_frame_descriptors) |
| 104 | .map_err(|_| anyhow::anyhow!("Unable to read frame descriptor FP offset slice"))?; |
| 105 | |
| 106 | let (progpoint_pcs, data) = |
| 107 | object::slice_from_bytes::<U32<LittleEndian>>(data, num_progpoint_descriptors) |
| 108 | .map_err(|_| anyhow::anyhow!("Unable to read progpoint PC slice"))?; |
| 109 | let (progpoint_descriptor_offsets, data) = |
| 110 | object::slice_from_bytes::<U32<LittleEndian>>(data, num_progpoint_descriptors) |
| 111 | .map_err(|_| anyhow::anyhow!("Unable to read progpoint descriptor offset slice"))?; |
| 112 | let (breakpoint_pcs, data) = |
| 113 | object::slice_from_bytes::<U32<LittleEndian>>(data, num_breakpoints) |
| 114 | .map_err(|_| anyhow::anyhow!("Unable to read breakpoint PC slice"))?; |
| 115 | let (breakpoint_patch_offsets, data) = |
| 116 | object::slice_from_bytes::<U32<LittleEndian>>(data, num_breakpoints) |
| 117 | .map_err(|_| anyhow::anyhow!("Unable to read breakpoint patch offsets slice"))?; |
| 118 | let (breakpoint_patch_data_ends, data) = |
| 119 | object::slice_from_bytes::<U32<LittleEndian>>(data, num_breakpoints) |
| 120 | .map_err(|_| anyhow::anyhow!("Unable to read breakpoint patch data ends slice"))?; |
| 121 | |
| 122 | let (frame_descriptor_data, data) = data |
| 123 | .split_at_checked(frame_descriptor_pool_length) |
| 124 | .ok_or_else(|| anyhow::anyhow!("Unable to read frame descriptor pool"))?; |
no test coverage detected