stack_vm/code/
from_byte_code.rs1use crate::from_byte_code::FromByteCode;
2use std::io::Read;
3use rmp::decode;
4use std::fmt;
5use super::Code;
6
7impl<T: FromByteCode + fmt::Debug> FromByteCode for Code<T> {
8 fn from_byte_code(mut buf: &mut Read) -> Code<T> {
9 let map_len = decode::read_map_len(&mut buf).unwrap();
11 assert_eq!(map_len, 4);
12
13 let section = read_string(&mut buf);
15 assert_eq!(section, "code");
16
17 let code_len = decode::read_array_len(&mut buf).unwrap();
18 let mut code: Vec<usize> = vec![];
19 for _i in 0..code_len {
20 code.push(decode::read_int(&mut buf).unwrap());
21 }
22
23 let section = read_string(&mut buf);
25 assert_eq!(section, "data");
26
27 let data_len = decode::read_array_len(&mut buf).unwrap();
28 let mut data: Vec<T> = vec![];
29 for _i in 0..data_len {
30 data.push(FromByteCode::from_byte_code(&mut buf));
31 }
32
33 let section = read_string(&mut buf);
35 assert_eq!(section, "symbols");
36
37 let symbol_len = decode::read_array_len(&mut buf).unwrap();
38 let mut symbols: Vec<(usize, String)> = vec![];
39 for _i in 0..symbol_len / 2 {
40 let idx = decode::read_int(&mut buf).unwrap();
41 let symbol = read_string(&mut buf);
42 symbols.push((idx, symbol));
43 }
44
45 let section = read_string(&mut buf);
47 assert_eq!(section, "labels");
48
49 let label_len = decode::read_array_len(&mut buf).unwrap();
50 let mut labels: Vec<(usize, String)> = vec![];
51 for _i in 0..label_len / 2 {
52 let idx = decode::read_int(&mut buf).unwrap();
53 let label = read_string(&mut buf);
54 labels.push((idx, label));
55 }
56
57 Code {
58 symbols,
59 code,
60 data,
61 labels
62 }
63 }
64}
65
66fn read_string(mut buf: &mut Read) -> String {
67 let len = decode::read_str_len(&mut buf).unwrap();
68 let mut strbuf: Vec<u8> = vec![0u8; len as usize];
69 buf.read_exact(&mut strbuf).unwrap();
70 String::from_utf8(strbuf).unwrap()
71}