MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / parse

Method parse

crates/environ/src/frame_table.rs:67–147  ·  view source on GitHub ↗

Parse a frame table section from a byte-slice as produced by [`crate::compile::FrameTableBuilder`].

(data: &'a [u8], original_text: &'a [u8])

Source from the content-addressed store, hash-verified

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"))?;

Callers 4

getWorkspaceMembersFunction · 0.45
pulley_hostMethod · 0.45
translateMethod · 0.45

Calls 2

OkFunction · 0.85
getMethod · 0.45

Tested by

no test coverage detected