Не уверен, что я что-то упускаю из-за использования goto
:
Это не работает, заканчивается segfault:
for(long i = 0; i < 1000000000; i++) {
LABEL_1: {
int test[10];
goto LABEL_2;
}
LABEL_2: {
int test[10];
}
}
Тогда как это работает:
for(long i = 0; i < 1000000000; i++) {
LABEL_1: {
{ // Note this extra block
int test[10];
}
goto LABEL_2;
}
LABEL_2: {
int test[10];
}
}
Эти примеры не вызывают проблему, но представляют то, что происходит в моем коде.
Это упрощенный пример того, что происходит в https://github.com/risotto/risotto/tree/feature/direct-threading-2
См. https://github.com/risotto/risotto/blob/feature/direct-threading-2/src/lib/vm/vm.c#L332 и https://github.com/risotto/risotto/blob/feature/direct-threading-2/src/lib/vm/vm.c#L257
Из моего репо это работает:
case TARGET(OP_RETURN):
{
FunctionCall fc = vec_pop(&vm.fcs);
int rc = fc.retc;
{
Value rvals[rc];
for (int i = rc - 1; i >= 0; --i) {
rvals[i] = copy(pop());
}
vm.ip = fc.ip;
vm.sp = fc.sp;
vm.fp = fc.fp;
vm.sp -= fc.argc;
pushm(rvals, rc);
}
NEXT();
}
Это не так:
case TARGET(OP_RETURN):
{
FunctionCall fc = vec_pop(&vm.fcs);
int rc = fc.retc;
Value rvals[rc];
{
for (int i = rc - 1; i >= 0; --i) {
rvals[i] = copy(pop());
}
vm.ip = fc.ip;
vm.sp = fc.sp;
vm.fp = fc.fp;
vm.sp -= fc.argc;
pushm(rvals, rc);
}
NEXT();
}
Это скомпилировано через g cc GNU 7 и использует вычисленное goto внутри NEXT