symbol_free_list = sym;
/* FIXME */
if (!NILP (sym->u.s._function))
- XBINDING (symbol_free_list->u.s._function)->b[curr_lexspace] =
- dead_object ();
+ XBINDING (symbol_free_list->u.s._function)->b[CURRENT_LEXSPACE]
+ = dead_object ();
++this_free;
}
else
#ifdef HAVE_PDUMPER
bool attempt_load_pdump = false;
#endif
-
+ Vcurrent_lexspace_idx = make_fixnum (0);
/* Look for this argument first, before any heap allocation, so we
can set heap flags properly if we're going to unexec. */
if (!initialized && temacs)
union specbinding *backtrace_top (void) EXTERNALLY_VISIBLE;
static Lisp_Object funcall_lambda (Lisp_Object, ptrdiff_t, Lisp_Object *);
+static Lisp_Object apply_lambda0 (Lisp_Object, Lisp_Object, ptrdiff_t);
static Lisp_Object apply_lambda (Lisp_Object, Lisp_Object, ptrdiff_t);
static Lisp_Object lambda_arity (Lisp_Object);
Lisp_Object
eval_sub (Lisp_Object form)
{
+ Lisp_Object lexspace = Qnil;
if (SYMBOLP (form))
{
/* Look up its binding in the lexical environment.
fun = original_fun;
if (!SYMBOLP (fun))
fun = Ffunction (list1 (fun));
- else if (!NILP (fun) && (fun = SYMBOL_FUNCTION (XSYMBOL (fun)), SYMBOLP (fun)))
+ else if (!NILP (fun)
+ && (lexspace = SYMBOL_FUNC_LEXSPACE (XSYMBOL (fun)),
+ SYMBOL_FUNCTION (XSYMBOL (fun)),
+ SYMBOLP (fun)))
fun = indirect_function (fun);
if (SUBRP (fun))
}
else if (EQ (funcar, Qlambda)
|| EQ (funcar, Qclosure))
- return apply_lambda (fun, original_args, count);
+ {
+ if (!NILP (lexspace)
+ && !EQ (lexspace, Vcurrent_lexspace_idx))
+ {
+ ptrdiff_t count1 = SPECPDL_INDEX ();
+ specbind (Qcurrent_lexspace_idx, lexspace);
+ return unbind_to (count1,
+ apply_lambda0 (fun, original_args,
+ SPECPDL_INDEX ()));
+ }
+ return apply_lambda (fun, original_args, count);
+ }
+
else
xsignal1 (Qinvalid_function, original_fun);
}
}
}
+static Lisp_Object
+apply_lambda0 (Lisp_Object fun, Lisp_Object args, ptrdiff_t count)
+{
+ Lisp_Object *arg_vector;
+ Lisp_Object tem;
+ USE_SAFE_ALLOCA;
+
+ ptrdiff_t numargs = list_length (args);
+ SAFE_ALLOCA_LISP (arg_vector, numargs);
+ Lisp_Object args_left = args;
+
+ for (ptrdiff_t i = 0; i < numargs; i++)
+ {
+ tem = Fcar (args_left), args_left = Fcdr (args_left);
+ tem = eval_sub (tem);
+ arg_vector[i] = tem;
+ }
+ tem = funcall_lambda (fun, numargs, arg_vector);
+ SAFE_FREE ();
+ return tem;
+}
+
static Lisp_Object
apply_lambda (Lisp_Object fun, Lisp_Object args, ptrdiff_t count)
{
#include <config.h>
#include "lisp.h"
-EMACS_INT curr_lexspace;
-
/* Store lexnumber in closure + set lexspace calling subrs. */
static void
EMACS_INT lexspace_num = XFIXNUM (Fhash_table_count (Vlexspaces));
if (lexspace_num == MAX_LEXSPACES)
error ("Max number of lexspaces reached");
- Lisp_Object src_lex_n = Fgethash (src, Vlexspaces, Qnil);
- if (NILP (src_lex_n))
+ Lisp_Object src_idx = Fgethash (src, Vlexspaces, Qnil);
+ if (NILP (src_idx))
error ("lexspace %s does not exists", SSDATA (SYMBOL_NAME (src)));
Fputhash (name, make_fixnum (lexspace_num), Vlexspaces);
- lexspace_copy (lexspace_num, XFIXNUM (src_lex_n));
+ lexspace_copy (lexspace_num, XFIXNUM (src_idx));
return name;
}
(Lisp_Object name)
{
CHECK_SYMBOL (name);
- Lisp_Object src_lex_n = Fgethash (name, Vlexspaces, Qnil);
- if (NILP (src_lex_n))
+ Lisp_Object src_idx = Fgethash (name, Vlexspaces, Qnil);
+ if (NILP (src_idx))
error ("lexspace %s does not exists", SSDATA (SYMBOL_NAME (name)));
- curr_lexspace = XFIXNUM (src_lex_n);
+ Vcurrent_lexspace_idx = src_idx;
return name;
}
{
DEFSYM (Qbinding, "binding");
DEFSYM (Qel, "el");
+ DEFSYM (Qcurrent_lexspace_idx, "current-lexspace-idx");
/* Internal use! */
DEFVAR_LISP ("lexspaces", Vlexspaces,
Vlexspaces = CALLN (Fmake_hash_table, QCtest, Qeq);
Fputhash (Qel, make_fixnum (0), Vlexspaces);
+ DEFVAR_LISP ("current-lexspace-idx", Vcurrent_lexspace_idx,
+ doc: /* Internal use. */);
defsubr (&Sin_lexspace);
defsubr (&Slexspace_make_from);
}
#define MAX_LEXSPACES 256
-extern EMACS_INT curr_lexspace;
+#define CURRENT_LEXSPACE XFIXNUM (Vcurrent_lexspace_idx)
INLINE Lisp_Object make_binding (Lisp_Object);
if (EQ (sym->u.s.val.value, Qunbound))
return Qunbound;
eassert (BINDINGP (sym->u.s.val.value));
- EMACS_INT lexspace = curr_lexspace;
+ EMACS_INT lexspace = CURRENT_LEXSPACE;
struct Lisp_Binding *binding = XBINDING (sym->u.s.val.value);
/* Follow redirections. */
while (binding->r[lexspace])
{
if (NILP (sym->u.s._function))
return Qnil;
- EMACS_INT lexspace = curr_lexspace;
+ EMACS_INT lexspace = CURRENT_LEXSPACE;
struct Lisp_Binding *binding = XBINDING (sym->u.s._function);
/* Follow redirections. */
while (binding->r[lexspace])
if (CONSP (tmp)
&& CONSP (XCDR (tmp))
- && EQ (XCAR (XCDR (tmp)), Qclosure))
+ && EQ (XCAR (XCDR (tmp)), Qclosure)
+ && FIXNUMP (XCAR (tmp)))
{
/* Remove the lexspace number in case (n closure () ...) is
found. */
- eassert (FIXNUMP (XCAR (tmp)));
return XCDR (tmp);
}
return tmp;
if (CONSP (tmp)
&& CONSP (XCDR (tmp))
- && EQ (XCAR (XCDR (tmp)), Qclosure))
+ && EQ (XCAR (XCDR (tmp)), Qclosure)
+ && FIXNUMP (XCAR (tmp)))
{
/* Remove the lexspace number in case (n closure () ...) is
found. */
- eassert (FIXNUMP (XCAR (tmp)));
return XCAR (tmp);
}
return Qnil;
if (EQ (sym->u.s.val.value, Qunbound))
sym->u.s.val.value = make_binding (Qunbound);
struct Lisp_Binding *binding = XBINDING (sym->u.s.val.value);
- binding->r[curr_lexspace] = false;
- binding->b[curr_lexspace] = v;
+ binding->r[CURRENT_LEXSPACE] = false;
+ binding->b[CURRENT_LEXSPACE] = v;
}
INLINE void
s->u.s._function = make_binding (Qnil);
/* Functions must execute in the original lexspace so lets store it. */
if (CONSP (function) && EQ (XCAR (function), Qclosure))
- function = Fcons (make_fixnum (curr_lexspace), function);
- XBINDING (s->u.s._function)->b[curr_lexspace] = function;
+ function = Fcons (Vcurrent_lexspace_idx, function);
+ XBINDING (s->u.s._function)->b[CURRENT_LEXSPACE] = function;
}
INLINE void