1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use super::{ModuleError, ModulePreset, ModuleTranslator};
use parity_wasm::elements::*;

pub struct TrimStartFunc;

impl TrimStartFunc {
    fn trim_startfunc(&self, module: &mut Module) -> bool {
        if let Some(start_section) = module.start_section() {
            module.clear_start_section();
            true
        } else {
            false
        }
    }
}

impl ModulePreset for TrimStartFunc {
    fn with_preset(preset: &str) -> Result<Self, ()> {
        match preset {
            "ewasm" => Ok(TrimStartFunc {}),
            _ => Err(()),
        }
    }
}

impl ModuleTranslator for TrimStartFunc {
    fn translate_inplace(&self, module: &mut Module) -> Result<bool, ModuleError> {
        Ok(self.trim_startfunc(module))
    }

    fn translate(&self, module: &Module) -> Result<Option<Module>, ModuleError> {
        Err(ModuleError::NotSupported)
    }
}

#[cfg(test)]
mod tests {

    use super::*;
    use parity_wasm::elements::deserialize_buffer;

    #[test]
    fn start_removed() {
        let wasm: Vec<u8> = vec![
            0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60, 0x00, 0x00,
            0x03, 0x02, 0x01, 0x00, 0x07, 0x08, 0x01, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00,
            0x08, 0x01, 0x00, 0x0a, 0x04, 0x01, 0x02, 0x00, 0x0b,
        ];

        let mut module = deserialize_buffer::<Module>(&wasm).unwrap();

        let trimmer = TrimStartFunc::with_preset("ewasm").unwrap();
        trimmer.translate_inplace(&mut module).unwrap();

        let result = serialize::<Module>(module).unwrap();
        let expect: Vec<u8> = vec![
            0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60, 0x00, 0x00,
            0x03, 0x02, 0x01, 0x00, 0x07, 0x08, 0x01, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00,
            0x0a, 0x04, 0x01, 0x02, 0x00, 0x0b,
        ];

        assert_eq!(expect, result);
    }

    #[test]
    fn start_not_removed() {
        let wasm: Vec<u8> = vec![
            0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x04, 0x01, 0x60, 0x00, 0x00,
            0x03, 0x02, 0x01, 0x00, 0x07, 0x08, 0x01, 0x04, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00,
            0x0a, 0x04, 0x01, 0x02, 0x00, 0x0b,
        ];

        let mut module = deserialize_buffer::<Module>(&wasm).unwrap();

        let trimmer = TrimStartFunc::with_preset("ewasm").unwrap();
        trimmer.translate_inplace(&mut module).unwrap();

        let result = serialize::<Module>(module).unwrap();

        // result is equal to initial wasm (not changed)
        assert_eq!(result, wasm);
    }
}