mirror of
https://github.com/corda/corda.git
synced 2025-03-03 04:49:46 +00:00
fix GC safety bugs in compile.cpp
This commit is contained in:
parent
4378110506
commit
1d7931a654
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user