Ответ 1
Потенциально каждый раз, когда вызывается функция, вам необходимо сохранить локальные переменные в структуре данных.
Нет, вы не можете - вы можете оставить локальные переменные в стеке C и все равно перебирать их: поместите все ссылочные переменные в массив и добавьте указатель на это в связанный список, к которому вы добавите node при вводе нового фрейма стека.
Mockup:
struct vm
{
struct scope *root;
};
struct scope
{
struct scope *prev, *next;
size_t size;
struct ref *refs;
};
void foo(struct vm *vm, struct scope *caller)
{
struct ref local_refs[42];
struct scope scope = {
caller, NULL, sizeof local_refs / sizeof *local_refs, local_refs };
caller->next = &scope;
// ...
caller->next = NULL;
}
Однако вам нужно будет перепрыгнуть через некоторые крупные обручи, если вы хотите поддерживать продолжения/нелокальные прыжки. В этом случае проще кучи - выделить все.