Gwion coverage report


Directory: src/
File: src/import/import_enum.c
Date: 2023-01-30 18:32:28
Exec Total Coverage
Lines: 36 38 94.7%
Functions: 4 4 100.0%
Branches: 16 26 61.5%

Line Branch Exec Source
1 //! \file enum.c
2 //! \brief enumerations utils
3
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 //! start an enum definition
18 //! \arg the importer
19 //! \arg string defining a primitive type
20 //! why is return type m_int ?
21
22 __attribute__ ((visibility ("default")))
23 640 ANN m_int gwi_enum_ini(const Gwi gwi, const m_str type) {
24
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 639 times.
640 CHECK_BB(ck_ini(gwi, ck_edef));
25
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 639 times.
639 CHECK_OB((gwi->ck->xid = gwi_str2sym(gwi, type)));
26 639 vector_init(&gwi->ck->v);
27 639 gwi->ck->tmpl = new_mp_vector(gwi->gwion->mp, Symbol, 0);
28 639 return GW_OK;
29 }
30 /*
31 // adds the id_list to the enum
32 // change that algo?
33 ANN static void add2list(struct ImportCK *ck, const ID_List list) {
34 if (!ck->tmpl) {
35 ck->tmpl = new_mp_vector(list, ;
36 } else {
37 ck->curr->next = list;
38 }
39 ck->curr = list;
40 }
41 */
42 //! add an enum entry
43 //! \arg the importer
44 //! \arg name of the entry
45 //! TODO: change return type to m_bool
46 640 ANN m_int gwi_enum_add(const Gwi gwi, const m_str name, const m_uint i) {
47
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 639 times.
640 CHECK_BB(ck_ok(gwi, ck_edef));
48 // DECL_OB(const ID_List, list, = gwi_str2symlist(gwi, name));
49
50
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 639 times.
639 DECL_OB(const Symbol, xid, = gwi_str2sym(gwi, name));
51
1/2
✓ Branch 0 taken 639 times.
✗ Branch 1 not taken.
639 mp_vector_add(gwi->gwion->mp, &gwi->ck->tmpl, Symbol, xid);
52 // add2list(gwi->ck, list);
53 639 vector_add(&gwi->ck->v, (vtype)i);
54 639 return GW_OK;
55 }
56
57 //! set enum values
58 //! \arg the importer
59 //! \arg a vector of values
60 //! \note [internal]
61 638 ANN static void import_enum_end(const Gwi gwi, const Vector v) {
62 638 ImportCK *ck = gwi->ck;
63
2/2
✓ Branch 1 taken 638 times.
✓ Branch 2 taken 638 times.
1276 for (m_uint i = 0; i < vector_size(v); i++) {
64 638 const Value value = (Value)vector_at(v, i);
65 638 const m_uint addr = vector_at(&ck->v, i);
66 638 set_vflag(value, vflag_builtin);
67
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 638 times.
638 value->d.num = addr ?: i;
68 }
69 // better clean ?
70 638 }
71
72 //! finish enum import
73 //! \arg the importer
74 //! TODO: check what happens in inside template class
75 638 ANN Type gwi_enum_end(const Gwi gwi) {
76
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 638 times.
638 CHECK_BO(ck_ok(gwi, ck_edef));
77
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 638 times.
638 if (!vector_size(&gwi->ck->v)) GWI_ERR_O("Enum is empty");
78 638 const Gwion gwion = gwi->gwion;
79 const Enum_Def edef =
80 638 new_enum_def(gwion->mp, gwi->ck->tmpl, gwi->ck->xid, gwi->loc);
81 638 gwi->ck->tmpl = NULL;
82 638 const m_bool ret = traverse_enum_def(gwion->env, edef);
83
1/2
✓ Branch 0 taken 638 times.
✗ Branch 1 not taken.
638 if (ret > 0) import_enum_end(gwi, &edef->values);
84
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 638 times.
638 if (gwi->gwion->data->cdoc) {
85 gwfmt_indent(gwi->gwfmt);
86 gwfmt_enum_def(gwi->gwfmt, edef);
87 }
88
1/2
✓ Branch 0 taken 638 times.
✗ Branch 1 not taken.
638 const Type t = ret > 0 ? edef->type : NULL;
89
1/2
✓ Branch 0 taken 638 times.
✗ Branch 1 not taken.
638 if (edef->values.ptr) vector_release(&edef->values);
90 638 free_enum_def(gwion->mp, edef);
91 638 vector_release(&gwi->ck->v);
92 638 gwi->ck->v.ptr = NULL;
93 638 ck_end(gwi);
94 638 return t;
95 }
96