mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2025-12-06 02:40:26 -08:00
lexenv: don't bypass referencing the cl_object instance
This is a preliminary step towards consistent access between LCL and LEX envs.
This commit is contained in:
parent
bd5e72def6
commit
75dcfaf705
2 changed files with 11 additions and 12 deletions
|
|
@ -134,20 +134,25 @@ ecl_lcl_env_get_record(cl_object env, int s)
|
||||||
} while(1);
|
} while(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static cl_object
|
||||||
|
ecl_lex_env_get_record(cl_object env, int s)
|
||||||
|
{
|
||||||
|
return env->vector.self.t[s];
|
||||||
|
}
|
||||||
|
|
||||||
#define ecl_lcl_env_get_fun(env,x) ecl_lcl_env_get_record(env,x)
|
#define ecl_lcl_env_get_fun(env,x) ecl_lcl_env_get_record(env,x)
|
||||||
#define ecl_lcl_env_get_blk(env,x) ecl_lcl_env_get_record(env,x)
|
#define ecl_lcl_env_get_blk(env,x) ecl_lcl_env_get_record(env,x)
|
||||||
#define ecl_lcl_env_get_tag(env,x) ecl_lcl_env_get_record(env,x)
|
#define ecl_lcl_env_get_tag(env,x) ecl_lcl_env_get_record(env,x)
|
||||||
#define ecl_lcl_env_get_var(env,x) ECL_CONS_CDR(ecl_lcl_env_get_record(env,x))
|
#define ecl_lcl_env_get_var(env,x) ECL_CONS_CDR(ecl_lcl_env_get_record(env,x))
|
||||||
#define ecl_lcl_env_set_var(env,x,v) ECL_RPLACD(ecl_lcl_env_get_record(env,x),(v))
|
#define ecl_lcl_env_set_var(env,x,v) ECL_RPLACD(ecl_lcl_env_get_record(env,x),(v))
|
||||||
|
|
||||||
#define ecl_lex_env_get_record(env,x) env[x]
|
|
||||||
#define ecl_lex_env_get_fun(env,x) ecl_lex_env_get_record(env,x)
|
#define ecl_lex_env_get_fun(env,x) ecl_lex_env_get_record(env,x)
|
||||||
#define ecl_lex_env_get_blk(env,x) ecl_lex_env_get_record(env,x)
|
#define ecl_lex_env_get_blk(env,x) ecl_lex_env_get_record(env,x)
|
||||||
#define ecl_lex_env_get_tag(env,x) ecl_lex_env_get_record(env,x)
|
#define ecl_lex_env_get_tag(env,x) ecl_lex_env_get_record(env,x)
|
||||||
#define ecl_lex_env_get_var(env,x) ECL_CONS_CDR(ecl_lex_env_get_record(env,x))
|
#define ecl_lex_env_get_var(env,x) ECL_CONS_CDR(ecl_lex_env_get_record(env,x))
|
||||||
#define ecl_lex_env_set_var(env,x,v) ECL_RPLACD(ecl_lex_env_get_record(env,x),(v))
|
#define ecl_lex_env_set_var(env,x,v) ECL_RPLACD(ecl_lex_env_get_record(env,x),(v))
|
||||||
|
|
||||||
/* -- Lexenv operators --------------------------------------------------- */
|
/* -- Lexical and local env operators ------------------------------------------ */
|
||||||
|
|
||||||
static cl_object
|
static cl_object
|
||||||
make_lex(cl_index n)
|
make_lex(cl_index n)
|
||||||
|
|
@ -162,12 +167,6 @@ push_lex(cl_object stack, cl_object new)
|
||||||
cl_vector_push(new, stack);
|
cl_vector_push(new, stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
static cl_object *
|
|
||||||
data_lex(cl_object stack)
|
|
||||||
{
|
|
||||||
return stack->vector.self.t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------- AIDS TO THE INTERPRETER -------------------- */
|
/* -------------------- AIDS TO THE INTERPRETER -------------------- */
|
||||||
|
|
||||||
cl_object
|
cl_object
|
||||||
|
|
@ -241,7 +240,7 @@ close_around_self(cl_object fun) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
close_around_self_fixup(cl_object fun, cl_object lcl_env, cl_object *lex_env) {
|
close_around_self_fixup(cl_object fun, cl_object lcl_env, cl_object lex_env) {
|
||||||
cl_object new_lex, template, entry;
|
cl_object new_lex, template, entry;
|
||||||
cl_fixnum nlex, idx, ndx;
|
cl_fixnum nlex, idx, ndx;
|
||||||
switch(ecl_t_of(fun)) {
|
switch(ecl_t_of(fun)) {
|
||||||
|
|
@ -273,7 +272,7 @@ close_around_self_fixup(cl_object fun, cl_object lcl_env, cl_object *lex_env) {
|
||||||
|
|
||||||
|
|
||||||
cl_object
|
cl_object
|
||||||
ecl_close_around(cl_object fun, cl_object lcl_env, cl_object *lex_env) {
|
ecl_close_around(cl_object fun, cl_object lcl_env, cl_object lex_env) {
|
||||||
cl_object v, new_lex, template, entry;
|
cl_object v, new_lex, template, entry;
|
||||||
cl_fixnum nlex, idx, ndx;
|
cl_fixnum nlex, idx, ndx;
|
||||||
if(ecl_t_of(fun) != t_bytecodes)
|
if(ecl_t_of(fun) != t_bytecodes)
|
||||||
|
|
@ -337,7 +336,7 @@ ecl_interpret(cl_object frame, cl_object closure, cl_object bytecodes)
|
||||||
volatile cl_index frame_index = 0;
|
volatile cl_index frame_index = 0;
|
||||||
cl_opcode *vector = (cl_opcode*)bytecodes->bytecodes.code;
|
cl_opcode *vector = (cl_opcode*)bytecodes->bytecodes.code;
|
||||||
cl_object *data = bytecodes->bytecodes.data->vector.self.t;
|
cl_object *data = bytecodes->bytecodes.data->vector.self.t;
|
||||||
cl_object *lex_env = Null(closure) ? NULL : data_lex(closure);
|
cl_object lex_env = closure;
|
||||||
cl_object reg0 = ECL_NIL, reg1 = ECL_NIL, lcl_env = NULL;
|
cl_object reg0 = ECL_NIL, reg1 = ECL_NIL, lcl_env = NULL;
|
||||||
cl_index narg;
|
cl_index narg;
|
||||||
struct ecl_stack_frame frame_aux;
|
struct ecl_stack_frame frame_aux;
|
||||||
|
|
|
||||||
|
|
@ -361,7 +361,7 @@ extern cl_object si_constant_form_value _ECL_ARGS((cl_narg narg, cl_object form,
|
||||||
|
|
||||||
extern cl_object _ecl_bytecodes_dispatch_vararg(cl_narg narg, ...);
|
extern cl_object _ecl_bytecodes_dispatch_vararg(cl_narg narg, ...);
|
||||||
extern cl_object _ecl_bclosure_dispatch_vararg(cl_narg narg, ...);
|
extern cl_object _ecl_bclosure_dispatch_vararg(cl_narg narg, ...);
|
||||||
extern cl_object ecl_close_around(cl_object fun, cl_object env, cl_object *flex);
|
extern cl_object ecl_close_around(cl_object fun, cl_object env, cl_object flex);
|
||||||
|
|
||||||
/* ffi/backtrace.d */
|
/* ffi/backtrace.d */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue