fix GC safety bugs in compile.cpp

This commit is contained in:
Joel Dice 2008-01-01 18:07:12 -07:00
parent 4378110506
commit 1d7931a654

View File

@ -3768,7 +3768,7 @@ visitStack(MyThread* t, Heap::Visitor* v)
void* ip = t->ip; void* ip = t->ip;
void* base = t->base; void* base = t->base;
void** stack = static_cast<void**>(t->stack); void** stack = static_cast<void**>(t->stack);
if (ip == 0) { if (ip == 0 and stack) {
ip = *stack; ip = *stack;
} }
@ -3791,11 +3791,16 @@ visitStack(MyThread* t, Heap::Visitor* v)
visitStackAndLocals(t, v, base, node); visitStackAndLocals(t, v, base, node);
stack = static_cast<void**>(base) + 1; stack = static_cast<void**>(base) + 1;
ip = *stack; if (stack) {
ip = *stack;
}
base = *static_cast<void**>(base); base = *static_cast<void**>(base);
} else if (trace) { } else if (trace) {
base = trace->base; base = trace->base;
stack = static_cast<void**>(trace->stack); stack = static_cast<void**>(trace->stack);
if (stack) {
ip = *stack;
}
trace = trace->next; trace = trace->next;
} else { } else {
break; break;
@ -4015,19 +4020,20 @@ class SegFaultHandler: public System::SignalHandler {
void** thread) void** thread)
{ {
MyThread* t = static_cast<MyThread*>(m->localThread->get()); MyThread* t = static_cast<MyThread*>(m->localThread->get());
object node = findTraceNode(t, *ip); if (t->state == Thread::ActiveState) {
if (node) { object node = findTraceNode(t, *ip);
t->ip = *ip; if (node) {
t->base = *base; t->ip = *ip;
t->stack = *stack; t->base = *base;
t->exception = makeNullPointerException(t); t->stack = *stack;
t->exception = makeNullPointerException(t);
findUnwindTarget(t, ip, base, stack); findUnwindTarget(t, ip, base, stack);
*thread = t; *thread = t;
return true; return true;
} else { }
return false;
} }
return false;
} }
Machine* m; Machine* m;
@ -4409,6 +4415,7 @@ resizeTable(MyThread* t, object oldTable, unsigned newLength)
PROTECT(t, oldNode); PROTECT(t, oldNode);
object newTable = makeArray(t, newLength, true); object newTable = makeArray(t, newLength, true);
PROTECT(t, newTable);
for (unsigned i = 0; i < arrayLength(t, oldTable); ++i) { for (unsigned i = 0; i < arrayLength(t, oldTable); ++i) {
for (oldNode = arrayBody(t, oldTable, i); for (oldNode = arrayBody(t, oldTable, i);