Gwion coverage report


Directory: src/
File: src/env/nspc.c
Date: 2023-01-30 18:32:28
Exec Total Coverage
Lines: 61 75 81.3%
Functions: 12 13 92.3%
Branches: 39 60 65.0%

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 "gwion.h"
6 #include "object.h"
7 #include "operator.h"
8
9 345 ANN void nspc_commit(const Nspc nspc) {
10 345 scope_commit(nspc->info->value);
11 345 scope_commit(nspc->info->func);
12 345 scope_commit(nspc->info->type);
13 345 scope_commit(nspc->info->trait);
14 345 }
15
16 2949 ANN static inline void nspc_release_object(const Nspc a, Value value,
17 Gwion gwion) {
18
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2944 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
2949 if ((GET_FLAG(value, static) && a->class_data) ||
19
4/4
✓ Branch 0 taken 2142 times.
✓ Branch 1 taken 802 times.
✓ Branch 3 taken 1914 times.
✓ Branch 4 taken 228 times.
2944 (value->d.ptr && vflag(value, vflag_builtin))) {
20 1919 const M_Object obj =
21 1919 value->d.ptr ? (M_Object)value->d.ptr
22
2/2
✓ Branch 0 taken 1914 times.
✓ Branch 1 taken 5 times.
1919 : *(M_Object *)(a->class_data + value->from->offset);
23 1919 release(obj, gwion->vm->cleaner_shred);
24 }
25 2949 }
26
27 ANN2(1, 3)
28 18 static inline void nspc_release_struct(const Nspc a, Value value, Gwion gwion) {
29
3/8
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 18 times.
36 if (value && ((GET_FLAG(value, static) && a->class_data) ||
30
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
18 (vflag(value, vflag_builtin) && value->d.ptr))) {
31 const m_bit *ptr =
32 (value && value->d.ptr)
33 ? (m_bit *)value->d.ptr
34 : (m_bit *)(a->class_data + value->from->offset);
35 for (m_uint i = 0; i < vector_size(&value->type->info->tuple->types); ++i) {
36 const Type t = (Type)vector_at(&value->type->info->tuple->types, i);
37 if (isa(t, gwion->type[et_object]) > 0)
38 release(*(M_Object *)(ptr +
39 vector_at(&value->type->info->tuple->offset, i)),
40 gwion->vm->cleaner_shred);
41 else if (tflag(t, tflag_struct))
42 nspc_release_struct(t->nspc, NULL, gwion);
43 }
44 }
45 18 }
46
47 192806 static inline void _free_nspc_value(const Nspc a, const Value v, Gwion gwion) {
48
4/4
✓ Branch 0 taken 1330 times.
✓ Branch 1 taken 191476 times.
✓ Branch 2 taken 69 times.
✓ Branch 3 taken 1261 times.
192806 if(v->from->ctx && v->from->ctx->error) return; // this is quite a hack
49
2/2
✓ Branch 1 taken 2967 times.
✓ Branch 2 taken 189770 times.
192737 if (tflag(v->type, tflag_compound) ) {
50
2/2
✓ Branch 1 taken 2949 times.
✓ Branch 2 taken 18 times.
2967 if (!tflag(v->type, tflag_struct))
51 2949 nspc_release_object(a, v, gwion);
52 18 else nspc_release_struct(a, v, gwion);
53 }
54 192737 value_remref(v, gwion);
55 }
56
57 #define describe_nspc_free(A, b, dofree) \
58 ANN static void nspc_free_##b(Nspc n, Gwion gwion) { \
59 struct scope_iter iter = {n->info->b, 0, 0}; \
60 A a; \
61 while (scope_iter(&iter, &a) > 0) dofree; \
62 free_scope(gwion->mp, n->info->b); \
63 }
64
65
2/2
✓ Branch 2 taken 192806 times.
✓ Branch 3 taken 24973 times.
217779 describe_nspc_free(Value, value, _free_nspc_value(n, a, gwion));
66
2/2
✓ Branch 2 taken 76368 times.
✓ Branch 3 taken 24973 times.
101341 describe_nspc_free(Func, func, func_remref(a, gwion));
67
2/2
✓ Branch 2 taken 103766 times.
✓ Branch 3 taken 24973 times.
128739 describe_nspc_free(Type, type, type_remref(a, gwion));
68
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 24973 times.
24973 describe_nspc_free(Trait, trait, free_trait(gwion->mp, a));
69
70 24973 ANN void free_nspc(const Nspc a, const Gwion gwion) {
71 24973 nspc_free_value(a, gwion);
72 24973 nspc_free_func(a, gwion);
73 24973 nspc_free_trait(a, gwion);
74
2/2
✓ Branch 0 taken 683 times.
✓ Branch 1 taken 24290 times.
24973 if(a->operators) {
75
1/2
✓ Branch 0 taken 683 times.
✗ Branch 1 not taken.
683 if (a->operators->map.ptr) free_op_map(&a->operators->map, gwion);
76
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 682 times.
683 if (a->operators->tmpl.ptr) free_op_tmpl(&a->operators->tmpl, gwion);
77 683 mp_free(gwion->mp, NspcOp, a->operators);
78 }
79 24973 nspc_free_type(a, gwion);
80
3/4
✓ Branch 0 taken 650 times.
✓ Branch 1 taken 24323 times.
✓ Branch 2 taken 650 times.
✗ Branch 3 not taken.
24973 if (a->class_data && a->class_data_size)
81 650 mp_free2(gwion->mp, a->class_data_size, a->class_data);
82
2/2
✓ Branch 0 taken 18460 times.
✓ Branch 1 taken 6513 times.
24973 if (a->vtable.ptr) vector_release(&a->vtable);
83 24973 mp_free(gwion->mp, NspcInfo, a->info);
84
2/2
✓ Branch 0 taken 10870 times.
✓ Branch 1 taken 14103 times.
24973 if (a->dtor) vmcode_remref(a->dtor, gwion);
85 24973 mp_free(gwion->mp, Nspc, a);
86 24973 }
87
88 25837 ANN Nspc new_nspc(MemPool p, const m_str name) {
89 25837 const Nspc a = mp_calloc(p, Nspc);
90 25837 a->name = name;
91 25837 a->info = mp_calloc(p, NspcInfo);
92 25837 a->info->value = new_scope(p);
93 25837 a->info->type = new_scope(p);
94 25837 a->info->func = new_scope(p);
95 25837 a->info->trait = new_scope(p);
96 25837 a->ref = 1;
97 25837 return a;
98 }
99
100 static nspc_add_value_t _add = _nspc_add_value;
101 static nspc_add_value_t _front = _nspc_add_value_front;
102 197140 ANN void nspc_add_value(const Nspc n, const Symbol s, const Value a) {
103 197140 _add(n, s, a);
104 197140 }
105 104934 ANN void nspc_add_value_front(const Nspc n, const Symbol s, const Value a) {
106 104934 _front(n, s, a);
107 104934 }
108
109 ANN void nspc_add_value_set_func(nspc_add_value_t add, nspc_add_value_t front) {
110 _add = add;
111 _front = front;
112 }
113
114