| 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 | |||
| 14 | ✗ | static GACK(gack_gack) { INTERP_PRINTF("%s", *(m_str *)VALUE) } | |
| 15 | |||
| 16 | ✗ | static OP_CHECK(opck_gack_implicit) { | |
| 17 | ✗ | const struct Implicit *imp = (struct Implicit *)data; | |
| 18 | ✗ | return imp->t; | |
| 19 | } | ||
| 20 | |||
| 21 | ✗ | static OP_EMIT(opem_gack_implicit) { | |
| 22 | ✗ | const struct Implicit *imp = (struct Implicit *)data; | |
| 23 | ✗ | const Type t = imp->e->d.prim.d.exp->cast_to ?: imp->e->d.prim.d.exp->type; | |
| 24 | ✗ | if(t == imp->t) { | |
| 25 | ✗ | const Instr cpy = emit_add_instr(emit, Reg2RegOther); // kind | |
| 26 | ✗ | cpy->m_val2 = SZ_INT; | |
| 27 | ✗ | emit_regmove(emit, imp->t->size - SZ_INT); | |
| 28 | } else { | ||
| 29 | ✗ | emit_regmove(emit, SZ_INT); | |
| 30 | ✗ | struct Op_Import opi = {.lhs = t, | |
| 31 | ✗ | .op = insert_symbol(emit->gwion->st, "@implicit"), | |
| 32 | ✗ | .rhs = imp->t}; | |
| 33 | ✗ | CHECK_BB(op_emit(emit, &opi)); | |
| 34 | ✗ | emit_regmove(emit, -SZ_INT); | |
| 35 | ✗ | const Instr cpy = emit_add_instr(emit, Reg2RegOther); // kind | |
| 36 | ✗ | cpy->m_val = cpy->m_val2 = imp->t->size; | |
| 37 | } | ||
| 38 | ✗ | return GW_OK; | |
| 39 | } | ||
| 40 | |||
| 41 | 638 | GWION_IMPORT(gack) { | |
| 42 | |||
| 43 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 638 times.
|
638 | gwidoc(gwi, "a type for *pretty print*."); |
| 44 | 638 | const Type t_gack = gwi_mk_type(gwi, "@Gack", SZ_INT, NULL); | |
| 45 | 638 | GWI_BB(gwi_gack(gwi, t_gack, gack_gack)) | |
| 46 | 638 | GWI_BB(gwi_set_global_type(gwi, t_gack, et_gack)); | |
| 47 | |||
| 48 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 638 times.
|
638 | gwidoc(gwi, "@Gack implicit cast"); |
| 49 | 638 | GWI_BB(gwi_oper_ini(gwi, "@Gack", (m_str)OP_ANY_TYPE, NULL)) | |
| 50 | 638 | GWI_BB(gwi_oper_add(gwi, opck_gack_implicit)) | |
| 51 | 638 | GWI_BB(gwi_oper_emi(gwi, opem_gack_implicit)) | |
| 52 | 638 | GWI_BB(gwi_oper_end(gwi, "@implicit", NULL)) | |
| 53 | |||
| 54 | 638 | return GW_OK; | |
| 55 | } | ||
| 56 |