Gwion coverage report


Directory: src/
File: src/lib/lib_class.c
Date: 2023-01-30 18:32:28
Exec Total Coverage
Lines: 21 30 70.0%
Functions: 2 7 28.6%
Branches: 3 16 18.8%

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 "instr.h"
6 #include "emit.h"
7 #include "gwion.h"
8 #include "object.h"
9 #include "operator.h"
10 #include "import.h"
11 #include "gwi.h"
12 #include "gack.h"
13 #include "traverse.h"
14
15 #define mk_class_instr(op, arg0, arg1, ...) \
16 static INSTR(instr_class_##op) { \
17 POP_REG(shred, SZ_INT); \
18 const Type l = *(Type *)(shred->reg - SZ_INT); \
19 const Type r = *(Type *)(shred->reg); \
20 *(m_uint *)(shred->reg - SZ_INT) = isa(arg0, arg1) > 0 __VA_ARGS__; \
21 }
22 mk_class_instr(ge, l, r) mk_class_instr(gt, l, r, &&l != r)
23 mk_class_instr(le, r, l) mk_class_instr(lt, r, l, &&l != r)
24
25
26 static OP_CHECK(opck_class_call) {
27 const Exp_Binary *bin = (Exp_Binary *)data;
28 Exp_Call call = {.func = bin->rhs, .args = bin->lhs};
29 Exp e = exp_self(bin);
30 e->exp_type = ae_exp_call;
31 memcpy(&e->d.exp_call, &call, sizeof(Exp_Call));
32 return check_exp_call1(env, &e->d.exp_call) ?: env->gwion->type[et_error];
33 }
34
35 2 static OP_CHECK(opck_basic_ctor) {
36 2 const Exp_Call *call = (Exp_Call *)data;
37 // change to *no know constructor for {+G}%s{0}*?
38 2 ERR_N(call->func->pos, _("can't call a non-callable value"));
39 }
40 /*
41 static OP_EMIT(opem_implicit_class) {
42 struct Implicit *imp = (struct Implicit*)data;
43 const Type t = actual_type(emit->gwion, imp->e->type);
44 emit_pushimm(emit, map_size(&t->nspc->info->value->map));
45 return GW_OK;
46 }
47
48 static OP_CHECK(opck_implicit_class) {
49 struct Implicit *imp = (struct Implicit*)data;
50 const Type t = actual_type(env->gwion, imp->e->type);
51 if(isa(t, env->gwion->type[et_enum]) > 0) return imp->e->type;
52 return env->gwion->type[et_error];
53 }
54 */
55 638 GWION_IMPORT(class) {
56
57
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 638 times.
638 gwidoc(gwi, "Operators class types.");
58 638 GWI_BB(gwi_oper_ini(gwi, "Class", "Class", "bool"))
59 638 GWI_BB(gwi_oper_end(gwi, "==", int_eq))
60 638 GWI_BB(gwi_oper_end(gwi, "!=", int_neq))
61 638 GWI_BB(gwi_oper_end(gwi, ">=", instr_class_ge))
62 638 GWI_BB(gwi_oper_end(gwi, ">", instr_class_gt))
63 638 GWI_BB(gwi_oper_end(gwi, "<=", instr_class_le))
64 638 GWI_BB(gwi_oper_end(gwi, "<", instr_class_lt))
65
66
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 638 times.
638 gwidoc(gwi, "Allow binary call to constructors.");
67 638 GWI_BB(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "Class", NULL))
68 638 GWI_BB(gwi_oper_add(gwi, opck_class_call))
69 638 GWI_BB(gwi_oper_end(gwi, "=>", NULL))
70
71
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 638 times.
638 gwidoc(gwi, "internal constructor operator.");
72 638 GWI_BB(gwi_oper_ini(gwi, NULL, (m_str)OP_ANY_TYPE, NULL))
73 638 GWI_BB(gwi_oper_add(gwi, opck_basic_ctor))
74 638 GWI_BB(gwi_oper_end(gwi, "call_type", NULL))
75 /*
76 gwidoc(gwi, "Allow enum for array size");
77 GWI_BB(gwi_oper_ini(gwi, "Class", "int", NULL))
78 GWI_BB(gwi_oper_add(gwi, opck_implicit_class))
79 GWI_BB(gwi_oper_emi(gwi, opem_implicit_class))
80 GWI_BB(gwi_oper_end(gwi, "@implicit", NULL))
81 */
82 638 return GW_OK;
83 }
84