aboutsummaryrefslogtreecommitdiff
path: root/types.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'types.cpp')
-rw-r--r--types.cpp30
1 files changed, 26 insertions, 4 deletions
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("#<Promise>"); }