Gwion coverage report


Directory: src/
File: src/parse/default_arg.c
Date: 2023-01-30 18:32:28
Exec Total Coverage
Lines: 37 44 84.1%
Functions: 6 7 85.7%
Branches: 6 8 75.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 "traverse.h"
7
8 4 ANN2(1,2) static Exp base_args(const MemPool p, const Arg_List args, Exp next, const uint32_t min) {
9
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 4 times.
9 for(uint32_t i = min; i--;) {
10 5 Arg *arg = mp_vector_at(args, Arg, i);
11 5 const Exp exp = new_prim_id(p, arg->var_decl.xid, arg->var_decl.pos);
12 5 exp->next = next;
13 5 next = exp;
14 }
15 4 return next;
16 }
17
18 4 ANN static Exp additional_args(const MemPool p, const Arg_List args, const uint32_t max) {
19 4 Exp next = NULL;
20
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 4 times.
9 for(uint32_t i = max; i-- > args->len;) {
21 5 Arg *arg = mp_vector_at(args, Arg, i);
22 5 const Exp exp = cpy_exp(p, arg->exp);
23 5 exp->next = next;
24 5 next = exp;
25 }
26 4 return next;
27 }
28
29 4 ANN static Exp mk_args(const MemPool p, const Arg_List args, const uint32_t max) {
30 4 const Exp next = additional_args(p, args, max);
31 4 return base_args(p, args, next, args->len);
32 }
33
34 4 ANN static Stmt_List code(const MemPool p, const Exp func, const Arg_List lst,
35 const uint32_t max, const ae_stmt_t type) {
36 4 const Exp arg = mk_args(p, lst, max);
37 4 const Exp call = new_exp_call(p, func, arg, func->pos);
38 4 Stmt_List code = new_mp_vector(p, struct Stmt_, 1);
39 4 mp_vector_set(code, struct Stmt_, 0,
40 ((struct Stmt_) {
41 .stmt_type = type, .d = { .stmt_exp = { .val = call }},
42 .pos = func->pos
43 }));
44 4 return code;
45 }
46
47 4 ANN static Stmt_List std_code(const Env env, Func_Base *base, const uint32_t max) {
48 4 const MemPool p = env->gwion->mp;
49 4 const Exp func = new_prim_id(p, base->xid, base->pos);
50 4 return code(p, func, base->args, max, ae_stmt_return);
51 }
52
53 ANN static Stmt_List new_code(const Env env, Func_Base *base, const uint32_t max) {
54 const MemPool p = env->gwion->mp;
55 SymTable *st = env->gwion->st;
56 const Exp dbase = new_prim_id(p, insert_symbol(st, "this"), base->pos);
57 const Symbol sym = insert_symbol(st, "new");
58 const Exp func = new_exp_dot(p, dbase, sym, base->pos);
59 return code(p, func, base->args, max, ae_stmt_exp);
60 }
61
62
63 4 ANN Func_Def default_args(const Env env, Func_Base *fb, Ast *acc, uint32_t max) {
64 4 Func_Base *const base = cpy_func_base(env->gwion->mp, fb);
65 8 Stmt_List code = strcmp(s_name(base->xid), "new")
66 4 ? std_code(env, fb, max)
67
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 : new_code(env, fb, max);
68 4 const Func_Def fdef = new_func_def(env->gwion->mp, base, code);
69 4 Section section = MK_SECTION(func, func_def, fdef);
70
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 mp_vector_add(env->gwion->mp, acc, Section, section);
71 4 return fdef;
72 }
73