diff --git a/src/c32arr.c b/src/c32arr.c index 8e2a1573..4f128361 100644 --- a/src/c32arr.c +++ b/src/c32arr.c @@ -87,7 +87,7 @@ static inline void c32arr_init() { ti[t_c32arr].getU = c32arr_get; ti[t_c32slice].getU = c32slice_get; ti[t_c32arr].slice = c32arr_slice; ti[t_c32slice].slice = c32slice_slice; ti[t_c32arr].free = c32arr_free; ti[t_c32slice].free = slice_free; - ti[t_c32arr].visit = do_nothing; ti[t_c32slice].visit = slice_visit; + ti[t_c32arr].visit = noop_visit; ti[t_c32slice].visit = slice_visit; ti[t_c32arr].print = arr_print; ti[t_c32slice].print = arr_print; ti[t_c32arr].isArr = true; ti[t_c32slice].isArr = true; ti[t_i32arr].arrD1 = true; ti[t_i32slice].arrD1 = true; diff --git a/src/derv.c b/src/derv.c index a712b919..cc944d06 100644 --- a/src/derv.c +++ b/src/derv.c @@ -30,11 +30,11 @@ void md2H_free(Value* x) { dec(((Md2H*)x)->m2); dec(((Md2H*)x)->g); void fork_free(Value* x) { dec(((Fork*)x)->f ); dec(((Fork*)x)->g); dec(((Fork*)x)->h); } void atop_free(Value* x) { dec(((Atop*)x)->g); dec(((Atop*)x)->h); } -void md1D_visit(B x) { mm_visit(c(Md1D,x)->m1); mm_visit(c(Md1D,x)->f); } -void md2D_visit(B x) { mm_visit(c(Md2D,x)->m2); mm_visit(c(Md2D,x)->f); mm_visit(c(Md2D,x)->g); } -void md2H_visit(B x) { mm_visit(c(Md2H,x)->m2); mm_visit(c(Md2H,x)->g); } -void fork_visit(B x) { mm_visit(c(Fork,x)->f ); mm_visit(c(Fork,x)->g); mm_visit(c(Fork,x)->h); } -void atop_visit(B x) { mm_visit(c(Atop,x)->g); mm_visit(c(Atop,x)->h); } +void md1D_visit(Value* x) { mm_visit(((Md1D*)x)->m1); mm_visit(((Md1D*)x)->f); } +void md2D_visit(Value* x) { mm_visit(((Md2D*)x)->m2); mm_visit(((Md2D*)x)->f); mm_visit(((Md2D*)x)->g); } +void md2H_visit(Value* x) { mm_visit(((Md2H*)x)->m2); mm_visit(((Md2H*)x)->g); } +void fork_visit(Value* x) { mm_visit(((Fork*)x)->f ); mm_visit(((Fork*)x)->g); mm_visit(((Fork*)x)->h); } +void atop_visit(Value* x) { mm_visit(((Atop*)x)->g); mm_visit(((Atop*)x)->h); } void md1D_print(B x) { printf("(md1D ");print(c(Md1D,x)->f);printf(" ");print(c(Md1D,x)->m1); printf(")"); } void md2D_print(B x) { printf("(md2D ");print(c(Md2D,x)->f);printf(" ");print(c(Md2D,x)->m2);printf(" ");print(c(Md2D,x)->g);printf(")"); } diff --git a/src/f64arr.c b/src/f64arr.c index 999b9b48..183dd04c 100644 --- a/src/f64arr.c +++ b/src/f64arr.c @@ -71,7 +71,7 @@ static inline void f64arr_init() { ti[t_f64arr].getU = f64arr_get; ti[t_f64slice].getU = f64slice_get; ti[t_f64arr].slice = f64arr_slice; ti[t_f64slice].slice = f64slice_slice; ti[t_f64arr].free = f64arr_free; ti[t_f64slice].free = slice_free; - ti[t_f64arr].visit = do_nothing; ti[t_f64slice].visit = slice_visit; + ti[t_f64arr].visit = noop_visit; ti[t_f64slice].visit = slice_visit; ti[t_f64arr].print = arr_print; ti[t_f64slice].print = arr_print; ti[t_f64arr].isArr = true; ti[t_f64slice].isArr = true; ti[t_f64arr].arrD1 = true; ti[t_f64slice].arrD1 = true; diff --git a/src/fillarr.c b/src/fillarr.c index 6f29514b..80db5d7d 100644 --- a/src/fillarr.c +++ b/src/fillarr.c @@ -87,9 +87,9 @@ void fillarr_free(Value* x) { usz ia = ((Arr*)x)->ia; for (usz i = 0; i < ia; i++) dec(p[i]); } -void fillarr_visit(B x) { - usz ia = a(x)->ia; B* p = fillarr_ptr(x); - mm_visit(c(FillArr,x)->fill); +void fillarr_visit(Value* x) { assert(x->type == t_fillarr); + usz ia = ((Arr*)x)->ia; B* p = ((FillArr*)x)->a; + mm_visit(((FillArr*)x)->fill); for (usz i = 0; i < ia; i++) mm_visit(p[i]); } bool fillarr_canStore(B x) { return true; } diff --git a/src/gc.c b/src/gc.c index c662e9c4..a426821b 100644 --- a/src/gc.c +++ b/src/gc.c @@ -31,13 +31,14 @@ void mm_visit(B x) { #endif if (!isVal(x)) return; - u8 p = v(x)->mmInfo; + Value* vx = v(x); + u8 p = vx->mmInfo; if ((p&0x80)==gc_tagNew) return; - v(x)->mmInfo = p^0x80; + vx->mmInfo = p^0x80; #ifdef LOG_GC - gc_visitBytes+= mm_size(v(x)); gc_visitCount++; + gc_visitBytes+= mm_size(vx); gc_visitCount++; #endif - TI(x).visit(x); + TI(x).visit(vx); } void mm_visitP(void* xp) { #ifdef HEAP_VERIFY @@ -51,7 +52,7 @@ void mm_visitP(void* xp) { #ifdef LOG_GC gc_visitBytes+= mm_size(x); gc_visitCount++; #endif - ti[x->type].visit(tag(x, OBJ_TAG)); + ti[x->type].visit(x); } void gc_tryFree(Value* v) { u8 t = v->type; diff --git a/src/h.h b/src/h.h index c55c59e5..0b230d8d 100644 --- a/src/h.h +++ b/src/h.h @@ -393,7 +393,7 @@ typedef struct Slice { B p; } Slice; void slice_free(Value* x) { dec(((Slice*)x)->p); decSh(x); } -void slice_visit(B x) { mm_visit(c(Slice,x)->p); } +void slice_visit(Value* x) { mm_visit(((Slice*)x)->p); } void slice_print(B x) { arr_print(x); } B* harr_ptr(B x); @@ -422,7 +422,7 @@ typedef struct TypeInfo { u8 elType; B2v print; // doesn't consume - B2v visit; // call mm_visit for all referents + V2v visit; // call mm_visit for all referents B2B decompose; // consumes; must return a HArr bool isArr; bool arrD1; // is always an array with depth 1 @@ -433,7 +433,6 @@ TypeInfo ti[t_COUNT]; B bi_N, bi_noVar, bi_badHdr, bi_optOut, bi_noFill, bi_emptyHVec, bi_emptyIVec; -void do_nothing(B x) { } bool isNothing(B b) { return b.u==bi_N.u; } // refcount diff --git a/src/harr.c b/src/harr.c index 55308eeb..8a90c10c 100644 --- a/src/harr.c +++ b/src/harr.c @@ -170,8 +170,8 @@ void harr_free(Value* x) { usz ia = ((Arr*)x)->ia; for (usz i = 0; i < ia; i++) dec(p[i]); } -void harr_visit(B x) { - usz ia = a(x)->ia; B* p = harr_ptr(x); +void harr_visit(Value* x) { + usz ia = ((Arr*)x)->ia; B* p = ((HArr*)x)->a; for (usz i = 0; i < ia; i++) mm_visit(p[i]); } bool harr_canStore(B x) { return true; } @@ -191,10 +191,10 @@ void harrP_free(Value* x) { assert(x->type==t_harrPartial|x->type==t_freed); // printf("partfree %d/%d %p\n", am, a(x)->ia, (void*)x.u); for (usz i = 0; i < am; i++) dec(p[i]); } -void harrP_visit(B x) { VT(x, t_harrPartial); - assert(rnk(x)>1? true : a(x)->sh!=&a(x)->ia); - B* p = c(HArr,x)->a; - usz am = *c(HArr,x)->sh; +void harrP_visit(Value* x) { assert(x->type==t_harrPartial); + assert(prnk(x)>1? true : ((Arr*)x)->sh!=&((Arr*)x)->ia); + B* p = ((HArr*)x)->a; + usz am = *((HArr*)x)->sh; for (usz i = 0; i < am; i++) mm_visit(p[i]); } B harrP_get(B x, usz n) { return err("getting item from t_harrPartial"); } diff --git a/src/i32arr.c b/src/i32arr.c index 77726f83..38af6048 100644 --- a/src/i32arr.c +++ b/src/i32arr.c @@ -71,7 +71,7 @@ static inline void i32arr_init() { ti[t_i32arr].getU = i32arr_get; ti[t_i32slice].getU = i32slice_get; ti[t_i32arr].slice = i32arr_slice; ti[t_i32slice].slice = i32slice_slice; ti[t_i32arr].free = i32arr_free; ti[t_i32slice].free = slice_free; - ti[t_i32arr].visit = do_nothing; ti[t_i32slice].visit = slice_visit; + ti[t_i32arr].visit = noop_visit; ti[t_i32slice].visit = slice_visit; ti[t_i32arr].print = arr_print; ti[t_i32slice].print = arr_print; ti[t_i32arr].isArr = true; ti[t_i32slice].isArr = true; ti[t_i32arr].arrD1 = true; ti[t_i32slice].arrD1 = true; diff --git a/src/ns.c b/src/ns.c index aade8b17..9348cbc6 100644 --- a/src/ns.c +++ b/src/ns.c @@ -68,8 +68,8 @@ void ns_free(Value* x) { ptr_decR(c->desc); ptr_decR(c->sc); } -void ns_visit(B x) { - NS* c = c(NS, x); +void ns_visit(Value* x) { + NS* c = (NS*)x; mm_visitP(c->desc); mm_visitP(c->sc); } @@ -96,8 +96,8 @@ void ns_print(B x) { void nsDesc_free(Value* x) { decR(((NSDesc*)x)->nameList); } -void nsDesc_visit(B x) { - mm_visit(c(NSDesc,x)->nameList); +void nsDesc_visit(Value* x) { + mm_visit(((NSDesc*)x)->nameList); } void nsDesc_print(B x) { printf("(namespace description)"); diff --git a/src/stuff.c b/src/stuff.c index be21c5b4..d44a592e 100644 --- a/src/stuff.c +++ b/src/stuff.c @@ -13,8 +13,9 @@ void empty_free(Value* x) { err("FREEING EMPTY\n"); } void builtin_free(Value* x) { err("FREEING BUILTIN\n"); } void def_free(Value* x) { } -void def_visit(B x) { printf("(no visit for %d=%s)\n", v(x)->type, format_type(v(x)->type)); } -void freed_visit(B x) { +void def_visit(Value* x) { printf("(no visit for %d=%s)\n", x->type, format_type(x->type)); } +void noop_visit(Value* x) { } +void freed_visit(Value* x) { #ifndef CATCH_ERRORS err("visiting t_freed\n"); #endif @@ -264,8 +265,8 @@ static inline void hdr_init() { ti[t_empty].free = empty_free; ti[t_freed].free = def_free; ti[t_freed].visit = freed_visit; - ti[t_shape].visit = do_nothing; - ti[t_funBI].visit = ti[t_md1BI].visit = ti[t_md2BI].visit = do_nothing; + ti[t_shape].visit = noop_visit; + ti[t_funBI].visit = ti[t_md1BI].visit = ti[t_md2BI].visit = noop_visit; ti[t_funBI].free = ti[t_md1BI].free = ti[t_md2BI].free = builtin_free; bi_N = tag(0, TAG_TAG); bi_noVar = tag(1, TAG_TAG); diff --git a/src/vm.c b/src/vm.c index 8f206b08..1840b5a6 100644 --- a/src/vm.c +++ b/src/vm.c @@ -573,31 +573,31 @@ void scope_free(Value* x) { u16 am = c->varAm; for (u32 i = 0; i < am; i++) dec(c->vars[i]); } -void body_free(Value* x) { Body* c = (Body*)x; ptr_decR(c->comp); if(c->nsDesc)ptr_decR(c->nsDesc); } -void block_free(Value* x) { Block* c = (Block*)x; ptr_decR(c->body); } +void body_free(Value* x) { Body* c = (Body *)x; ptr_decR(c->comp); if(c->nsDesc)ptr_decR(c->nsDesc); } +void block_free(Value* x) { Block* c = (Block *)x; ptr_decR(c->body); } void funBl_free(Value* x) { FunBlock* c = (FunBlock*)x; ptr_decR(c->sc); ptr_decR(c->bl); } void md1Bl_free(Value* x) { Md1Block* c = (Md1Block*)x; ptr_decR(c->sc); ptr_decR(c->bl); } void md2Bl_free(Value* x) { Md2Block* c = (Md2Block*)x; ptr_decR(c->sc); ptr_decR(c->bl); } void alias_free(Value* x) { dec(((FldAlias*)x)->obj); } -void comp_visit(B x) { - Comp* c = c(Comp,x); +void comp_visit(Value* x) { + Comp* c = (Comp*)x; mm_visitP(c->objs); mm_visit(c->bc); mm_visit(c->src); mm_visit(c->indices); u32 am = c->blockAm; for(u32 i = 0; i < am; i++) mm_visitP(c->blocks[i]); } -void scope_visit(B x) { - Scope* c = c(Scope,x); +void scope_visit(Value* x) { + Scope* c = (Scope*)x; if (c->psc) mm_visitP(c->psc); mm_visitP(c->body); u16 am = c->varAm; for (u32 i = 0; i < am; i++) mm_visit(c->vars[i]); } -void body_visit(B x) { Body* c = c(Body ,x); mm_visitP(c->comp); if(c->nsDesc)mm_visitP(c->nsDesc); } -void block_visit(B x) { Block* c = c(Block,x); mm_visitP(c->body); } -void funBl_visit(B x) { FunBlock* c = c(FunBlock,x); mm_visitP(c->sc); mm_visitP(c->bl); } -void md1Bl_visit(B x) { Md1Block* c = c(Md1Block,x); mm_visitP(c->sc); mm_visitP(c->bl); } -void md2Bl_visit(B x) { Md2Block* c = c(Md2Block,x); mm_visitP(c->sc); mm_visitP(c->bl); } -void alias_visit(B x) { mm_visit(c(FldAlias,x)->obj); } +void body_visit(Value* x) { Body* c = (Body *)x; mm_visitP(c->comp); if(c->nsDesc)mm_visitP(c->nsDesc); } +void block_visit(Value* x) { Block* c = (Block *)x; mm_visitP(c->body); } +void funBl_visit(Value* x) { FunBlock* c = (FunBlock*)x; mm_visitP(c->sc); mm_visitP(c->bl); } +void md1Bl_visit(Value* x) { Md1Block* c = (Md1Block*)x; mm_visitP(c->sc); mm_visitP(c->bl); } +void md2Bl_visit(Value* x) { Md2Block* c = (Md2Block*)x; mm_visitP(c->sc); mm_visitP(c->bl); } +void alias_visit(Value* x) { mm_visit(((FldAlias*)x)->obj); } void comp_print (B x) { printf("(%p: comp)",v(x)); } void body_print (B x) { printf("(%p: body varam=%d)",v(x),c(Body,x)->varAm); }