wabt_sys/
lib.rs

1use std::os::raw::{c_char, c_int, c_void};
2
3pub enum Features {}
4pub enum Errors {}
5pub enum WastLexer {}
6pub enum WabtParseWatResult {}
7pub enum WabtParseWastResult {}
8pub enum WasmModule {}
9pub enum WabtWriteModuleResult {}
10pub enum WabtReadBinaryResult {}
11pub enum OutputBuffer {}
12pub enum Script {}
13pub enum WabtWriteScriptResult {}
14
15#[derive(Debug, PartialEq, Eq)]
16#[repr(C)]
17pub enum Result {
18    Ok,
19    Error,
20}
21
22extern "C" {
23    pub fn wabt_new_features() -> *mut Features;
24
25    pub fn wabt_exceptions_enabled(features: *const Features) -> bool;
26    pub fn wabt_set_exceptions_enabled(features: *mut Features, enabled: c_int);
27    pub fn wabt_mutable_globals_enabled(features: *const Features) -> bool;
28    pub fn wabt_set_mutable_globals_enabled(features: *mut Features, enabled: c_int);
29    pub fn wabt_sat_float_to_int_enabled(features: *const Features) -> bool;
30    pub fn wabt_set_sat_float_to_int_enabled(features: *mut Features, enabled: c_int);
31    pub fn wabt_sign_extension_enabled(features: *const Features) -> bool;
32    pub fn wabt_set_sign_extension_enabled(features: *mut Features, enabled: c_int);
33    pub fn wabt_simd_enabled(features: *const Features) -> bool;
34    pub fn wabt_set_simd_enabled(features: *mut Features, enabled: c_int);
35    pub fn wabt_threads_enabled(features: *const Features) -> bool;
36    pub fn wabt_set_threads_enabled(features: *mut Features, enabled: c_int);
37    pub fn wabt_multi_value_enabled(features: *const Features) -> bool;
38    pub fn wabt_set_multi_value_enabled(features: *mut Features, enabled: c_int);
39    pub fn wabt_tail_call_enabled(features: *const Features) -> bool;
40    pub fn wabt_set_tail_call_enabled(features: *mut Features, enabled: c_int);
41    pub fn wabt_bulk_memory_enabled(features: *const Features) -> bool;
42    pub fn wabt_set_bulk_memory_enabled(features: *mut Features, enabled: c_int);
43    pub fn wabt_reference_types_enabled(features: *const Features) -> bool;
44    pub fn wabt_set_reference_types_enabled(features: *mut Features, enabled: c_int);
45    pub fn wabt_annotations_enabled(features: *const Features) -> bool;
46    pub fn wabt_set_annotations_enabled(features: *mut Features, enabled: c_int);
47
48    pub fn wabt_destroy_features(features: *mut Features);
49
50    pub fn wabt_new_wast_buffer_lexer(
51        filename: *const c_char,
52        data: *const c_void,
53        size: usize,
54    ) -> *mut WastLexer;
55
56    pub fn wabt_destroy_wast_lexer(lexer: *mut WastLexer);
57
58    pub fn wabt_new_errors() -> *mut Errors;
59
60    pub fn wabt_format_text_errors(errors: *mut Errors, lexer: *mut WastLexer)
61        -> *mut OutputBuffer;
62
63    pub fn wabt_format_binary_errors(errors: *mut Errors) -> *mut OutputBuffer;
64
65    pub fn wabt_destroy_errors(errors: *mut Errors);
66
67    pub fn wabt_parse_wat(
68        lexer: *mut WastLexer,
69        features: *mut Features,
70        errors: *mut Errors,
71    ) -> *mut WabtParseWatResult;
72
73    pub fn wabt_parse_wast(
74        lexer: *mut WastLexer,
75        features: *mut Features,
76        errors: *mut Errors,
77    ) -> *mut WabtParseWastResult;
78
79    pub fn wabt_parse_wat_result_get_result(result: *mut WabtParseWatResult) -> Result;
80
81    pub fn wabt_parse_wat_result_release_module(result: *mut WabtParseWatResult)
82        -> *mut WasmModule;
83
84    pub fn wabt_destroy_parse_wat_result(result: *mut WabtParseWatResult);
85
86    pub fn wabt_resolve_names_module(module: *mut WasmModule, errors: *mut Errors) -> Result;
87
88    pub fn wabt_apply_names_module(module: *mut WasmModule) -> Result;
89
90    pub fn wabt_generate_names_module(module: *mut WasmModule) -> Result;
91
92    pub fn wabt_validate_module(
93        module: *mut WasmModule,
94        features: *mut Features,
95        erros: *mut Errors,
96    ) -> Result;
97
98    pub fn wabt_destroy_module(module: *mut WasmModule);
99
100    pub fn wabt_write_binary_module(
101        module: *mut WasmModule,
102        log: c_int,
103        canonicalize_lebs: c_int,
104        relocatable: c_int,
105        write_debug_name: c_int,
106    ) -> *mut WabtWriteModuleResult;
107
108    pub fn wabt_write_module_result_get_result(result: *mut WabtWriteModuleResult) -> Result;
109
110    pub fn wabt_write_module_result_release_output_buffer(
111        result: *mut WabtWriteModuleResult,
112    ) -> *mut OutputBuffer;
113
114    pub fn wabt_destroy_write_module_result(result: *mut WabtWriteModuleResult);
115
116    pub fn wabt_output_buffer_get_data(buffer: *mut OutputBuffer) -> *const c_void;
117
118    pub fn wabt_output_buffer_get_size(buffer: *mut OutputBuffer) -> usize;
119
120    pub fn wabt_destroy_output_buffer(buffer: *mut OutputBuffer);
121
122    pub fn wabt_resolve_names_script(script: *mut Script, errors: *mut Errors) -> Result;
123
124    pub fn wabt_validate_script(
125        script: *mut Script,
126        features: *mut Features,
127        errors: *mut Errors,
128    ) -> Result;
129
130    pub fn wabt_write_binary_spec_script(
131        script: *mut Script,
132        source_filename: *const c_char,
133        out_filename: *const c_char,
134        log: c_int,
135        canonicalize_lebs: c_int,
136        relocatable: c_int,
137        write_debug_name: c_int,
138    ) -> *mut WabtWriteScriptResult;
139
140    pub fn wabt_read_binary(
141        data: *const u8,
142        size: usize,
143        read_debug_names: c_int,
144        features: *mut Features,
145        errors: *mut Errors,
146    ) -> *mut WabtReadBinaryResult;
147
148    pub fn wabt_parse_wast_result_get_result(result: *mut WabtParseWastResult) -> Result;
149
150    pub fn wabt_parse_wast_result_release_module(result: *mut WabtParseWastResult) -> *mut Script;
151
152    pub fn wabt_destroy_parse_wast_result(result: *mut WabtParseWastResult);
153
154    pub fn wabt_read_binary_result_get_result(result: *mut WabtReadBinaryResult) -> Result;
155
156    pub fn wabt_read_binary_result_release_module(
157        result: *mut WabtReadBinaryResult,
158    ) -> *mut WasmModule;
159
160    pub fn wabt_destroy_read_binary_result(result: *mut WabtReadBinaryResult);
161
162    pub fn wabt_write_text_module(
163        module: *mut WasmModule,
164        fold_exprs: c_int,
165        inline_export: c_int,
166    ) -> *mut WabtWriteModuleResult;
167
168    // WabtWriteScriptResult
169
170    pub fn wabt_write_script_result_get_result(result: *mut WabtWriteScriptResult) -> Result;
171
172    pub fn wabt_write_script_result_release_json_output_buffer(
173        result: *mut WabtWriteScriptResult,
174    ) -> *mut OutputBuffer;
175
176    pub fn wabt_write_script_result_release_log_output_buffer(
177        result: *mut WabtWriteScriptResult,
178    ) -> *mut OutputBuffer;
179
180    pub fn wabt_write_script_result_get_module_count(result: *mut WabtWriteScriptResult) -> usize;
181
182    pub fn wabt_write_script_result_get_module_filename(
183        result: *mut WabtWriteScriptResult,
184        index: usize,
185    ) -> *const c_char;
186
187    pub fn wabt_write_script_result_release_module_output_buffer(
188        result: *mut WabtWriteScriptResult,
189        index: usize,
190    ) -> *mut OutputBuffer;
191
192    pub fn wabt_destroy_write_script_result(result: *mut WabtWriteScriptResult);
193}
194
195#[test]
196fn parse_wasm() {
197    use std::ptr;
198
199    let data: &[u8] = &[
200        0, 97, 115, 109, // \0ASM - magic
201        1, 0, 0, 0, //    01 - version
202    ];
203
204    unsafe {
205        let errors = wabt_new_errors();
206        let features = wabt_new_features();
207        let result = wabt_read_binary(data.as_ptr(), data.len(), true as c_int, features, errors);
208        assert_eq!(wabt_read_binary_result_get_result(result), Result::Ok);
209        let module = wabt_read_binary_result_release_module(result);
210
211        wabt_destroy_read_binary_result(result);
212
213        let result = wabt_write_text_module(module, 0, 0);
214        assert_eq!(wabt_write_module_result_get_result(result), Result::Ok);
215        let output_buffer = wabt_write_module_result_release_output_buffer(result);
216
217        let data = wabt_output_buffer_get_data(output_buffer);
218        let size = wabt_output_buffer_get_size(output_buffer);
219
220        let mut buf: Vec<u8> = Vec::with_capacity(size);
221        ptr::copy_nonoverlapping(data as *const u8, buf.as_mut_ptr(), size);
222        buf.set_len(size);
223
224        let text = String::from_utf8(buf).unwrap();
225        assert_eq!(&text, "(module)\n");
226
227        wabt_destroy_features(features);
228        wabt_destroy_errors(errors);
229    }
230}