bytecmp: factor out c_restore_env (used together with c_new_env)

This commit is contained in:
Marius Gerbershagen 2020-12-27 18:58:43 +01:00
parent c18b6d6967
commit be46fc0caa

View file

@ -568,6 +568,12 @@ c_new_env(cl_env_ptr the_env, cl_compiler_env_ptr new, cl_object env,
new->env_size = 0; new->env_size = 0;
} }
static void
c_restore_env(cl_env_ptr the_env, cl_compiler_env_ptr new_c_env, cl_compiler_env_ptr old_c_env)
{
the_env->c_env = old_c_env;
}
static cl_object static cl_object
c_tag_ref(cl_env_ptr env, cl_object the_tag, cl_object the_type) c_tag_ref(cl_env_ptr env, cl_object the_tag, cl_object the_type)
{ {
@ -3139,7 +3145,7 @@ ecl_make_lambda(cl_env_ptr env, cl_object name, cl_object lambda) {
output->bytecodes.name = name; output->bytecodes.name = name;
old_c_env->load_time_forms = env->c_env->load_time_forms; old_c_env->load_time_forms = env->c_env->load_time_forms;
env->c_env = old_c_env; c_restore_env(env, &new_c_env, old_c_env);
ecl_bds_unwind1(env); ecl_bds_unwind1(env);
@ -3183,21 +3189,21 @@ si_make_lambda(cl_object name, cl_object rest)
{ {
cl_object lambda; cl_object lambda;
const cl_env_ptr the_env = ecl_process_env(); const cl_env_ptr the_env = ecl_process_env();
volatile cl_compiler_env_ptr old_c_env = the_env->c_env; cl_compiler_env_ptr old_c_env = the_env->c_env;
struct cl_compiler_env new_c_env; struct cl_compiler_env new_c_env;
c_new_env(the_env, &new_c_env, ECL_NIL, 0); c_new_env(the_env, &new_c_env, ECL_NIL, 0);
ECL_UNWIND_PROTECT_BEGIN(the_env) { ECL_UNWIND_PROTECT_BEGIN(the_env) {
lambda = ecl_make_lambda(the_env, name, rest); lambda = ecl_make_lambda(the_env, name, rest);
} ECL_UNWIND_PROTECT_EXIT { } ECL_UNWIND_PROTECT_EXIT {
the_env->c_env = old_c_env; c_restore_env(the_env, &new_c_env, old_c_env);
} ECL_UNWIND_PROTECT_END; } ECL_UNWIND_PROTECT_END;
@(return lambda); @(return lambda);
} }
@(defun si::eval-with-env (form &optional (env ECL_NIL) (stepping ECL_NIL) @(defun si::eval-with-env (form &optional (env ECL_NIL) (stepping ECL_NIL)
(compiler_env_p ECL_NIL) (mode @':execute')) (compiler_env_p ECL_NIL) (mode @':execute'))
volatile cl_compiler_env_ptr old_c_env; cl_compiler_env_ptr old_c_env;
struct cl_compiler_env new_c_env; struct cl_compiler_env new_c_env;
cl_object interpreter_env, compiler_env; cl_object interpreter_env, compiler_env;
@ @
@ -3242,9 +3248,7 @@ si_make_lambda(cl_object name, cl_object rest)
the_env->nvalues = 1; the_env->nvalues = 1;
} }
} ECL_UNWIND_PROTECT_EXIT { } ECL_UNWIND_PROTECT_EXIT {
/* Clear up */ c_restore_env(the_env, &new_c_env, old_c_env);
the_env->c_env = old_c_env;
memset(&new_c_env, 0, sizeof(new_c_env));
} ECL_UNWIND_PROTECT_END; } ECL_UNWIND_PROTECT_END;
return the_env->values[0]; return the_env->values[0];
@) @)