| 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 "template.h" | ||
| 7 | |||
| 8 | 154 | ANN static void check(struct EnvSet *es, const Type t) { | |
| 9 | 154 | es->_ctx = es->env->context; | |
| 10 | 154 | es->_filename = es->env->name; | |
| 11 | 154 | const Vector v = &es->env->scope->class_stack; | |
| 12 | 154 | Type owner = t->info->value->from->owner_class; | |
| 13 |
3/4✓ Branch 1 taken 4 times.
✓ Branch 2 taken 150 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
|
154 | for (vtype i = vector_size(v) + 1; owner && --i;) { |
| 14 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | if (owner != (Type)vector_at(v, i - 1)) { |
| 15 | 4 | es->run = 1; | |
| 16 | 4 | return; | |
| 17 | } | ||
| 18 | ✗ | owner = owner->info->value->from->owner_class; | |
| 19 | } | ||
| 20 | } | ||
| 21 | |||
| 22 | 4 | ANN static m_bool push(struct EnvSet *es, const Type t) { | |
| 23 | 4 | es->env->scope->depth = 0; | |
| 24 | 4 | const Type owner_class = t->info->value->from->owner_class; | |
| 25 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | if (owner_class) |
| 26 | ✗ | CHECK_BB(push(es, owner_class)); | |
| 27 | else | ||
| 28 | 4 | env_push(es->env, NULL, | |
| 29 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
4 | t->info->value->from->ctx ? t->info->value->from->ctx->nspc |
| 30 | ✗ | : es->env->curr); | |
| 31 | 4 | env_push_type((void *)es->env, t); // do not push if is a function? | |
| 32 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | if (tflag(t, tflag_tmpl)) |
| 33 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
|
4 | CHECK_BB(template_push_types( |
| 34 | es->env, t->info->cdef->base.tmpl)); // incorrect templates? | ||
| 35 | 4 | return GW_OK; | |
| 36 | } | ||
| 37 | |||
| 38 | ANN2(1, 3) | ||
| 39 | 831 | m_bool envset_push(struct EnvSet *es, const Type t, const Nspc nspc) { | |
| 40 |
2/2✓ Branch 0 taken 97 times.
✓ Branch 1 taken 734 times.
|
831 | if (t) { |
| 41 | 97 | check(es, t); | |
| 42 | // if(es->run && type_global(es->env, t)) | ||
| 43 | // env_push_global(es->env); | ||
| 44 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 97 times.
|
97 | return es->run ? push(es, t) : GW_OK; |
| 45 | } | ||
| 46 |
2/2✓ Branch 0 taken 644 times.
✓ Branch 1 taken 90 times.
|
734 | if (nspc != es->env->curr) { |
| 47 | 644 | env_push(es->env, NULL, nspc); | |
| 48 | 644 | es->run = 1; | |
| 49 | } | ||
| 50 | 734 | return GW_OK; | |
| 51 | } | ||
| 52 | |||
| 53 | 648 | ANN2(1) static void _envset_pop(struct EnvSet *es, const Type t) { | |
| 54 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 2 taken 644 times.
|
648 | if (safe_tflag(t, tflag_tmpl)) // might not be useful |
| 55 | 4 | nspc_pop_type(es->env->gwion->mp, es->env->curr); | |
| 56 | 648 | env_pop(es->env, es->scope); | |
| 57 |
2/2✓ Branch 0 taken 644 times.
✓ Branch 1 taken 4 times.
|
648 | if (!t) return; |
| 58 | 4 | const Type owner_class = t->info->value->from->owner_class; | |
| 59 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
|
4 | if (owner_class) |
| 60 | ✗ | envset_pop(es, owner_class); | |
| 61 | else | ||
| 62 | 4 | env_pop(es->env, es->scope); | |
| 63 | } | ||
| 64 | |||
| 65 | 888 | ANN2(1) void envset_pop(struct EnvSet *es, const Type t) { | |
| 66 |
2/2✓ Branch 0 taken 648 times.
✓ Branch 1 taken 240 times.
|
888 | if(es->run) _envset_pop(es, t); |
| 67 | // if(t && type_global(es->env, t)) | ||
| 68 | // env_pop(es->env, es->scope); | ||
| 69 |
2/2✓ Branch 0 taken 250 times.
✓ Branch 1 taken 638 times.
|
888 | if (es->_ctx) es->env->context = es->_ctx; |
| 70 |
1/2✓ Branch 0 taken 888 times.
✗ Branch 1 not taken.
|
888 | if (es->_filename) es->env->name = es->_filename; |
| 71 | 888 | } | |
| 72 | |||
| 73 | 57 | ANN m_bool envset_run(struct EnvSet *es, const Type t) { | |
| 74 | 57 | check(es, t); | |
| 75 | 57 | const Type owner_class = t->info->value->from->owner_class; | |
| 76 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 53 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
|
57 | if (es->run) CHECK_BB(push(es, owner_class)); |
| 77 | 57 | es->env->context = t->info->value->from->ctx; | |
| 78 | 57 | es->env->name = t->info->value->from->filename; | |
| 79 | 57 | const m_bool ret = | |
| 80 |
2/4✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
|
57 | t->info->cdef && !(t->tflag & es->flag) ? es->func(es->data, t) : GW_OK; |
| 81 | 57 | envset_pop(es, owner_class); | |
| 82 | 57 | return ret; | |
| 83 | } | ||
| 84 |