| 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 "clean.h" | ||
| 7 | |||
| 8 | 76368 | ANN void free_func(Func a, Gwion gwion) { | |
| 9 |
2/2✓ Branch 1 taken 10139 times.
✓ Branch 2 taken 66229 times.
|
76368 | if (fflag(a, fflag_tmpl)) func_def_cleaner(gwion, a->def); |
| 10 |
2/2✓ Branch 0 taken 70918 times.
✓ Branch 1 taken 5450 times.
|
76368 | if (a->code) vmcode_remref(a->code, gwion); |
| 11 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 76363 times.
|
76368 | if (a->_wait) free_mp_vector(gwion->mp, Value, a->_wait); |
| 12 | 76368 | mp_free(gwion->mp, Func, a); | |
| 13 | 76368 | } | |
| 14 | |||
| 15 | 76699 | ANN Func new_func(MemPool p, const m_str name, const Func_Def def) { | |
| 16 | 76699 | Func func = mp_calloc(p, Func); | |
| 17 | 76699 | func->name = name; | |
| 18 | 76699 | func->def = def; | |
| 19 | 76699 | func->inline_mult = 1.0; | |
| 20 | 76699 | func->ref = 1; | |
| 21 | 76699 | return func; | |
| 22 | } | ||
| 23 | |||
| 24 | ANN2(1, 2) | ||
| 25 | 76991 | Symbol func_symbol(const Env env, const m_str nspc, const m_str base, | |
| 26 | 76991 | const m_str tmpl, const m_uint i) { | |
| 27 | 76991 | const size_t base_len = strlen(base); | |
| 28 |
2/2✓ Branch 0 taken 10387 times.
✓ Branch 1 taken 66604 times.
|
76991 | const size_t tmpl_len = !tmpl ? 0 : strlen(tmpl) + 4; |
| 29 | 76991 | const size_t nspc_len = strlen(nspc); | |
| 30 | 76991 | const size_t idx_len = num_digit(i); | |
| 31 | 76991 | const size_t len = base_len + tmpl_len + nspc_len + idx_len + 2; | |
| 32 | 76991 | char name[len + 1]; | |
| 33 |
7/8✓ Branch 0 taken 66604 times.
✓ Branch 1 taken 10387 times.
✓ Branch 2 taken 10387 times.
✓ Branch 3 taken 66604 times.
✓ Branch 4 taken 66604 times.
✓ Branch 5 taken 10387 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 76991 times.
|
76991 | CHECK_BO(sprintf(name, "%s%s%s%s@%" UINT_F "@%s", base, !tmpl ? "" : ":[", |
| 34 | !tmpl ? "" : tmpl, !tmpl ? "" : "]", i, nspc)); | ||
| 35 | 76991 | return insert_symbol(env->gwion->st, name); | |
| 36 | } | ||
| 37 | |||
| 38 | 70691 | ANN void builtin_func(const Gwion gwion, const Func f, void *func_ptr) { | |
| 39 | 70691 | set_vflag(f->value_ref, vflag_builtin); | |
| 40 | 70691 | f->code = new_vmcode(gwion->mp, NULL, NULL, f->name, f->def->stack_depth, true, false); | |
| 41 | 70691 | f->code->native_func = (m_uint)func_ptr; | |
| 42 | 70691 | f->code->ret_type = f->def->base->ret_type; | |
| 43 |
4/4✓ Branch 0 taken 10111 times.
✓ Branch 1 taken 60580 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 10110 times.
|
70691 | if(f->def->base->tmpl && f->def->base->tmpl->call) { |
| 44 | 1 | const Specialized *spec = mp_vector_at(f->def->base->tmpl->list, Specialized, f->def->base->tmpl->list->len - 1); | |
| 45 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(!strcmp(s_name(spec->xid), "...")) { |
| 46 | ✗ | f->code->types = new_mp_vector(gwion->mp, Type_Decl*, f->def->base->tmpl->call->len); | |
| 47 | ✗ | for(uint32_t i = 0; i < f->def->base->tmpl->call->len; i++) { | |
| 48 | ✗ | Type_Decl *const td = *mp_vector_at(f->def->base->tmpl->call, Type_Decl*, i); | |
| 49 | ✗ | mp_vector_set(f->code->types, Type, i, known_type(gwion->env, td)); | |
| 50 | } | ||
| 51 | } | ||
| 52 | } | ||
| 53 | 70691 | } | |
| 54 |