Add GC support
This commit is contained in:
parent
fec2e03a75
commit
2644480b9e
@ -356,6 +356,11 @@ static void emit_gc_check(char *source, ostream &s) {
|
|||||||
s << JAL << "_gc_check" << endl;
|
s << JAL << "_gc_check" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void emit_gc_assign(int offset, ostream &s) {
|
||||||
|
emit_addiu(A1, SELF, offset * WORD_SIZE, s);
|
||||||
|
emit_gc_assign(s);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
| ........ |
|
| ........ |
|
||||||
|------------|
|
|------------|
|
||||||
@ -737,7 +742,7 @@ void CgenClassTable::gen_init_code() {
|
|||||||
for (auto i = 0U; i < attrs->size(); ++i) {
|
for (auto i = 0U; i < attrs->size(); ++i) {
|
||||||
auto attr_pair = (*attrs)[i];
|
auto attr_pair = (*attrs)[i];
|
||||||
loctab.add(LocationTableItem(attr_pair.second->name, Attribute,
|
loctab.add(LocationTableItem(attr_pair.second->name, Attribute,
|
||||||
i + DEFAULT_OBJFIELDS));
|
i + DEFAULT_OBJFIELDS));
|
||||||
}
|
}
|
||||||
for (auto i = 0U; i < attrs->size(); ++i) {
|
for (auto i = 0U; i < attrs->size(); ++i) {
|
||||||
auto attr_pair = (*attrs)[i];
|
auto attr_pair = (*attrs)[i];
|
||||||
@ -754,6 +759,8 @@ void CgenClassTable::gen_init_code() {
|
|||||||
this->expr_type_decl = attr_pair.second->type_decl;
|
this->expr_type_decl = attr_pair.second->type_decl;
|
||||||
attr_pair.second->init->code(str, this);
|
attr_pair.second->init->code(str, this);
|
||||||
emit_store(ACC, i + DEFAULT_OBJFIELDS, SELF, str);
|
emit_store(ACC, i + DEFAULT_OBJFIELDS, SELF, str);
|
||||||
|
if (cgen_Memmgr != GC_NOGC)
|
||||||
|
emit_gc_assign(i + DEFAULT_OBJFIELDS, str);
|
||||||
}
|
}
|
||||||
loctab.exitscope();
|
loctab.exitscope();
|
||||||
emit_move(ACC, SELF, str);
|
emit_move(ACC, SELF, str);
|
||||||
@ -1240,8 +1247,11 @@ void assign_class::code(ostream &s, CgenClassTable *classtab) {
|
|||||||
emit_store(ACC, loc->offset, FP, s);
|
emit_store(ACC, loc->offset, FP, s);
|
||||||
} else {
|
} else {
|
||||||
emit_store(ACC, loc->offset, SELF, s);
|
emit_store(ACC, loc->offset, SELF, s);
|
||||||
|
if (cgen_Memmgr != GC_NOGC)
|
||||||
|
emit_gc_assign(loc->offset, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
static dispatch is a little bit simpler than normal dispatch
|
static dispatch is a little bit simpler than normal dispatch
|
||||||
Intuitively, first evaluate all the parameter expression and push stack. Note
|
Intuitively, first evaluate all the parameter expression and push stack. Note
|
||||||
@ -1262,7 +1272,7 @@ void static_dispatch_class::code(ostream &s, CgenClassTable *classtab) {
|
|||||||
auto actual_expr = this->actual->nth(actual_i);
|
auto actual_expr = this->actual->nth(actual_i);
|
||||||
actual_expr->code(s, classtab);
|
actual_expr->code(s, classtab);
|
||||||
emit_push(ACC, s); // push param to stack
|
emit_push(ACC, s); // push param to stack
|
||||||
++ nparams;
|
++nparams;
|
||||||
}
|
}
|
||||||
this->expr->code(s, classtab);
|
this->expr->code(s, classtab);
|
||||||
auto label_dispatch = classtab->alloc_label_index();
|
auto label_dispatch = classtab->alloc_label_index();
|
||||||
@ -1301,7 +1311,7 @@ void dispatch_class::code(ostream &s, CgenClassTable *classtab) {
|
|||||||
auto actual_expr = this->actual->nth(actual_i);
|
auto actual_expr = this->actual->nth(actual_i);
|
||||||
actual_expr->code(s, classtab);
|
actual_expr->code(s, classtab);
|
||||||
emit_push(ACC, s); // push param to stack
|
emit_push(ACC, s); // push param to stack
|
||||||
++ nparams;
|
++nparams;
|
||||||
}
|
}
|
||||||
this->expr->code(s, classtab);
|
this->expr->code(s, classtab);
|
||||||
auto label_dispatch = classtab->alloc_label_index();
|
auto label_dispatch = classtab->alloc_label_index();
|
||||||
@ -1332,6 +1342,7 @@ void dispatch_class::code(ostream &s, CgenClassTable *classtab) {
|
|||||||
// call the method whose address is in $t1, with self object in $a0
|
// call the method whose address is in $t1, with self object in $a0
|
||||||
emit_jalr(T1, s);
|
emit_jalr(T1, s);
|
||||||
rel_stack_depth -= nparams;
|
rel_stack_depth -= nparams;
|
||||||
|
// caller doesn't pop the params, so we need to manual set the stack depth
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -37,8 +37,10 @@ class C inherits A {
|
|||||||
method_3(x1: Int, x2: A, x3: String) : Object {
|
method_3(x1: Int, x2: A, x3: String) : Object {
|
||||||
{
|
{
|
||||||
x1 <- x1 + 00010 - x1 / 10;
|
x1 <- x1 + 00010 - x1 / 10;
|
||||||
|
attr_C_1 <- x3;
|
||||||
x2 <- x2.method_common(x1);
|
x2 <- x2.method_common(x1);
|
||||||
x3 <- x3.concat("schade");
|
x3 <- x3.concat("schade");
|
||||||
|
attr_C_0 <- x1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
method_2(x1: Bool, x2: C) : Object {
|
method_2(x1: Bool, x2: C) : Object {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user