Line | Branch | Exec | Source |
---|---|---|---|
1 | #include <stdlib.h> | ||
2 | #include <string.h> | ||
3 | #include <ctype.h> | ||
4 | #include "gwion_util.h" | ||
5 | #include "gwion_ast.h" | ||
6 | #include "gwion_env.h" | ||
7 | #include "vm.h" | ||
8 | #include "traverse.h" | ||
9 | #include "instr.h" | ||
10 | #include "emit.h" | ||
11 | #include "gwion.h" | ||
12 | #include "object.h" | ||
13 | #include "operator.h" | ||
14 | #include "import.h" | ||
15 | #include "gwi.h" | ||
16 | |||
17 | 11484 | ANN2(1) static Type get_parent(const Gwi gwi, const m_str parent_name) { | |
18 |
2/2✓ Branch 0 taken 3828 times.
✓ Branch 1 taken 7656 times.
|
11484 | Type_Decl *td = parent_name ? gwi_str2td(gwi, parent_name) : NULL; |
19 |
2/2✓ Branch 0 taken 3828 times.
✓ Branch 1 taken 7656 times.
|
11484 | if (td) { |
20 |
2/4✓ Branch 0 taken 3828 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3828 times.
|
3828 | if (td->array || td->types) { |
21 | ✗ | const m_str str = td->array ? "array" : "template"; | |
22 | ✗ | free_type_decl(gwi->gwion->mp, td); | |
23 | ✗ | GWI_ERR_O(_("can't use gwi_mk_type to extend %s types"), str) | |
24 | } | ||
25 | } | ||
26 |
2/2✓ Branch 0 taken 3828 times.
✓ Branch 1 taken 7656 times.
|
11484 | const Type parent = td ? known_type(gwi->gwion->env, td) : NULL; |
27 |
2/2✓ Branch 0 taken 3828 times.
✓ Branch 1 taken 7656 times.
|
11484 | if (td) free_type_decl(gwi->gwion->mp, td); |
28 | 11484 | return parent; | |
29 | } | ||
30 | |||
31 | ANN2(1, 2) | ||
32 | 11488 | Type gwi_mk_type(const Gwi gwi, const m_str name, const m_uint size, | |
33 | const m_str parent_name) { | ||
34 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 11488 times.
|
11488 | if (gwi->gwion->data->cdoc) { |
35 | ✗ | gwfmt_indent(gwi->gwfmt); | |
36 | ✗ | gwfmt_util(gwi->gwfmt, "{+C}primitive{0} {+}%s{0}", name); | |
37 | ✗ | if (parent_name) gwfmt_util(gwi->gwfmt, " {+C}extends{0} {+}%s{0}", parent_name); | |
38 | ✗ | gwfmt_sc(gwi->gwfmt); | |
39 | ✗ | gwfmt_nl(gwi->gwfmt); | |
40 | } | ||
41 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 11484 times.
|
11488 | CHECK_OO(gwi_str2sym(gwi, name)); |
42 | 11484 | const Type parent = get_parent(gwi, parent_name); | |
43 | 11484 | const Type t = new_type(gwi->gwion->mp, name, parent); | |
44 | 11484 | t->size = size; | |
45 |
2/2✓ Branch 1 taken 638 times.
✓ Branch 2 taken 10846 times.
|
11484 | if(safe_tflag(parent, tflag_float)) |
46 | 638 | set_tflag(t, tflag_float); | |
47 | 11484 | return t; | |
48 | } | ||
49 | |||
50 | 24882 | ANN void gwi_add_type(const Gwi gwi, const Type type) { | |
51 | 24882 | return env_add_type(gwi->gwion->env, type, gwi->loc); | |
52 | } | ||
53 | |||
54 | 10208 | ANN void gwi_set_global_type(const Gwi gwi, const Type type, | |
55 | const type_enum te) { | ||
56 | 10208 | gwi->gwion->type[te] = type; | |
57 | 10208 | gwi_add_type(gwi, type); | |
58 | 10208 | } | |
59 |