From b33335c92148f8105a3f1df3461c7fe3fd2bbe7a Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 3 Apr 2021 17:17:11 +0300 Subject: [PATCH] no more varargs --- src/harr.c | 16 +++++++++++----- src/i32arr.c | 18 ++++++++++++------ src/main.c | 6 +++--- src/vm.c | 25 +++++++++++-------------- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/harr.c b/src/harr.c index 75783b5d..79a78309 100644 --- a/src/harr.c +++ b/src/harr.c @@ -81,19 +81,25 @@ typedef struct HSlice { struct Slice; B* a; } HSlice; -B m_hslice(B p, B* ptr) { HSlice* r = mm_allocN(sizeof(HSlice), t_hslice); r->p=p; r->a = ptr; return tag(r, ARR_TAG); } -B harr_slice (B x, usz s) { return m_hslice(x, c(HArr,x)->a+s); } -B hslice_slice(B x, usz s) { B r=m_hslice(inci(c(HSlice,x)->p), c(HSlice,x)->a+s); dec(x); return r; } +B m_hslice(B p, B* ptr) { + HSlice* r = mm_allocN(sizeof(HSlice), t_hslice); + r->p = p; + r->a = ptr; + return tag(r, ARR_TAG); +} + +B harr_slice (B x, usz s) {return m_hslice(x , c(HArr ,x)->a+s); } +B hslice_slice(B x, usz s) { B r = m_hslice(inci(c(HSlice,x)->p), c(HSlice,x)->a+s); dec(x); return r; } +B harr_get (B x, usz n) { VT(x,t_harr ); return inci(c(HArr ,x)->a[n]); } +B hslice_get(B x, usz n) { VT(x,t_hslice); return inci(c(HSlice,x)->a[n]); } void harr_free(B x) { decSh(x); B* p = harr_ptr(x); usz ia = a(x)->ia; for (usz i = 0; i < ia; i++) dec(p[i]); } -B harr_get (B x, usz n) { VT(x,t_harr ); return inci(c(HArr ,x)->a[n]); } -B hslice_get(B x, usz n) { VT(x,t_hslice); return inci(c(HSlice,x)->a[n]); } void harr_init() { ti[t_harr].get = harr_get; ti[t_hslice].get = hslice_get; diff --git a/src/i32arr.c b/src/i32arr.c index 3613269a..1b752752 100644 --- a/src/i32arr.c +++ b/src/i32arr.c @@ -47,13 +47,19 @@ typedef struct I32Slice { struct Slice; i32* a; } I32Slice; -B m_i32slice(B p, i32* ptr) { I32Slice* r = mm_allocN(sizeof(I32Slice), t_i32slice); r->p=p; r->a = ptr; return tag(r, ARR_TAG); } -B i32arr_slice (B x, usz s) { return m_i32slice(x, c(I32Arr,x)->a+s); } -B i32slice_slice(B x, usz s) { B r=m_i32slice(inci(c(I32Slice,x)->p), c(I32Slice,x)->a+s); dec(x); return r; } +B m_i32slice(B p, i32* ptr) { + I32Slice* r = mm_allocN(sizeof(I32Slice), t_i32slice); + r->p = p; + r->a = ptr; + return tag(r, ARR_TAG); +} + +B i32arr_slice (B x, usz s) {return m_i32slice(x , c(I32Arr ,x)->a+s); } +B i32slice_slice(B x, usz s) { B r = m_i32slice(inci(c(I32Slice,x)->p), c(I32Slice,x)->a+s); dec(x); return r; } + + +B i32arr_get (B x, usz n) { VT(x,t_i32arr ); return m_i32(c(I32Arr ,x)->a[n]); } B i32slice_get(B x, usz n) { VT(x,t_i32slice); return m_i32(c(I32Slice,x)->a[n]); } - - -B i32arr_get(B x, usz n) { VT(x,t_i32arr); return m_i32(c(I32Arr,x)->a[n]); } void i32arr_free(B x) { decSh(x); } void i32arr_init() { diff --git a/src/main.c b/src/main.c index 19d76e4d..1a368e04 100644 --- a/src/main.c +++ b/src/main.c @@ -163,15 +163,15 @@ int main() { #ifdef ALLOC_STAT printf("total bytes allocated: %lu\n", talloc); - printf("ctrA←"); for (i64 j = 0; j < Type_MAX; j++) { if(j)printf("‿"); printf("%lu", ctr_a[j]); } printf("\n"); - printf("ctrF←"); for (i64 j = 0; j < Type_MAX; j++) { if(j)printf("‿"); printf("%lu", ctr_f[j]); } printf("\n"); + printf("ctrA←"); for (i64 i = 0; i < Type_MAX; i++) { if(i)printf("‿"); printf("%lu", ctr_a[i]); } printf("\n"); + printf("ctrF←"); for (i64 i = 0; i < Type_MAX; i++) { if(i)printf("‿"); printf("%lu", ctr_f[i]); } printf("\n"); for(i64 i = 0; i < actrc; i++) { u32* c = actrs[i]; bool any = false; for (i64 j = 0; j < Type_MAX; j++) if (c[j]) any=true; if (any) { printf("%ld", i); - for (i64 j = 0; j < Type_MAX; j++) printf("‿%u", c[j]); + for (i64 k = 0; k < Type_MAX; k++) printf("‿%u", c[k]); printf("\n"); } } diff --git a/src/vm.c b/src/vm.c index ca87fdb7..21bcf65c 100644 --- a/src/vm.c +++ b/src/vm.c @@ -366,7 +366,7 @@ B evalBC(Body* b, Scope* sc) { return stack[0]; } -B actualExec(Block* bl, Scope* psc, u32 ga, ...) { +B actualExec(Block* bl, Scope* psc, u32 ga, B* svar) { Body* bdy = bl->body; Scope* sc = mm_allocN(fsizeof(Scope, vars, B, bdy->varAm), t_scope); sc->psc = psc; if(psc)ptr_inc(psc); @@ -374,11 +374,8 @@ B actualExec(Block* bl, Scope* psc, u32 ga, ...) { assert(varAm>=ga); sc->bcInd = bdy->bc-c(I32Arr,bdy->comp->bc)->a; i32 i = 0; - va_list vargs; - va_start(vargs, ga); - while (ivars[i++] = va_arg(vargs, B); + while (ivars[i] = svar[i]; i++; } while (ivars[i++] = bi_noVar; - va_end(vargs); // if (ga & !(bdy->flags&1)) { // B v0 = sc->vars[0]; // dec(v0); sc->vars[0] = bi_optOut; // prevent reference cycle; TODO more properly do this (or just remove, it doesn't seem to be doing much) @@ -388,14 +385,14 @@ B actualExec(Block* bl, Scope* psc, u32 ga, ...) { return r; } -B funBl_c1(B t, B x) { return actualExec(c(FunBlock, t)->bl, c(FunBlock, t)->sc, 3, inci(t), x, bi_nothing); } -B funBl_c2(B t, B w, B x) { return actualExec(c(FunBlock, t)->bl, c(FunBlock, t)->sc, 3, inci(t), x, w); } -B md1Bl_c1(B t, B f, B x) { return actualExec(c(Md1Block, t)->bl, c(Md1Block, t)->sc, 5, m_md1D(inci(t),inci(f) ), x, bi_nothing, inci(t), inci(f)); } -B md1Bl_c2(B t, B f, B w, B x) { return actualExec(c(Md1Block, t)->bl, c(Md1Block, t)->sc, 5, m_md1D(inci(t),inci(f) ), x, w , inci(t), inci(f)); } -B md2Bl_c1(B t, B f, B g, B x) { return actualExec(c(Md2Block, t)->bl, c(Md2Block, t)->sc, 6, m_md2D(inci(t),inci(f),inci(g)), x, bi_nothing, inci(t), inci(f), inci(g)); } -B md2Bl_c2(B t, B f, B g, B w, B x) { return actualExec(c(Md2Block, t)->bl, c(Md2Block, t)->sc, 6, m_md2D(inci(t),inci(f),inci(g)), x, w , inci(t), inci(f), inci(g)); } +B funBl_c1(B t, B x) { return actualExec(c(FunBlock, t)->bl, c(FunBlock, t)->sc, 3, (B[]){inci(t), x, bi_nothing }); } +B funBl_c2(B t, B w, B x) { return actualExec(c(FunBlock, t)->bl, c(FunBlock, t)->sc, 3, (B[]){inci(t), x, w }); } +B md1Bl_c1(B t, B f, B x) { return actualExec(c(Md1Block, t)->bl, c(Md1Block, t)->sc, 5, (B[]){m_md1D(inci(t),inci(f) ), x, bi_nothing, inci(t), inci(f) }); } +B md1Bl_c2(B t, B f, B w, B x) { return actualExec(c(Md1Block, t)->bl, c(Md1Block, t)->sc, 5, (B[]){m_md1D(inci(t),inci(f) ), x, w , inci(t), inci(f) }); } +B md2Bl_c1(B t, B f, B g, B x) { return actualExec(c(Md2Block, t)->bl, c(Md2Block, t)->sc, 6, (B[]){m_md2D(inci(t),inci(f),inci(g)), x, bi_nothing, inci(t), inci(f), inci(g)}); } +B md2Bl_c2(B t, B f, B g, B w, B x) { return actualExec(c(Md2Block, t)->bl, c(Md2Block, t)->sc, 6, (B[]){m_md2D(inci(t),inci(f),inci(g)), x, w , inci(t), inci(f), inci(g)}); } B m_funBlock(Block* bl, Scope* psc) { - if (bl->imm) return actualExec(bl, psc, 0); + if (bl->imm) return actualExec(bl, psc, 0, NULL); B r = mm_alloc(sizeof(FunBlock), t_fun_block, ftag(FUN_TAG)); c(FunBlock, r)->bl = bl; ptr_inc(bl); c(FunBlock, r)->sc = psc; ptr_inc(psc); @@ -450,8 +447,8 @@ void md2Bl_print(B x) { printf("{2-modifier}"); } B block_decompose(B x) { return m_v2(m_i32(1), x); } -B bl_m1d(B m, B f ) { Md1Block* c = c(Md1Block,m); return c->bl->imm? actualExec(c(Md1Block, m)->bl, c(Md1Block, m)->sc, 2, m, f ) : m_md1D(m,f ); } -B bl_m2d(B m, B f, B g) { Md2Block* c = c(Md2Block,m); return c->bl->imm? actualExec(c(Md2Block, m)->bl, c(Md2Block, m)->sc, 3, m, f, g) : m_md2D(m,f,g); } +B bl_m1d(B m, B f ) { Md1Block* c = c(Md1Block,m); return c->bl->imm? actualExec(c(Md1Block, m)->bl, c(Md1Block, m)->sc, 2, (B[]){m, f }) : m_md1D(m,f ); } +B bl_m2d(B m, B f, B g) { Md2Block* c = c(Md2Block,m); return c->bl->imm? actualExec(c(Md2Block, m)->bl, c(Md2Block, m)->sc, 3, (B[]){m, f, g}) : m_md2D(m,f,g); } void comp_init() { ti[t_comp ].free = comp_free; ti[t_comp ].print = comp_print;