Line | Branch | Exec | Source |
---|---|---|---|
1 | #include "gwion_util.h" | ||
2 | #include "gwion_ast.h" | ||
3 | #include "gwion_env.h" | ||
4 | #include "vm.h" | ||
5 | #include "instr.h" | ||
6 | #include "emit.h" | ||
7 | #include "gwion.h" | ||
8 | #include "pass.h" | ||
9 | #include "traverse.h" | ||
10 | |||
11 | #define N_PASS 2 | ||
12 | #define N_SCANPASS 4 | ||
13 | |||
14 | static const m_str default_passes_name[2] = {"check", "emit"}; | ||
15 | static const compilation_pass default_passes[4] = {traverse_ast, emit_ast}; | ||
16 | static const m_str scan_passes_name[4] = {"scan0", "scan1", "scan2", | ||
17 | "type_check"}; | ||
18 | static const compilation_pass scan_passes[4] = {scan0_ast, scan1_ast, scan2_ast, | ||
19 | check_ast}; | ||
20 | |||
21 | 4242 | ANN void pass_register(const Gwion gwion, const m_str name, | |
22 | const compilation_pass pass) { | ||
23 | 4242 | const Symbol sym = insert_symbol(gwion->st, name); | |
24 | 4242 | map_set(&gwion->data->passes->map, (vtype)sym, (vtype)pass); | |
25 | 4242 | } | |
26 | |||
27 | 709 | ANN m_bool pass_set(const Gwion gwion, const Vector passes) { | |
28 | 709 | const Vector v = &gwion->data->passes->vec; | |
29 | 709 | vector_clear(v); | |
30 |
2/2✓ Branch 1 taken 1416 times.
✓ Branch 2 taken 707 times.
|
2123 | for (m_uint i = 0; i < vector_size(passes); ++i) { |
31 | 1416 | const m_str name = (m_str)vector_at(passes, i); | |
32 | 1416 | const Symbol sym = insert_symbol(gwion->st, name); | |
33 | 1416 | const compilation_pass pass = | |
34 | 1416 | (compilation_pass)map_get(&gwion->data->passes->map, (vtype)sym); | |
35 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1414 times.
|
1416 | if (!pass) { |
36 | /* | ||
37 | if(!strcmp(name, "none")) { | ||
38 | vector_clear(v); | ||
39 | return GW_OK; | ||
40 | } | ||
41 | */ | ||
42 | 2 | gw_err("Failed to set compilation passes, back to default\n"); | |
43 | 2 | pass_default(gwion); | |
44 | 2 | return GW_ERROR; | |
45 | } | ||
46 | 1414 | vector_add(v, (vtype)pass); | |
47 | } | ||
48 | 707 | return GW_OK; | |
49 | } | ||
50 | |||
51 | 707 | ANN void pass_default(const Gwion gwion) { | |
52 | struct Vector_ v; | ||
53 | 707 | vector_init(&v); | |
54 |
2/2✓ Branch 0 taken 1414 times.
✓ Branch 1 taken 707 times.
|
2121 | for (m_uint i = 0; i < N_PASS; ++i) |
55 | 1414 | vector_add(&v, (vtype)default_passes_name[i]); | |
56 | 707 | pass_set(gwion, &v); | |
57 | 707 | vector_release(&v); | |
58 | 707 | } | |
59 | |||
60 | 707 | ANEW ANN struct Passes_ *new_passes(const Gwion gwion) { | |
61 | 707 | struct Passes_ *a = gwion->data->passes = mp_calloc(gwion->mp, Passes); | |
62 | 707 | map_init(&a->map); | |
63 |
2/2✓ Branch 0 taken 1414 times.
✓ Branch 1 taken 707 times.
|
2121 | for (m_uint i = 0; i < N_PASS; ++i) |
64 | 1414 | pass_register(gwion, default_passes_name[i], default_passes[i]); | |
65 |
2/2✓ Branch 0 taken 2828 times.
✓ Branch 1 taken 707 times.
|
3535 | for (m_uint i = 0; i < N_SCANPASS; ++i) |
66 | 2828 | pass_register(gwion, scan_passes_name[i], scan_passes[i]); | |
67 | 707 | vector_init(&a->vec); | |
68 | 707 | return a; | |
69 | } | ||
70 | |||
71 | 707 | ANN void free_passes(const MemPool mp, struct Passes_ *a) { | |
72 | 707 | map_release(&a->map); | |
73 | 707 | vector_release(&a->vec); | |
74 | 707 | mp_free(mp, Passes, a); | |
75 | 707 | } | |
76 |