From dbeab0d63b21c14e9c462c08c8f776e9428b853c Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 17 Oct 2021 12:51:51 +0200 Subject: Add stack protection for recursive funcs --- src/bootstrap/primitives.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/bootstrap/primitives.c') diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c index a814e40..0403e3a 100644 --- a/src/bootstrap/primitives.c +++ b/src/bootstrap/primitives.c @@ -5,6 +5,7 @@ Object * proc_if(Environment *env, Object *obj); Object * eval(Environment *env, Object *root) { Object* lambda; + Object* ret = NULL; bool recursion_active = false; eval_start: switch (root->type) { @@ -15,7 +16,8 @@ eval_start: case OBJ_TYPE_BOOL: case OBJ_TYPE_NIL: case OBJ_TYPE_STRING: { - return root; + ret = root; + goto eval_success; } break; case OBJ_TYPE_SYMBOL: { Object *val = env_lookup(env, root); @@ -26,7 +28,8 @@ eval_start: }); return obj_err; } - return val; + ret = val; + goto eval_success; } break; case OBJ_TYPE_PAIR: { if (root->car->type == OBJ_TYPE_SYMBOL) { @@ -64,7 +67,8 @@ eval_start: } goto eval_start; } - return val->proc(env, root->cdr); + ret = val->proc(env, root->cdr); + goto eval_success; } if (val->type == OBJ_TYPE_LAMBDA) { lambda = val; @@ -86,8 +90,12 @@ eval_lambda: args = root->cdr; Object *params = lambda->params; if (!recursion_active) { - env = env_extend(lambda->env, env); recursion_active = true; + // Protect current stack. + Environment *tmp = env_create(lambda->env); + push_active_env(tmp); + // Extend environment. + env = env_extend(tmp, env); } while (params != obj_nil) { if (args == obj_nil) { @@ -138,6 +146,12 @@ eval_lambda: .value = ERR_UNKNOWN_OBJ_TYPE, }); return obj_err; +eval_success: + if (recursion_active) { + // Remove stack protector. + pop_active_env(); + } + return ret; } Object * -- cgit v1.2.1