visit should take pointer as arg
This commit is contained in:
parent
fb7bfcf188
commit
77531e2d8f
@ -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;
|
||||||
|
|||||||
10
src/derv.c
10
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 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(")"); }
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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; }
|
||||||
|
|||||||
11
src/gc.c
11
src/gc.c
@ -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;
|
||||||
|
|||||||
5
src/h.h
5
src/h.h
@ -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
|
||||||
|
|||||||
12
src/harr.c
12
src/harr.c
@ -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"); }
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
8
src/ns.c
8
src/ns.c
@ -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)");
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
24
src/vm.c
24
src/vm.c
@ -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); }
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user