MCPcopy Create free account
hub / github.com/SeaQL/FireDBG.for.Rust / write_base_value

Function write_base_value

debugger/src/value/writer.rs:210–558  ·  view source on GitHub ↗

This should not call methods of `RVal`

(t: &mut RValueWriter, v: &SBValue, mut r: usize)

Source from the content-addressed store, hash-verified

208
209/// This should not call methods of `RVal`
210fn write_base_value(t: &mut RValueWriter, v: &SBValue, mut r: usize) -> Result<Bytes> {
211 if r == 0 {
212 log::trace!("Recursive limit reached for {:?}", v.type_name());
213 return Ok(t.opaque_v());
214 }
215 r -= 1;
216 let vtype = v.type_();
217 let type_class = vtype.type_class();
218 let write_primitive = |ty: &str| -> Result<Bytes> {
219 Ok(match v.byte_size() {
220 1 => t.prim_v(ty, &value_to_bytes::<1>(v)?),
221 2 => t.prim_v(ty, &value_to_bytes::<2>(v)?),
222 4 => t.prim_v(ty, &value_to_bytes::<4>(v)?),
223 8 => t.prim_v(ty, &value_to_bytes::<8>(v)?),
224 16 => t.prim_v(ty, &value_to_bytes::<16>(v)?),
225 _ => panic!("Not a primitive"),
226 })
227 };
228 if type_class.contains(TypeClass::Builtin) {
229 let ty = vtype.name();
230 return Ok(if !ty.is_empty() {
231 write_primitive(ty)?
232 } else {
233 t.opaque_v()
234 });
235 }
236 if type_class.contains(TypeClass::Array) {
237 let vtype = v.type_();
238 let typename = vtype.name();
239 return Ok(if typename.starts_with("[u8;") {
240 let len = v.byte_size().min(*MAX_ARRAY_SIZE);
241 let mut bytes = vec![0; len];
242 v.data()
243 .read_raw_data(0, &mut bytes)
244 .map_err(|_| WriteErr)?;
245 t.bytes_v(typename, Bytes::from(bytes))
246 } else {
247 let mut elems = Vec::with_capacity((v.num_children() as usize).min(*MAX_ARRAY_SIZE));
248 for c in v.children().take(*MAX_ARRAY_SIZE) {
249 elems.push(write_value(t, &c, r)?);
250 }
251 t.arr_v(elems.into_iter())
252 });
253 }
254 if type_class.intersects(TypeClass::Pointer | TypeClass::Reference) {
255 let raw_addr = value_to_bytes::<8>(v)?;
256 let addr = Addr::new(&raw_addr);
257 let raw_addr = u64::from_ne_bytes(raw_addr);
258 if t.alloc_env(addr) {
259 let pointee = vtype.pointee_type();
260 if !pointee.is_valid() {
261 bail!();
262 }
263 let pointee = pointee.name();
264 let value = if pointee.starts_with(RC_BOX_DYN) || pointee.starts_with(ARC_INNER_DYN) {
265 let ty = if pointee.starts_with(RC_BOX_DYN) {
266 "rc"
267 } else {

Callers 1

write_valueFunction · 0.85

Calls 15

write_valueFunction · 0.85
get_sb_typeFunction · 0.85
parse_pairFunction · 0.85
alignment_ofFunction · 0.85
condenseFunction · 0.85
get_layout_ofFunction · 0.85
read_process_memoryFunction · 0.85
sb_value_from_addrFunction · 0.85
sb_value_from_dataFunction · 0.85
enumerate_valueFunction · 0.85
read_strFunction · 0.85
type_classMethod · 0.80

Tested by

no test coverage detected