/
mod.rs
124 lines (96 loc) 路 2.34 KB
/
mod.rs
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use crate::*;
// generated by build script
include!(concat!(env!("OUT_DIR"), "/std_files.rs"));
#[no_mangle]
pub unsafe extern fn wasm_assemble(
format_str: *const String,
src: *mut String)
-> *mut String
{
let virtual_filename = "asm";
let format_str = std::mem::transmute::<_, &String>(format_str);
let src = std::mem::transmute::<_, &String>(src);
let mut report = diagn::Report::new();
let mut fileserver = util::FileServerMock::new();
fileserver.add(virtual_filename, src.clone());
fileserver.add_std_files(STD_FILES);
let opts = asm::AssemblyOptions::new();
let assembly = asm::assemble(
&mut report,
&opts,
&mut fileserver,
&[virtual_filename]);
let output = {
match assembly.output
{
Some(o) => o,
None =>
{
let mut err = Vec::<u8>::new();
report.print_all(&mut err, &fileserver, true);
return wasm_string_new_with(
String::from_utf8(err).unwrap());
}
}
};
let format = driver::parse_output_format(
&mut report,
format_str)
.unwrap();
let formatted = driver::format_output(
&fileserver,
&assembly.decls.as_ref().unwrap(),
&assembly.defs.as_ref().unwrap(),
&output,
format);
wasm_string_new_with(String::from_utf8_lossy(&formatted))
}
#[no_mangle]
pub unsafe extern fn wasm_get_version() -> *mut String
{
wasm_string_new_with(format!("v{}", env!("CARGO_PKG_VERSION")))
}
#[no_mangle]
pub unsafe extern fn wasm_string_new(len: u32) -> *mut String
{
let mut s = Box::new(String::new());
for _ in 0..len
{
s.push_str("\0");
}
Box::into_raw(s)
}
pub unsafe fn wasm_string_new_with<S>(s: S) -> *mut String
where S: Into<String>
{
let s = Box::new(s.into());
Box::into_raw(s)
}
#[no_mangle]
pub unsafe extern fn wasm_string_drop(s: *mut String)
{
let s = Box::from_raw(s);
drop(s);
}
#[no_mangle]
pub unsafe extern fn wasm_string_get_len(s: *mut String) -> u32
{
std::mem::transmute::<_, &mut String>(s).len() as u32
}
#[no_mangle]
pub unsafe extern fn wasm_string_get_byte(s: *mut String, index: u32) -> u8
{
std::ptr::read(
std::mem::transmute::<_, &mut String>(s)
.as_ptr()
.offset(index as isize))
}
#[no_mangle]
pub unsafe extern fn wasm_string_set_byte(s: *mut String, index: u32, value: u8)
{
let bytes = std::mem::transmute::<_, &mut String>(s).as_ptr();
std::ptr::write(
std::mem::transmute::<_, *mut u8>(bytes)
.offset(index as isize),
value)
}