This should not call methods of `RVal`
(t: &mut RValueWriter, v: &SBValue, mut r: usize)
| 208 | |
| 209 | /// This should not call methods of `RVal` |
| 210 | fn 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 { |
no test coverage detected