From faab1d57661e4d68823723a8270205c3a3c6e148 Mon Sep 17 00:00:00 2001 From: Teddy Date: Tue, 13 Aug 2013 23:47:38 +0800 Subject: add gc in `PromObj` and `Continuation` --- types.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'types.cpp') diff --git a/types.cpp b/types.cpp index 8ae25fc..3e5fd07 100644 --- a/types.cpp +++ b/types.cpp @@ -57,13 +57,13 @@ SymObj::SymObj(const string &str) : return new ReprStr(val); } -OptObj::OptObj() : Container(CLS_SIM_OBJ | CLS_OPT_OBJ) {} +OptObj::OptObj(int otype) : Container(otype | CLS_SIM_OBJ | CLS_OPT_OBJ, true) {} void OptObj::gc_decrement() {} void OptObj::gc_trigger(EvalObj ** &tail, EvalObjSet &visited) {} ProcObj::ProcObj(Pair *_body, Environment *_envt, EvalObj *_params) : - OptObj(), body(_body), params(_params), envt(_envt) { + OptObj(CLS_CONTAINER), body(_body), params(_params), envt(_envt) { gc.attach(body); gc.attach(params); gc.attach(envt); @@ -187,7 +187,7 @@ ReprCons *CharObj::get_repr_cons() { } VecObj::VecObj(size_t size, EvalObj *fill) : - EvalObj(CLS_SIM_OBJ | CLS_VECT_OBJ) { + Container(CLS_SIM_OBJ | CLS_VECT_OBJ) { vec.resize(size); for (size_t i = 0; i < size; i++) { @@ -237,6 +237,18 @@ ReprCons *VecObj::get_repr_cons() { return new VectReprCons(this, this); } +void VecObj::gc_decrement() { + for (EvalObjVec::iterator it = vec.begin(); + it != vec.end(); it++) + GC_CYC_DEC(*it); +} + +void VecObj::gc_trigger(EvalObj ** &tail, EvalObjSet &visited) { + for (EvalObjVec::iterator it = vec.begin(); + it != vec.end(); it++) + GC_CYC_TRIGGER(*it); +} + StrObj *StrObj::from_string(string repr) { size_t len = repr.length(); if (repr[0] == '\"' && repr[len - 1] == '\"') @@ -453,7 +465,7 @@ VectReprCons::VectReprCons(VecObj *_ptr, EvalObj *_ori) : } PromObj::PromObj(EvalObj *exp) : - EvalObj(CLS_SIM_OBJ | CLS_PROM_OBJ), + Container(CLS_SIM_OBJ | CLS_PROM_OBJ), entry(new Pair(exp, empty_list)), mem(NULL) { gc.attach(entry); entry->next = NULL; @@ -464,6 +476,16 @@ PromObj::~PromObj() { gc.expose(mem); } +void PromObj::gc_decrement() { + GC_CYC_DEC(entry); + GC_CYC_DEC(mem); +} + +void PromObj::gc_trigger(EvalObj ** &tail, EvalObjSet &visited) { + GC_CYC_TRIGGER(entry); + GC_CYC_TRIGGER(mem); +} + Pair *PromObj::get_entry() { return entry; } ReprCons *PromObj::get_repr_cons() { return new ReprStr("#"); } -- cgit v1.2.3