visit should take pointer as arg

This commit is contained in:
dzaima 2021-05-15 12:23:21 +03:00
parent fb7bfcf188
commit 77531e2d8f
11 changed files with 46 additions and 45 deletions

View File

@ -87,7 +87,7 @@ static inline void c32arr_init() {
ti[t_c32arr].getU = c32arr_get; ti[t_c32slice].getU = c32slice_get; 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].slice = c32arr_slice; ti[t_c32slice].slice = c32slice_slice;
ti[t_c32arr].free = c32arr_free; ti[t_c32slice].free = slice_free; 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].print = arr_print; ti[t_c32slice].print = arr_print;
ti[t_c32arr].isArr = true; ti[t_c32slice].isArr = true; ti[t_c32arr].isArr = true; ti[t_c32slice].isArr = true;
ti[t_i32arr].arrD1 = true; ti[t_i32slice].arrD1 = true; ti[t_i32arr].arrD1 = true; ti[t_i32slice].arrD1 = true;

View File

@ -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 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 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 md1D_visit(Value* x) { mm_visit(((Md1D*)x)->m1); mm_visit(((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 md2D_visit(Value* x) { mm_visit(((Md2D*)x)->m2); mm_visit(((Md2D*)x)->f); mm_visit(((Md2D*)x)->g); }
void md2H_visit(B x) { mm_visit(c(Md2H,x)->m2); mm_visit(c(Md2H,x)->g); } void md2H_visit(Value* x) { mm_visit(((Md2H*)x)->m2); mm_visit(((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 fork_visit(Value* x) { mm_visit(((Fork*)x)->f ); mm_visit(((Fork*)x)->g); mm_visit(((Fork*)x)->h); }
void atop_visit(B x) { mm_visit(c(Atop,x)->g); mm_visit(c(Atop,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 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(")"); } 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(")"); }

View File

@ -71,7 +71,7 @@ static inline void f64arr_init() {
ti[t_f64arr].getU = f64arr_get; ti[t_f64slice].getU = f64slice_get; 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].slice = f64arr_slice; ti[t_f64slice].slice = f64slice_slice;
ti[t_f64arr].free = f64arr_free; ti[t_f64slice].free = slice_free; 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].print = arr_print; ti[t_f64slice].print = arr_print;
ti[t_f64arr].isArr = true; ti[t_f64slice].isArr = true; ti[t_f64arr].isArr = true; ti[t_f64slice].isArr = true;
ti[t_f64arr].arrD1 = true; ti[t_f64slice].arrD1 = true; ti[t_f64arr].arrD1 = true; ti[t_f64slice].arrD1 = true;

View File

@ -87,9 +87,9 @@ void fillarr_free(Value* x) {
usz ia = ((Arr*)x)->ia; usz ia = ((Arr*)x)->ia;
for (usz i = 0; i < ia; i++) dec(p[i]); for (usz i = 0; i < ia; i++) dec(p[i]);
} }
void fillarr_visit(B x) { void fillarr_visit(Value* x) { assert(x->type == t_fillarr);
usz ia = a(x)->ia; B* p = fillarr_ptr(x); usz ia = ((Arr*)x)->ia; B* p = ((FillArr*)x)->a;
mm_visit(c(FillArr,x)->fill); mm_visit(((FillArr*)x)->fill);
for (usz i = 0; i < ia; i++) mm_visit(p[i]); for (usz i = 0; i < ia; i++) mm_visit(p[i]);
} }
bool fillarr_canStore(B x) { return true; } bool fillarr_canStore(B x) { return true; }

View File

@ -31,13 +31,14 @@ void mm_visit(B x) {
#endif #endif
if (!isVal(x)) return; if (!isVal(x)) return;
u8 p = v(x)->mmInfo; Value* vx = v(x);
u8 p = vx->mmInfo;
if ((p&0x80)==gc_tagNew) return; if ((p&0x80)==gc_tagNew) return;
v(x)->mmInfo = p^0x80; vx->mmInfo = p^0x80;
#ifdef LOG_GC #ifdef LOG_GC
gc_visitBytes+= mm_size(v(x)); gc_visitCount++; gc_visitBytes+= mm_size(vx); gc_visitCount++;
#endif #endif
TI(x).visit(x); TI(x).visit(vx);
} }
void mm_visitP(void* xp) { void mm_visitP(void* xp) {
#ifdef HEAP_VERIFY #ifdef HEAP_VERIFY
@ -51,7 +52,7 @@ void mm_visitP(void* xp) {
#ifdef LOG_GC #ifdef LOG_GC
gc_visitBytes+= mm_size(x); gc_visitCount++; gc_visitBytes+= mm_size(x); gc_visitCount++;
#endif #endif
ti[x->type].visit(tag(x, OBJ_TAG)); ti[x->type].visit(x);
} }
void gc_tryFree(Value* v) { void gc_tryFree(Value* v) {
u8 t = v->type; u8 t = v->type;

View File

@ -393,7 +393,7 @@ typedef struct Slice {
B p; B p;
} Slice; } Slice;
void slice_free(Value* x) { dec(((Slice*)x)->p); decSh(x); } 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); } void slice_print(B x) { arr_print(x); }
B* harr_ptr(B x); B* harr_ptr(B x);
@ -422,7 +422,7 @@ typedef struct TypeInfo {
u8 elType; u8 elType;
B2v print; // doesn't consume 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 B2B decompose; // consumes; must return a HArr
bool isArr; bool isArr;
bool arrD1; // is always an array with depth 1 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; 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; } bool isNothing(B b) { return b.u==bi_N.u; }
// refcount // refcount

View File

@ -170,8 +170,8 @@ void harr_free(Value* x) {
usz ia = ((Arr*)x)->ia; usz ia = ((Arr*)x)->ia;
for (usz i = 0; i < ia; i++) dec(p[i]); for (usz i = 0; i < ia; i++) dec(p[i]);
} }
void harr_visit(B x) { void harr_visit(Value* x) {
usz ia = a(x)->ia; B* p = harr_ptr(x); usz ia = ((Arr*)x)->ia; B* p = ((HArr*)x)->a;
for (usz i = 0; i < ia; i++) mm_visit(p[i]); for (usz i = 0; i < ia; i++) mm_visit(p[i]);
} }
bool harr_canStore(B x) { return true; } 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); // printf("partfree %d/%d %p\n", am, a(x)->ia, (void*)x.u);
for (usz i = 0; i < am; i++) dec(p[i]); for (usz i = 0; i < am; i++) dec(p[i]);
} }
void harrP_visit(B x) { VT(x, t_harrPartial); void harrP_visit(Value* x) { assert(x->type==t_harrPartial);
assert(rnk(x)>1? true : a(x)->sh!=&a(x)->ia); assert(prnk(x)>1? true : ((Arr*)x)->sh!=&((Arr*)x)->ia);
B* p = c(HArr,x)->a; B* p = ((HArr*)x)->a;
usz am = *c(HArr,x)->sh; usz am = *((HArr*)x)->sh;
for (usz i = 0; i < am; i++) mm_visit(p[i]); 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"); } B harrP_get(B x, usz n) { return err("getting item from t_harrPartial"); }

View File

@ -71,7 +71,7 @@ static inline void i32arr_init() {
ti[t_i32arr].getU = i32arr_get; ti[t_i32slice].getU = i32slice_get; 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].slice = i32arr_slice; ti[t_i32slice].slice = i32slice_slice;
ti[t_i32arr].free = i32arr_free; ti[t_i32slice].free = slice_free; 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].print = arr_print; ti[t_i32slice].print = arr_print;
ti[t_i32arr].isArr = true; ti[t_i32slice].isArr = true; ti[t_i32arr].isArr = true; ti[t_i32slice].isArr = true;
ti[t_i32arr].arrD1 = true; ti[t_i32slice].arrD1 = true; ti[t_i32arr].arrD1 = true; ti[t_i32slice].arrD1 = true;

View File

@ -68,8 +68,8 @@ void ns_free(Value* x) {
ptr_decR(c->desc); ptr_decR(c->desc);
ptr_decR(c->sc); ptr_decR(c->sc);
} }
void ns_visit(B x) { void ns_visit(Value* x) {
NS* c = c(NS, x); NS* c = (NS*)x;
mm_visitP(c->desc); mm_visitP(c->desc);
mm_visitP(c->sc); mm_visitP(c->sc);
} }
@ -96,8 +96,8 @@ void ns_print(B x) {
void nsDesc_free(Value* x) { void nsDesc_free(Value* x) {
decR(((NSDesc*)x)->nameList); decR(((NSDesc*)x)->nameList);
} }
void nsDesc_visit(B x) { void nsDesc_visit(Value* x) {
mm_visit(c(NSDesc,x)->nameList); mm_visit(((NSDesc*)x)->nameList);
} }
void nsDesc_print(B x) { void nsDesc_print(B x) {
printf("(namespace description)"); printf("(namespace description)");

View File

@ -13,8 +13,9 @@
void empty_free(Value* x) { err("FREEING EMPTY\n"); } void empty_free(Value* x) { err("FREEING EMPTY\n"); }
void builtin_free(Value* x) { err("FREEING BUILTIN\n"); } void builtin_free(Value* x) { err("FREEING BUILTIN\n"); }
void def_free(Value* x) { } 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 def_visit(Value* x) { printf("(no visit for %d=%s)\n", x->type, format_type(x->type)); }
void freed_visit(B x) { void noop_visit(Value* x) { }
void freed_visit(Value* x) {
#ifndef CATCH_ERRORS #ifndef CATCH_ERRORS
err("visiting t_freed\n"); err("visiting t_freed\n");
#endif #endif
@ -264,8 +265,8 @@ static inline void hdr_init() {
ti[t_empty].free = empty_free; ti[t_empty].free = empty_free;
ti[t_freed].free = def_free; ti[t_freed].free = def_free;
ti[t_freed].visit = freed_visit; ti[t_freed].visit = freed_visit;
ti[t_shape].visit = do_nothing; ti[t_shape].visit = noop_visit;
ti[t_funBI].visit = ti[t_md1BI].visit = ti[t_md2BI].visit = do_nothing; 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; ti[t_funBI].free = ti[t_md1BI].free = ti[t_md2BI].free = builtin_free;
bi_N = tag(0, TAG_TAG); bi_N = tag(0, TAG_TAG);
bi_noVar = tag(1, TAG_TAG); bi_noVar = tag(1, TAG_TAG);

View File

@ -573,31 +573,31 @@ void scope_free(Value* x) {
u16 am = c->varAm; u16 am = c->varAm;
for (u32 i = 0; i < am; i++) dec(c->vars[i]); 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 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 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 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 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 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 alias_free(Value* x) { dec(((FldAlias*)x)->obj); }
void comp_visit(B x) { void comp_visit(Value* x) {
Comp* c = c(Comp,x); Comp* c = (Comp*)x;
mm_visitP(c->objs); mm_visit(c->bc); mm_visit(c->src); mm_visit(c->indices); 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]); u32 am = c->blockAm; for(u32 i = 0; i < am; i++) mm_visitP(c->blocks[i]);
} }
void scope_visit(B x) { void scope_visit(Value* x) {
Scope* c = c(Scope,x); Scope* c = (Scope*)x;
if (c->psc) mm_visitP(c->psc); if (c->psc) mm_visitP(c->psc);
mm_visitP(c->body); mm_visitP(c->body);
u16 am = c->varAm; u16 am = c->varAm;
for (u32 i = 0; i < am; i++) mm_visit(c->vars[i]); 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 body_visit(Value* x) { Body* 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 block_visit(Value* x) { Block* 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 funBl_visit(Value* x) { FunBlock* 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 md1Bl_visit(Value* x) { Md1Block* 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 md2Bl_visit(Value* x) { Md2Block* c = (Md2Block*)x; mm_visitP(c->sc); mm_visitP(c->bl); }
void alias_visit(B x) { mm_visit(c(FldAlias,x)->obj); } void alias_visit(Value* x) { mm_visit(((FldAlias*)x)->obj); }
void comp_print (B x) { printf("(%p: comp)",v(x)); } 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); } void body_print (B x) { printf("(%p: body varam=%d)",v(x),c(Body,x)->varAm); }