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 "template.h" | ||
6 | #include "traverse.h" | ||
7 | #include "parse.h" | ||
8 | #include "operator.h" | ||
9 | #include "gwion.h" | ||
10 | #include "object.h" | ||
11 | #include "instr.h" | ||
12 | #include "import.h" | ||
13 | #include "default_args.h" | ||
14 | #include "spread.h" | ||
15 | #include "closure.h" | ||
16 | |||
17 | ANN static m_bool scan2_stmt(const Env, const Stmt); | ||
18 | ANN static m_bool scan2_stmt_list(const Env, Stmt_List); | ||
19 | |||
20 | 12144 | ANN static inline m_bool ensure_scan2(const Env env, const Type t) { | |
21 |
6/6✓ Branch 1 taken 45 times.
✓ Branch 2 taken 12099 times.
✓ Branch 4 taken 34 times.
✓ Branch 5 taken 11 times.
✓ Branch 7 taken 29 times.
✓ Branch 8 taken 5 times.
|
12144 | if (tflag(t, tflag_scan2) || !(tflag(t, tflag_cdef) || tflag(t, tflag_udef))) |
22 | 12128 | return GW_OK; | |
23 | 16 | struct EnvSet es = {.env = env, | |
24 | .data = env, | ||
25 | .func = (_exp_func)scan2_cdef, | ||
26 | 16 | .scope = env->scope->depth, | |
27 | .flag = tflag_scan2}; | ||
28 | 16 | return envset_run(&es, t); | |
29 | } | ||
30 | |||
31 | 12144 | ANN static m_bool scan2_decl(const Env env, const Exp_Decl *decl) { | |
32 | 12144 | const Type t = decl->type; | |
33 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 12144 times.
|
12144 | CHECK_BB(ensure_scan2(env, t)); |
34 | 12144 | const Var_Decl vd = decl->vd; | |
35 | 12144 | nspc_add_value(env->curr, vd.xid, vd.value); | |
36 | 12144 | return GW_OK; | |
37 | } | ||
38 | |||
39 | 12144 | ANN m_bool scan2_exp_decl(const Env env, const Exp_Decl *decl) { | |
40 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 12140 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
|
12144 | if(decl->args) CHECK_BB(scan2_exp(env, decl->args)); |
41 | 12144 | const bool global = GET_FLAG(decl->td, global); | |
42 |
2/2✓ Branch 0 taken 12139 times.
✓ Branch 1 taken 5 times.
|
12144 | const m_uint scope = !global ? env->scope->depth : env_push_global(env); |
43 | 12144 | const m_bool ret = scan2_decl(env, decl); | |
44 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 12139 times.
|
12144 | if (global) env_pop(env, scope); |
45 | 12144 | return ret; | |
46 | } | ||
47 | |||
48 | 29460 | ANN static m_bool scan2_args(const Func_Def f) { | |
49 | 29460 | Arg_List args = f->base->args; | |
50 |
2/2✓ Branch 0 taken 36634 times.
✓ Branch 1 taken 29460 times.
|
66094 | for(uint32_t i = 0; i < args->len; i++) { |
51 | 36634 | Arg *arg = mp_vector_at(args, Arg, i); | |
52 | 36634 | const Value v = arg->var_decl.value; | |
53 | 36634 | v->from->offset = f->stack_depth; | |
54 | 36634 | f->stack_depth += v->type->size; | |
55 | 36634 | set_vflag(v, vflag_arg); | |
56 | } | ||
57 | 29460 | return GW_OK; | |
58 | } | ||
59 | |||
60 | 76699 | ANN static Value scan2_func_assign(const Env env, const Func_Def d, | |
61 | const Func f, const Value v) { | ||
62 | 76699 | valuefrom(env, v->from); | |
63 | 76699 | SET_FLAG(v, const); | |
64 | 76699 | set_vflag(v, vflag_func); | |
65 |
2/2✓ Branch 0 taken 4660 times.
✓ Branch 1 taken 72039 times.
|
76699 | if (!env->class_def) { |
66 |
2/2✓ Branch 0 taken 4658 times.
✓ Branch 1 taken 2 times.
|
4660 | if (!GET_FLAG(d->base, global)) set_vflag(v, vflag_fglobal); |
67 | } else { | ||
68 |
2/2✓ Branch 0 taken 8112 times.
✓ Branch 1 taken 63927 times.
|
72039 | if (GET_FLAG(d->base, static)) |
69 | 8112 | SET_FLAG(v, static); | |
70 | 63927 | else set_vflag(v, vflag_member); | |
71 |
3/4✓ Branch 0 taken 6819 times.
✓ Branch 1 taken 65220 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 65220 times.
|
72039 | SET_ACCESS(d->base, v) |
72 | } | ||
73 | 76699 | d->base->func = v->d.func_ref = f; | |
74 | 76699 | return f->value_ref = v; | |
75 | } | ||
76 | |||
77 | 6816 | ANN m_bool scan2_fptr_def(const Env env NUSED, const Fptr_Def fptr) { | |
78 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6816 times.
|
6816 | if(GET_FLAG(fptr->cdef, global)) env_push_global(env); |
79 | 6816 | const m_bool ret = scan2_class_def(env, fptr->cdef); | |
80 | 6816 | const Func_Def fdef = mp_vector_at(fptr->cdef->base.type->info->cdef->body, struct Section_ , 0)->d.func_def; | |
81 |
2/2✓ Branch 0 taken 2752 times.
✓ Branch 1 taken 4064 times.
|
6816 | if(fdef->base->func) set_fflag(fdef->base->func, fflag_fptr); |
82 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 4064 times.
|
4064 | else CHECK_BB(tmpl_fptr(env, fptr, fdef)); |
83 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6816 times.
|
6816 | if(GET_FLAG(fptr->cdef, global)) env_pop(env, 0); |
84 | 6816 | return ret; | |
85 | } | ||
86 | |||
87 | ANN static m_bool scan2_func_def_op(const Env env, const Func_Def f); | ||
88 | 17 | ANN m_bool scan2_type_def(const Env env, const Type_Def tdef) { | |
89 |
3/4✓ Branch 0 taken 3 times.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
|
17 | if (tdef->when) CHECK_BB(scan2_exp(env, tdef->when)); |
90 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 10 times.
|
17 | if (tflag(tdef->type, tflag_cdef)) |
91 | 7 | return scan2_class_def(env, tdef->type->info->cdef); | |
92 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (!tdef->type->info->cdef) return GW_OK; |
93 | ✗ | return tdef->type->info->cdef ? scan2_class_def(env, tdef->type->info->cdef) : GW_OK; | |
94 | } | ||
95 | |||
96 | 12 | ANN static m_bool scan2_range(const Env env, Range *range) { | |
97 |
3/4✓ Branch 0 taken 11 times.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 11 times.
|
12 | if (range->start) CHECK_BB(scan2_exp(env, range->start)); |
98 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
|
12 | if (range->end) CHECK_BB(scan2_exp(env, range->end)); |
99 | 12 | return GW_OK; | |
100 | } | ||
101 | |||
102 | 3848 | ANN static inline m_bool scan2_prim(const Env env, const Exp_Primary *prim) { | |
103 |
6/6✓ Branch 0 taken 2969 times.
✓ Branch 1 taken 879 times.
✓ Branch 2 taken 2966 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 2945 times.
|
3848 | if (prim->prim_type == ae_prim_hack || prim->prim_type == ae_prim_dict || prim->prim_type == ae_prim_interp) |
104 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 903 times.
|
903 | CHECK_BB(scan2_exp(env, prim->d.exp)); |
105 |
4/4✓ Branch 0 taken 20 times.
✓ Branch 1 taken 2925 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 1 times.
|
2945 | else if (prim->prim_type == ae_prim_array && prim->d.array->exp) |
106 | 19 | return scan2_exp(env, prim->d.array->exp); | |
107 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2923 times.
|
2926 | else if (prim->prim_type == ae_prim_range) |
108 | 3 | return scan2_range(env, prim->d.range); | |
109 | 3826 | return GW_OK; | |
110 | } | ||
111 | |||
112 | 28 | ANN static inline m_bool scan2_exp_array(const Env env, | |
113 | const Exp_Array *array) { | ||
114 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 28 times.
|
28 | CHECK_BB(scan2_exp(env, array->base)); |
115 | 28 | return scan2_exp(env, array->array->exp); | |
116 | } | ||
117 | |||
118 | 9 | ANN static inline m_bool scan2_exp_slice(const Env env, const Exp_Slice *exp) { | |
119 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
|
9 | CHECK_BB(scan2_exp(env, exp->base)); |
120 | 9 | return scan2_range(env, exp->range); | |
121 | } | ||
122 | |||
123 | 618 | ANN static inline m_bool scan2_exp_binary(const Env env, | |
124 | const Exp_Binary *bin) { | ||
125 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 618 times.
|
618 | CHECK_BB(scan2_exp(env, bin->lhs)); |
126 | 618 | return scan2_exp(env, bin->rhs); | |
127 | } | ||
128 | |||
129 | 19 | ANN static inline m_bool scan2_exp_cast(const Env env, const Exp_Cast *cast) { | |
130 | 19 | return scan2_exp(env, cast->exp); | |
131 | } | ||
132 | |||
133 | 34 | ANN static inline m_bool scan2_exp_post(const Env env, | |
134 | const Exp_Postfix *post) { | ||
135 | 34 | return scan2_exp(env, post->exp); | |
136 | } | ||
137 | |||
138 | 534 | ANN static inline m_bool scan2_exp_call(const Env env, | |
139 | const Exp_Call *exp_call) { | ||
140 |
2/2✓ Branch 0 taken 30 times.
✓ Branch 1 taken 504 times.
|
534 | if (exp_call->tmpl) return GW_OK; |
141 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 504 times.
|
504 | CHECK_BB(scan2_exp(env, exp_call->func)); |
142 | 504 | const Exp args = exp_call->args; | |
143 |
2/2✓ Branch 0 taken 292 times.
✓ Branch 1 taken 212 times.
|
504 | return args ? scan2_exp(env, args) : GW_OK; |
144 | } | ||
145 | |||
146 | 474 | ANN static inline m_bool scan2_exp_dot(const Env env, const Exp_Dot *member) { | |
147 | 474 | return scan2_exp(env, member->base); | |
148 | } | ||
149 | |||
150 | 9 | ANN static inline m_bool scan2_exp_if(const Env env, const Exp_If *exp_if) { | |
151 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
|
9 | CHECK_BB(scan2_exp(env, exp_if->cond)); |
152 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
|
9 | CHECK_BB(scan2_exp(env, exp_if->if_exp ?: exp_if->cond)); |
153 | 9 | return scan2_exp(env, exp_if->else_exp); | |
154 | } | ||
155 | |||
156 | 153 | ANN static m_bool scan2_exp_unary(const Env env, const Exp_Unary *unary) { | |
157 |
2/2✓ Branch 0 taken 77 times.
✓ Branch 1 taken 76 times.
|
153 | if (unary->unary_type == unary_exp) |
158 | 77 | return scan2_exp(env, unary->exp); | |
159 | 76 | return GW_OK; | |
160 | } | ||
161 | |||
162 | 11 | ANN static inline m_bool _scan2_stmt_match_case(const restrict Env env, | |
163 | const Stmt_Match stmt) { | ||
164 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
|
11 | CHECK_BB(scan2_exp(env, stmt->cond)); |
165 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
|
11 | if (stmt->when) CHECK_BB(scan2_exp(env, stmt->when)); |
166 | 11 | return scan2_stmt_list(env, stmt->list); | |
167 | } | ||
168 | |||
169 | 11 | ANN static inline m_bool scan2_stmt_match_case(const restrict Env env, | |
170 | const Stmt_Match stmt) { | ||
171 | 11 | RET_NSPC(_scan2_stmt_match_case(env, stmt))} | |
172 | |||
173 | ANN static inline m_bool | ||
174 | 7 | _scan2_stmt_match(const restrict Env env, const Stmt_Match stmt) { | |
175 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
7 | if (stmt->where) CHECK_BB(scan2_stmt(env, stmt->where)); |
176 | 7 | Stmt_List l = stmt->list; | |
177 |
2/2✓ Branch 0 taken 11 times.
✓ Branch 1 taken 7 times.
|
18 | for(m_uint i = 0; i < l->len; i++) { |
178 | 11 | const Stmt s = mp_vector_at(l, struct Stmt_, i); | |
179 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
|
11 | CHECK_BB(scan2_stmt_match_case(env, &s->d.stmt_match)); |
180 | } | ||
181 | 7 | return GW_OK; | |
182 | } | ||
183 | |||
184 | 3 | ANN static inline m_bool scan2_handler(const restrict Env env, | |
185 | const Handler *handler) { | ||
186 | 3 | RET_NSPC(scan2_stmt(env, handler->stmt)); | |
187 | } | ||
188 | |||
189 | 3 | ANN static inline m_bool scan2_handler_list(const restrict Env env, | |
190 | const Handler_List handlers) { | ||
191 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | for(uint32_t i = 0; i < handlers->len; i++) { |
192 | 3 | Handler * handler = mp_vector_at(handlers, Handler, i); | |
193 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
3 | CHECK_BB(scan2_handler(env, handler)); |
194 | } | ||
195 | 3 | return GW_OK; | |
196 | } | ||
197 | |||
198 | 3 | ANN static inline m_bool scan2_stmt_try(const restrict Env env, | |
199 | const Stmt_Try stmt) { | ||
200 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
3 | CHECK_BB(scan2_handler_list(env, stmt->handler)); |
201 | 3 | RET_NSPC(scan2_stmt(env, stmt->stmt)) | |
202 | } | ||
203 | |||
204 | 7 | ANN static inline m_bool scan2_stmt_match(const restrict Env env, | |
205 | const Stmt_Match stmt) { | ||
206 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
|
7 | CHECK_BB(scan2_exp(env, stmt->cond)); |
207 | 7 | RET_NSPC(_scan2_stmt_match(env, stmt)) | |
208 | } | ||
209 | |||
210 | #define scan2_exp_lambda dummy_func | ||
211 | #define scan2_exp_td dummy_func | ||
212 |
3/4✗ Branch 1 not taken.
✓ Branch 2 taken 17898 times.
✓ Branch 3 taken 428 times.
✓ Branch 4 taken 17470 times.
|
17898 | HANDLE_EXP_FUNC(scan2, m_bool, Env) |
213 | |||
214 | #define scan2_stmt_func(name, type, prolog, exp) \ | ||
215 | describe_stmt_func(scan2, name, type, prolog, exp) | ||
216 |
2/4✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
|
30 | scan2_stmt_func(flow, Stmt_Flow,, !(scan2_exp(env, stmt->cond) < 0 || |
217 | scan2_stmt(env, stmt->body) < 0) ? 1 : -1) | ||
218 |
6/10✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 2 times.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
|
8 | scan2_stmt_func(for, Stmt_For,, !(scan2_stmt(env, stmt->c1) < 0 || |
219 | scan2_stmt(env, stmt->c2) < 0 || | ||
220 | (stmt->c3 && scan2_exp(env, stmt->c3) < 0) || | ||
221 | scan2_stmt(env, stmt->body) < 0) ? 1 : -1) | ||
222 |
2/4✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
|
10 | scan2_stmt_func(each, Stmt_Each,, !(scan2_exp(env, stmt->exp) < 0 || |
223 | scan2_stmt(env, stmt->body) < 0) ? 1 : -1) | ||
224 |
2/4✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
|
9 | scan2_stmt_func(loop, Stmt_Loop,, !(scan2_exp(env, stmt->cond) < 0 || |
225 | scan2_stmt(env, stmt->body) < 0) ? 1 : -1) | ||
226 |
5/8✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 34 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 26 times.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
|
34 | scan2_stmt_func(if, Stmt_If,, !(scan2_exp(env, stmt->cond) < 0 || |
227 | scan2_stmt(env, stmt->if_body) < 0 || | ||
228 | (stmt->else_body && scan2_stmt(env, stmt->else_body) < 0)) ? 1 : -1) | ||
229 | |||
230 | 132 | ANN static inline m_bool scan2_stmt_code(const Env env, const Stmt_Code stmt) { | |
231 |
2/2✓ Branch 0 taken 131 times.
✓ Branch 1 taken 1 times.
|
132 | if (stmt->stmt_list) { RET_NSPC(scan2_stmt_list(env, stmt->stmt_list)) } |
232 | 1 | return GW_OK; | |
233 | } | ||
234 | |||
235 | 2151 | ANN static inline m_bool scan2_stmt_exp(const Env env, const Stmt_Exp stmt) { | |
236 |
2/2✓ Branch 0 taken 2132 times.
✓ Branch 1 taken 19 times.
|
2151 | return stmt->val ? scan2_exp(env, stmt->val) : 1; |
237 | } | ||
238 | |||
239 | 644 | ANN m_bool scan2_union_def(const Env env NUSED, const Union_Def udef) { | |
240 |
2/2✓ Branch 1 taken 638 times.
✓ Branch 2 taken 6 times.
|
644 | if (tmpl_base(udef->tmpl)) return GW_OK; |
241 | 6 | set_tflag(udef->type, tflag_scan2); | |
242 | 6 | return GW_OK; | |
243 | } | ||
244 | |||
245 | #define scan2_stmt_while scan2_stmt_flow | ||
246 | #define scan2_stmt_until scan2_stmt_flow | ||
247 | #define scan2_stmt_continue dummy_func | ||
248 | #define scan2_stmt_break dummy_func | ||
249 | #define scan2_stmt_return scan2_stmt_exp | ||
250 | #define scan2_stmt_retry dummy_func | ||
251 | |||
252 | 8 | ANN static m_bool scan2_stmt_pp(const Env env, const Stmt_PP stmt) { | |
253 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
|
8 | if (stmt->pp_type == ae_pp_include) env->name = stmt->data; |
254 | 8 | return GW_OK; | |
255 | } | ||
256 | |||
257 | ✗ | ANN static m_bool scan2_stmt_defer(const Env env, const Stmt_Defer stmt) { | |
258 | ✗ | return scan2_stmt(env, stmt->stmt); | |
259 | } | ||
260 | |||
261 | #define scan2_stmt_spread dummy_func | ||
262 | |||
263 | DECL_STMT_FUNC(scan2, m_bool, Env) | ||
264 | |||
265 | 2416 | ANN static m_bool scan2_stmt(const Env env, const Stmt stmt) { | |
266 | 2416 | return scan2_stmt_func[stmt->stmt_type](env, &stmt->d); | |
267 | } | ||
268 | |||
269 | 2467 | ANN static m_bool scan2_stmt_list(const Env env, Stmt_List l) { | |
270 |
2/2✓ Branch 0 taken 2294 times.
✓ Branch 1 taken 2467 times.
|
4761 | for(m_uint i = 0; i < l->len; i++) { |
271 | 2294 | const Stmt s = mp_vector_at(l, struct Stmt_, i); | |
272 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2294 times.
|
2294 | CHECK_BB(scan2_stmt(env, s)); |
273 | } | ||
274 | 2467 | return GW_OK; | |
275 | } | ||
276 | |||
277 | 10287 | ANN static m_bool scan2_func_def_overload(const Env env, const Func_Def f, | |
278 | const Value overload) { | ||
279 |
2/2✓ Branch 1 taken 1 times.
✓ Branch 2 taken 10286 times.
|
10287 | if (!is_func(env->gwion, overload->type)) { |
280 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | if (!fbflag(f->base, fbflag_internal)) |
281 | 1 | ERR_B(f->base->pos, | |
282 | _("function name '%s' is already used by another value"), | ||
283 | overload->name) | ||
284 | } | ||
285 | 10286 | const Func obase = overload->d.func_ref; | |
286 |
3/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10285 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
10286 | if (GET_FLAG(obase->def->base, final) && (!env->class_def || (obase->value_ref->from->owner_class != env->class_def))) { |
287 | 1 | env_err(env, f->base->pos, _("can't overload final function `{G}%s{0}`"), s_name(f->base->xid)); | |
288 | 1 | declared_here(obase->value_ref); | |
289 | 1 | return GW_ERROR; | |
290 | } | ||
291 | 10285 | const m_bool base = tmpl_base(f->base->tmpl); | |
292 | 10285 | const m_bool tmpl = fflag(obase, fflag_tmpl); | |
293 |
9/10✓ Branch 0 taken 10234 times.
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 10234 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 51 times.
✓ Branch 5 taken 10234 times.
✓ Branch 6 taken 44 times.
✓ Branch 7 taken 7 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 43 times.
|
10285 | if ((!tmpl && base) || (tmpl && !base && !f->base->tmpl)) |
294 | 1 | ERR_B(f->base->pos, _("must overload template function with template")) | |
295 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10284 times.
|
10284 | if (GET_FLAG(f->base, global) != GET_FLAG(obase->def->base, global)) |
296 | ✗ | ERR_B(f->base->pos, _("function is declared global")) // improve me | |
297 | 10284 | return GW_OK; | |
298 | } | ||
299 | |||
300 | 76699 | ANN static Func scan_new_func(const Env env, const Func_Def f, | |
301 | const m_str name) { | ||
302 | 76699 | const Func func = new_func(env->gwion->mp, name, f); | |
303 |
4/4✓ Branch 0 taken 72039 times.
✓ Branch 1 taken 4660 times.
✓ Branch 3 taken 23023 times.
✓ Branch 4 taken 49016 times.
|
76699 | if (env->class_def && tflag(env->class_def, tflag_tmpl)) |
304 | 23023 | set_fflag(func, fflag_ftmpl); | |
305 |
2/2✓ Branch 1 taken 17 times.
✓ Branch 2 taken 76682 times.
|
76699 | if (fbflag(f->base, fbflag_lambda)) { |
306 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 12 times.
|
17 | if(env->class_def) env->class_def->info->values = env->curr->info->value; |
307 | 17 | env->curr->info->value = new_scope(env->gwion->mp); | |
308 | } | ||
309 | 76699 | return func; | |
310 | } | ||
311 | |||
312 | 76699 | ANN static Type func_type(const Env env, const Func func) { | |
313 | 76699 | const Type base = env->gwion->type[et_function]; | |
314 | 76699 | const Type t = type_copy(env->gwion->mp, base); | |
315 | 76699 | t->info->parent = base; | |
316 | 76699 | t->name = func->name; | |
317 | 76699 | t->info->func = func; | |
318 | 76699 | return t; | |
319 | } | ||
320 | |||
321 | 66415 | ANN static void func_no_overload(const Env env, const Func f, const Value v) { | |
322 | 66415 | const Type t = v->type; | |
323 | 66415 | value_addref(v); | |
324 | 66415 | nspc_add_value_front(env->curr, f->def->base->xid, v); | |
325 | |||
326 | 66415 | const Type newt = type_copy(env->gwion->mp, t); | |
327 | 66415 | t->info->parent = newt; | |
328 | 66415 | newt->name = s_name(f->def->base->xid); | |
329 | 66415 | newt->info->func = f; | |
330 | 66415 | nspc_add_type_front(env->curr, f->def->base->xid, newt); | |
331 | 66415 | newt->info->value = v; | |
332 | 66415 | } | |
333 | |||
334 | ANN2(1, 2) | ||
335 | 76699 | static Value func_value(const Env env, const Func f, const Value overload) { | |
336 | 76699 | const Type t = func_type(env, f); | |
337 | 76699 | const Value v = t->info->value = new_value(env, t, t->name, f->def->base->pos); | |
338 | 76699 | valuefrom(env, v->from); | |
339 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 76699 times.
|
76699 | CHECK_OO(scan2_func_assign(env, f->def, f, v)); |
340 |
2/2✓ Branch 0 taken 66415 times.
✓ Branch 1 taken 10284 times.
|
76699 | if (!overload) |
341 | 66415 | func_no_overload(env, f, v); | |
342 |
1/2✓ Branch 0 taken 10284 times.
✗ Branch 1 not taken.
|
10284 | else if (overload->d.func_ref) { |
343 | 10284 | f->next = overload->d.func_ref->next; | |
344 | 10284 | overload->d.func_ref->next = f; | |
345 | } | ||
346 |
4/4✓ Branch 0 taken 72039 times.
✓ Branch 1 taken 4660 times.
✓ Branch 2 taken 63927 times.
✓ Branch 3 taken 8112 times.
|
76699 | if (env->class_def && !GET_FLAG(f->def->base, static)) |
347 | 63927 | set_vflag(v, vflag_member); | |
348 | 76699 | return v; | |
349 | } | ||
350 | |||
351 | ANN2(1, 2) | ||
352 | 10157 | static m_bool scan2_fdef_tmpl(const Env env, const Func_Def f, | |
353 | const Value overload) { | ||
354 | 10157 | const m_str name = s_name(f->base->xid); | |
355 | 10157 | const Func func = scan_new_func(env, f, name); | |
356 | 10157 | const Value value = func_value(env, func, overload); | |
357 | 10157 | set_fflag(func, fflag_tmpl); | |
358 | 10157 | set_vflag(value, vflag_valid); | |
359 | 10157 | set_tflag(value->type, | |
360 | tflag_ftmpl); // the only types with func flag, name could be better | ||
361 | 10157 | Type type = env->class_def; | |
362 | 10157 | Nspc nspc = env->curr; | |
363 | 10157 | uint i = 0; | |
364 | do { | ||
365 | 29762 | const Value v = nspc_lookup_value0(nspc, f->base->xid); | |
366 |
2/2✓ Branch 0 taken 10161 times.
✓ Branch 1 taken 19601 times.
|
29762 | if (v) { |
367 | 10161 | Func ff = v->d.func_ref; | |
368 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10161 times.
|
10161 | if (!ff) continue; |
369 | do { | ||
370 |
2/2✓ Branch 0 taken 10157 times.
✓ Branch 1 taken 17 times.
|
10174 | if (ff->def == f) { |
371 | 10157 | ++i; | |
372 | 10157 | continue; | |
373 | } | ||
374 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 13 times.
|
17 | if (compat_func(ff->def, f) > 0) { |
375 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | if (ff->value_ref->from->owner == env->curr) |
376 | ✗ | ERR_B(f->base->pos, | |
377 | "template function '%s' already defined with those arguments " | ||
378 | "in this namespace", | ||
379 | name) | ||
380 | const Symbol sym = | ||
381 | 4 | func_symbol(env, env->curr->name, name, "template", ff->def->vt_index); | |
382 | 4 | nspc_add_value(env->curr, sym, value); | |
383 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 | if (!overload) nspc_add_value(env->curr, f->base->xid, value); |
384 | 4 | nspc_add_func(env->curr, sym, func); | |
385 | 4 | func->def->vt_index = ff->def->vt_index; | |
386 | 4 | return GW_OK; | |
387 | } | ||
388 |
3/4✓ Branch 0 taken 13 times.
✓ Branch 1 taken 10157 times.
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
|
10170 | } while ((ff = ff->next) && ++i); |
389 | } | ||
390 |
5/6✓ Branch 0 taken 29734 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 29734 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 19605 times.
✓ Branch 5 taken 10129 times.
|
29758 | } while (type && (type = type->info->parent) && (nspc = type->nspc)); |
391 | 10153 | --i; | |
392 | 10153 | const Symbol sym = func_symbol(env, env->curr->name, name, "template", i); | |
393 | 10153 | nspc_add_value(env->curr, sym, value); | |
394 | 10153 | nspc_add_func(env->curr, sym, func); | |
395 |
2/2✓ Branch 0 taken 10146 times.
✓ Branch 1 taken 7 times.
|
10153 | if (!overload) nspc_add_value(env->curr, f->base->xid, value); |
396 | 7 | else func->def->vt_index = ++overload->from->offset; | |
397 | 10153 | return GW_OK; | |
398 | } | ||
399 | |||
400 | 22 | ANN static m_bool scan2_func_def_op(const Env env, const Func_Def f) { | |
401 | 22 | const m_str str = s_name(f->base->xid); | |
402 | 44 | struct Op_Func opfunc = {.ck = strcmp(str, "@implicit") ? 0 | |
403 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 17 times.
|
22 | : opck_usr_implicit}; |
404 | 22 | struct Op_Import opi = {.ret = f->base->ret_type, | |
405 | 22 | .pos = f->base->pos, | |
406 | 22 | .data = (uintptr_t)f->base->func, | |
407 | .func = &opfunc}; | ||
408 | 22 | func_operator(f, &opi); | |
409 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
|
22 | CHECK_BB(add_op(env->gwion, &opi)); |
410 | 22 | operator_set_func(&opi); | |
411 | 22 | return GW_OK; | |
412 | } | ||
413 | |||
414 | 1841 | ANN static m_bool scan2_func_def_code(const Env env, const Func_Def f) { | |
415 | 1841 | const Func former = env->func; | |
416 | 1841 | env->func = f->base->func; | |
417 | 1841 | const bool ctor = is_ctor(f); | |
418 |
2/2✓ Branch 0 taken 296 times.
✓ Branch 1 taken 1545 times.
|
1841 | if(!ctor) { |
419 | 296 | env->scope->depth++; | |
420 | 296 | nspc_push_value(env->gwion->mp, env->curr); | |
421 | } | ||
422 | 1841 | const m_bool ret = scan2_stmt_list(env, f->d.code); // scope depth? | |
423 |
2/2✓ Branch 0 taken 296 times.
✓ Branch 1 taken 1545 times.
|
1841 | if(!ctor) { |
424 | 296 | nspc_pop_value(env->gwion->mp, env->curr); | |
425 | 296 | env->scope->depth--; | |
426 | } | ||
427 | 1841 | env->func = former; | |
428 | 1841 | return ret; | |
429 | } | ||
430 | |||
431 | 66542 | ANN static void scan2_func_def_flag(const Env env, const Func_Def f) { | |
432 | 66542 | set_fflag(f->base->func, fflag_pure); | |
433 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 66540 times.
|
66542 | if (f->base->xid == insert_symbol("@dtor")) |
434 | 2 | set_tflag(env->class_def, tflag_dtor); | |
435 | 66542 | } | |
436 | |||
437 | |||
438 | 56 | ANN static m_str func_tmpl_name(const Env env, const Func_Def f) { | |
439 | 56 | const m_str name = s_name(f->base->xid); | |
440 | 56 | m_str tmpl_name = tl2str(env->gwion, f->base->tmpl->call, f->base->pos); | |
441 | 56 | const Symbol sym = func_symbol(env, env->curr->name, name, tmpl_name, | |
442 | 56 | (m_uint)f->vt_index); | |
443 | 56 | return s_name(sym); | |
444 | } | ||
445 | |||
446 | ANN2(1, 2, 4) | ||
447 | 66542 | static Value func_create(const Env env, const Func_Def f, const Value overload, | |
448 | const m_str name) { | ||
449 | 66542 | const Func func = scan_new_func(env, f, name); | |
450 | 66542 | nspc_add_func(env->curr, insert_symbol(func->name), func); | |
451 | 66542 | const Value v = func_value(env, func, overload); | |
452 | 66542 | scan2_func_def_flag(env, f); | |
453 | 66542 | nspc_add_value(env->curr, insert_symbol(func->name), v); | |
454 | 66542 | return v; | |
455 | } | ||
456 | |||
457 | ANN2(1, 2) | ||
458 | 66542 | static m_str func_name(const Env env, const Func_Def f, const Value v) { | |
459 |
2/2✓ Branch 0 taken 66486 times.
✓ Branch 1 taken 56 times.
|
66542 | if (!f->base->tmpl) { |
460 |
2/2✓ Branch 0 taken 10234 times.
✓ Branch 1 taken 56252 times.
|
76720 | const Symbol sym = func_symbol(env, env->curr->name, s_name(f->base->xid), |
461 | 10234 | NULL, v ? ++v->from->offset : 0); | |
462 | 66486 | return s_name(sym); | |
463 | } | ||
464 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 56 times.
|
56 | return f->base->func ? f->base->func->name : func_tmpl_name(env, f); |
465 | } | ||
466 | |||
467 | ANN2(1, 2) | ||
468 | 66542 | m_bool scan2_fdef_std(const Env env, const Func_Def f, const Value overload) { | |
469 | 66542 | const m_str name = func_name(env, f, overload); | |
470 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 66542 times.
|
66542 | if (!name) return GW_ERROR; |
471 | 66542 | const Func base = f->base->func; | |
472 |
1/2✓ Branch 0 taken 66542 times.
✗ Branch 1 not taken.
|
66542 | if (!base) |
473 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 66542 times.
|
66542 | CHECK_OB(func_create(env, f, overload, name)); |
474 |
3/4✓ Branch 0 taken 29460 times.
✓ Branch 1 taken 37082 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 29460 times.
|
66542 | if (f->base->args) CHECK_BB(scan2_args(f)); |
475 |
5/6✓ Branch 0 taken 4596 times.
✓ Branch 1 taken 61946 times.
✓ Branch 2 taken 1841 times.
✓ Branch 3 taken 2755 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1841 times.
|
66542 | if (!f->builtin && f->d.code) CHECK_BB(scan2_func_def_code(env, f)); |
476 |
1/2✓ Branch 0 taken 66542 times.
✗ Branch 1 not taken.
|
66542 | if (!base) { |
477 |
3/4✓ Branch 1 taken 22 times.
✓ Branch 2 taken 66520 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 22 times.
|
66542 | if (fbflag(f->base, fbflag_op)) CHECK_BB(scan2_func_def_op(env, f)); |
478 | 66542 | set_vflag(f->base->func->value_ref, vflag_valid); | |
479 | } | ||
480 |
2/2✓ Branch 0 taken 56 times.
✓ Branch 1 taken 66486 times.
|
66542 | if (f->base->tmpl) set_fflag(f->base->func, fflag_tmpl); |
481 | 66542 | return GW_OK; | |
482 | } | ||
483 | |||
484 | //! use function from parent class as next. | ||
485 | 69472 | ANN static void upfunction(const Env env, const Func_Base *fb) { | |
486 | 69472 | const Value v = find_value(env->class_def->info->parent, fb->xid); | |
487 |
2/2✓ Branch 0 taken 64327 times.
✓ Branch 1 taken 5145 times.
|
69472 | if (!v) return; |
488 | 5145 | Func func = fb->func; | |
489 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5145 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
5145 | while (func->next && func->next->value_ref->from->owner == env->curr) |
490 | ✗ | func = func->next; | |
491 | 5145 | func->next = v->d.func_ref; | |
492 | } | ||
493 | |||
494 | 76702 | ANN m_bool scan2_fdef(const Env env, const Func_Def fdef) { | |
495 | 76702 | const Value overload = nspc_lookup_value2(env->curr, fdef->base->xid); | |
496 |
4/4✓ Branch 0 taken 10287 times.
✓ Branch 1 taken 66415 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 10284 times.
|
76702 | if (overload) CHECK_BB(scan2_func_def_overload(env, fdef, overload)); |
497 |
3/4✓ Branch 1 taken 66542 times.
✓ Branch 2 taken 10157 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 76699 times.
|
76699 | CHECK_BB((!tmpl_base(fdef->base->tmpl) ? scan2_fdef_std : scan2_fdef_tmpl)( |
498 | env, fdef, overload)); | ||
499 |
4/4✓ Branch 0 taken 72039 times.
✓ Branch 1 taken 4660 times.
✓ Branch 2 taken 69472 times.
✓ Branch 3 taken 2567 times.
|
76699 | if (env->class_def && !fdef->base->func->next) upfunction(env, fdef->base); |
500 | 76699 | return GW_OK; | |
501 | } | ||
502 | |||
503 | __attribute__((returns_nonnull)) static ANN Func_Def | ||
504 | 10159 | scan2_cpy_fdef(const Env env, const Func_Def fdef) { | |
505 | 10159 | const Func_Def f = cpy_func_def(env->gwion->mp, fdef); | |
506 | 10159 | f->base->ret_type = fdef->base->ret_type; | |
507 | 10159 | scan0_func_def(env, f); | |
508 | 10159 | scan1_func_def(env, f); | |
509 | 10159 | return f; | |
510 | } | ||
511 | |||
512 | 76702 | static inline int is_cpy(const Func_Def fdef) { | |
513 |
2/2✓ Branch 0 taken 76700 times.
✓ Branch 1 taken 2 times.
|
153402 | return GET_FLAG(fdef->base, global) || |
514 |
4/4✓ Branch 0 taken 10213 times.
✓ Branch 1 taken 66487 times.
✓ Branch 2 taken 10157 times.
✓ Branch 3 taken 56 times.
|
76700 | (fdef->base->tmpl && !fdef->base->tmpl->call); |
515 | } | ||
516 | |||
517 | 76704 | ANN m_bool _scan2_func_def(const Env env, const Func_Def fdef) { | |
518 |
4/4✓ Branch 1 taken 10158 times.
✓ Branch 2 taken 66546 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 10157 times.
|
76704 | if (tmpl_base(fdef->base->tmpl) && fbflag(fdef->base, fbflag_op)) |
519 | 1 | return GW_OK; | |
520 |
2/2✓ Branch 0 taken 2010 times.
✓ Branch 1 taken 74693 times.
|
76703 | if(is_new(fdef)) { |
521 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2009 times.
|
2010 | if(!env->class_def) |
522 | 1 | ERR_B(fdef->base->pos, _("{G+}new{0} operator must be set inside {C+}class{0}")); | |
523 | 2009 | SET_FLAG(env->class_def, abstract); | |
524 |
2/2✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1991 times.
|
2009 | if(!fdef->base->ret_type) |
525 | // fdef->base->ret_type = env->class_def; | ||
526 | 18 | fdef->base->ret_type = env->gwion->type[et_auto]; | |
527 | } | ||
528 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 76700 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
76702 | if (GET_FLAG(fdef->base, global) && !env->class_def) env->context->global = 1; |
529 |
2/2✓ Branch 1 taken 10159 times.
✓ Branch 2 taken 66543 times.
|
76702 | const Func_Def f = !is_cpy(fdef) ? fdef : scan2_cpy_fdef(env, fdef); |
530 | 76702 | const m_uint scope = | |
531 |
2/2✓ Branch 0 taken 76700 times.
✓ Branch 1 taken 2 times.
|
76702 | !GET_FLAG(f->base, global) ? env->scope->depth : env_push_global(env); |
532 |
4/4✓ Branch 0 taken 72039 times.
✓ Branch 1 taken 4663 times.
✓ Branch 2 taken 63927 times.
✓ Branch 3 taken 8112 times.
|
140629 | f->stack_depth = (env->class_def && !GET_FLAG(f->base, static) && |
533 |
1/2✓ Branch 0 taken 63927 times.
✗ Branch 1 not taken.
|
63927 | !GET_FLAG(f->base, global)) |
534 | ? SZ_INT | ||
535 | : 0; | ||
536 | 76702 | const m_bool ret = scanx_fdef(env, env, f, (_exp_func)scan2_fdef); | |
537 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 76700 times.
|
76702 | if (GET_FLAG(f->base, global)) env_pop(env, scope); |
538 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 76699 times.
|
76702 | CHECK_BB(ret); |
539 | 76699 | fdef->base->func = f->base->func; // only needed if 'is_cpy()' | |
540 | 76699 | return GW_OK; | |
541 | } | ||
542 | |||
543 | 76704 | ANN m_bool scan2_func_def(const Env env, const Func_Def fdef) { | |
544 | 76704 | const uint16_t depth = env->scope->depth; | |
545 | 76704 | env->scope->depth = 0; | |
546 | 76704 | const m_bool ret = _scan2_func_def(env, fdef); | |
547 | 76704 | env->scope->depth = depth; | |
548 | 76704 | return ret; | |
549 | } | ||
550 | |||
551 | #define scan2_enum_def dummy_func | ||
552 | #define scan2_trait_def dummy_func | ||
553 | #define scan2_extend_def dummy_func | ||
554 | #define scan2_prim_def dummy_func | ||
555 | 29692 | HANDLE_SECTION_FUNC(scan2, m_bool, Env) | |
556 | |||
557 | 4155 | ANN static m_bool scan2_parent(const Env env, const Class_Def cdef) { | |
558 |
3/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 4150 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
|
4155 | if (cdef->base.ext->array && cdef->base.ext->array->exp) |
559 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
|
5 | CHECK_BB(scan2_exp(env, cdef->base.ext->array->exp)); |
560 | 4155 | return GW_OK; | |
561 | } | ||
562 | |||
563 | 4155 | ANN static m_bool cdef_parent(const Env env, const Class_Def cdef) { | |
564 | 4155 | const bool tmpl = !!cdef->base.tmpl; | |
565 |
3/4✓ Branch 0 taken 1357 times.
✓ Branch 1 taken 2798 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1357 times.
|
4155 | if (tmpl) CHECK_BB(template_push_types(env, cdef->base.tmpl)); |
566 | 4155 | const m_bool ret = scan2_parent(env, cdef); | |
567 |
2/2✓ Branch 0 taken 1357 times.
✓ Branch 1 taken 2798 times.
|
4155 | if (tmpl) nspc_pop_type(env->gwion->mp, env->curr); |
568 | 4155 | return ret; | |
569 | } | ||
570 | |||
571 | 8410 | ANN m_bool scan2_class_def(const Env env, const Class_Def cdef) { | |
572 |
2/2✓ Branch 1 taken 4075 times.
✓ Branch 2 taken 4335 times.
|
8410 | if (tmpl_base(cdef->base.tmpl)) return GW_OK; |
573 | 4335 | const Type t = cdef->base.type; | |
574 | 4335 | const Class_Def c = t->info->cdef; | |
575 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 4335 times.
|
4335 | if (tflag(t, tflag_scan2)) return GW_OK; |
576 | 4335 | set_tflag(t, tflag_scan2); | |
577 |
3/4✓ Branch 0 taken 4155 times.
✓ Branch 1 taken 180 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4155 times.
|
4335 | if (c->base.ext) CHECK_BB(cdef_parent(env, c)); |
578 |
2/2✓ Branch 0 taken 4302 times.
✓ Branch 1 taken 33 times.
|
4335 | if (c->body) { |
579 | 4302 | const m_uint scope = env_push_type(env, t); | |
580 | 4302 | const Tmpl *tmpl = cdef->base.tmpl; | |
581 |
5/8✓ Branch 0 taken 1367 times.
✓ Branch 1 taken 2935 times.
✓ Branch 2 taken 1367 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1367 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1367 times.
✗ Branch 7 not taken.
|
4302 | if(tmpl && tmpl->call && tmpl->call != (Type_List)1 && tmpl->list) |
582 | 1367 | template_push_types(env, tmpl); | |
583 | 4302 | const m_bool ret = scan2_ast(env, &c->body); | |
584 |
5/8✓ Branch 0 taken 1367 times.
✓ Branch 1 taken 2935 times.
✓ Branch 2 taken 1367 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1367 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1367 times.
✗ Branch 7 not taken.
|
4302 | if(tmpl && tmpl->call && tmpl->call != (Type_List)1 && tmpl->list) |
585 | 1367 | nspc_pop_type(env->gwion->mp, env->curr); | |
586 | 4302 | env_pop(env, scope); | |
587 | 4302 | return ret; | |
588 | } | ||
589 | 33 | return GW_OK; | |
590 | } | ||
591 | |||
592 | 3 | ANN void scan2_default_args(const Env env, const Section *s, Ast *acc) { | |
593 | 3 | Func_Base *const fb = s->d.func_def->base; | |
594 | 3 | Arg_List args = fb->args; | |
595 | 3 | uint32_t len = args->len; | |
596 |
1/2✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
|
7 | while(args->len--) { |
597 | 7 | const Arg *arg = mp_vector_at(args, Arg, args->len); | |
598 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 4 times.
|
7 | if(!arg->exp) break; |
599 | 4 | const Func_Def fdef = default_args(env, fb, acc, len); | |
600 | 4 | scan1_func_def(env, fdef); | |
601 | 4 | scan2_func_def(env, fdef); | |
602 | } | ||
603 | 3 | args->len = len; | |
604 | 3 | } | |
605 | |||
606 | 4814 | ANN m_bool scan2_ast(const Env env, Ast *ast) { | |
607 | 4814 | Ast a = *ast; | |
608 | 4814 | Ast acc = new_mp_vector(env->gwion->mp, Section, 0); | |
609 | 4814 | m_bool ret = GW_OK; | |
610 |
2/2✓ Branch 0 taken 29692 times.
✓ Branch 1 taken 4810 times.
|
34502 | for(m_uint i = 0; i < a->len; i++) { |
611 | 29692 | Section *section = mp_vector_at(a, Section, i); | |
612 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 29688 times.
|
29692 | if((ret = scan2_section(env, section)) < 0) break; |
613 |
4/4✓ Branch 0 taken 22159 times.
✓ Branch 1 taken 7529 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 22156 times.
|
51847 | if (section->section_type == ae_section_func && |
614 | 22159 | fbflag(section->d.func_def->base, fbflag_default)) { | |
615 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | mp_vector_add(env->gwion->mp, &acc, Section, *section); |
616 | } | ||
617 | } | ||
618 | |||
619 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 4814 times.
|
4817 | for(uint32_t i = 0; i < acc->len; i++) { |
620 | 3 | Section *section = mp_vector_at(acc, Section, i); | |
621 | 3 | scan2_default_args(env, section, ast); | |
622 | } | ||
623 | 4814 | free_mp_vector(env->gwion->mp, Section, acc); | |
624 | 4814 | return ret; | |
625 | } | ||
626 |