stack_vm/code/
from_byte_code.rs

1use 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        // We expect a four-element map.
10        let map_len = decode::read_map_len(&mut buf).unwrap();
11        assert_eq!(map_len, 4);
12
13        // We expect the code section next:
14        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        // We expect the data section next
24        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        // Next, symbols.
34        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        // Lastly, labels.
46        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}