/
object.rs
80 lines (79 loc) · 3.02 KB
/
object.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
use crate::corelib::create_method;
use crate::hir::*;
use inkwell::values::*;
pub fn create_methods() -> Vec<SkMethod> {
vec![
create_method("Object", "initialize() -> Void", |code_gen, _function| {
code_gen.build_return_void();
Ok(())
}),
create_method("Object", "putd(n: Int) -> Void", |code_gen, function| {
let sk_int = function.get_params()[1];
let n = code_gen.unbox_int(sk_int);
let printf = code_gen.module.get_function("printf").unwrap();
let tmpl = code_gen
.module
.get_global("putd_tmpl")
.unwrap()
.as_pointer_value();
let tmpl_ptr = unsafe {
tmpl.const_in_bounds_gep(&[
code_gen.i32_type.const_int(0, false),
code_gen.i32_type.const_int(0, false),
])
};
code_gen
.builder
.build_call(printf, &[tmpl_ptr.into(), n.into()], "");
code_gen.build_return_void();
Ok(())
}),
create_method("Object", "putf(n: Float) -> Void", |code_gen, function| {
let arg = function.get_params()[1];
let n = code_gen.unbox_float(arg);
let printf = code_gen.module.get_function("printf").unwrap();
let tmpl = code_gen
.module
.get_global("putf_tmpl")
.unwrap()
.as_pointer_value();
let tmpl_ptr = unsafe {
tmpl.const_in_bounds_gep(&[
code_gen.i32_type.const_int(0, false),
code_gen.i32_type.const_int(0, false),
])
};
code_gen
.builder
.build_call(printf, &[tmpl_ptr.into(), n.into()], "");
code_gen.build_return_void();
Ok(())
}),
create_method("Object", "puts(s: String) -> Void", |code_gen, function| {
let sk_str = function.get_params()[1];
let s = code_gen.builder
.build_bitcast(sk_str, code_gen.i8ptr_type, "");
let func = code_gen.module.get_function("shiika_puts").unwrap();
code_gen.builder.build_call(func, &[s.into()], "");
code_gen.build_return_void();
Ok(())
}),
create_method(
"Object",
"exit(status: Int) -> Never",
|code_gen, function| {
let sk_int = function.get_params()[1];
let int64 = code_gen.unbox_int(sk_int);
let int32 = code_gen
.builder
.build_int_truncate(int64, code_gen.i32_type, "int32");
let func = code_gen.module.get_function("exit").unwrap();
code_gen
.builder
.build_call(func, &[int32.as_basic_value_enum()], "");
code_gen.builder.build_return(None);
Ok(())
},
),
]
}