mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-01 01:41:01 -08:00
Inline record_in_backtrace
It's critical in several function call paths. * src/eval.c (grow_specpdl_allocation): Make non-static. (grow_specpdl, record_in_backtrace): Move from here... * src/lisp.h (grow_specpdl, record_in_backtrace): ... to here, and declare inline.
This commit is contained in:
parent
6ef9dc7797
commit
213483124b
2 changed files with 36 additions and 35 deletions
36
src/eval.c
36
src/eval.c
|
|
@ -2320,7 +2320,7 @@ alist mapping symbols to their value. */)
|
|||
return unbind_to (count, eval_sub (form));
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
grow_specpdl_allocation (void)
|
||||
{
|
||||
eassert (specpdl_ptr == specpdl + specpdl_size);
|
||||
|
|
@ -2342,40 +2342,6 @@ grow_specpdl_allocation (void)
|
|||
specpdl_ptr = specpdl_ref_to_ptr (count);
|
||||
}
|
||||
|
||||
/* Grow the specpdl stack by one entry.
|
||||
The caller should have already initialized the entry.
|
||||
Signal an error on stack overflow.
|
||||
|
||||
Make sure that there is always one unused entry past the top of the
|
||||
stack, so that the just-initialized entry is safely unwound if
|
||||
memory exhausted and an error is signaled here. Also, allocate a
|
||||
never-used entry just before the bottom of the stack; sometimes its
|
||||
address is taken. */
|
||||
|
||||
INLINE void
|
||||
grow_specpdl (void)
|
||||
{
|
||||
specpdl_ptr++;
|
||||
if (specpdl_ptr == specpdl + specpdl_size)
|
||||
grow_specpdl_allocation ();
|
||||
}
|
||||
|
||||
specpdl_ref
|
||||
record_in_backtrace (Lisp_Object function, Lisp_Object *args, ptrdiff_t nargs)
|
||||
{
|
||||
specpdl_ref count = SPECPDL_INDEX ();
|
||||
|
||||
eassert (nargs >= UNEVALLED);
|
||||
specpdl_ptr->bt.kind = SPECPDL_BACKTRACE;
|
||||
specpdl_ptr->bt.debug_on_exit = false;
|
||||
specpdl_ptr->bt.function = function;
|
||||
current_thread->stack_top = specpdl_ptr->bt.args = args;
|
||||
specpdl_ptr->bt.nargs = nargs;
|
||||
grow_specpdl ();
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* Eval a sub-expression of the current expression (i.e. in the same
|
||||
lexical scope). */
|
||||
Lisp_Object
|
||||
|
|
|
|||
35
src/lisp.h
35
src/lisp.h
|
|
@ -3454,6 +3454,41 @@ backtrace_debug_on_exit (union specbinding *pdl)
|
|||
return pdl->bt.debug_on_exit;
|
||||
}
|
||||
|
||||
void grow_specpdl_allocation (void);
|
||||
|
||||
/* Grow the specpdl stack by one entry.
|
||||
The caller should have already initialized the entry.
|
||||
Signal an error on stack overflow.
|
||||
|
||||
Make sure that there is always one unused entry past the top of the
|
||||
stack, so that the just-initialized entry is safely unwound if
|
||||
memory exhausted and an error is signaled here. Also, allocate a
|
||||
never-used entry just before the bottom of the stack; sometimes its
|
||||
address is taken. */
|
||||
INLINE void
|
||||
grow_specpdl (void)
|
||||
{
|
||||
specpdl_ptr++;
|
||||
if (specpdl_ptr == specpdl + specpdl_size)
|
||||
grow_specpdl_allocation ();
|
||||
}
|
||||
|
||||
INLINE specpdl_ref
|
||||
record_in_backtrace (Lisp_Object function, Lisp_Object *args, ptrdiff_t nargs)
|
||||
{
|
||||
specpdl_ref count = SPECPDL_INDEX ();
|
||||
|
||||
eassert (nargs >= UNEVALLED);
|
||||
specpdl_ptr->bt.kind = SPECPDL_BACKTRACE;
|
||||
specpdl_ptr->bt.debug_on_exit = false;
|
||||
specpdl_ptr->bt.function = function;
|
||||
current_thread->stack_top = specpdl_ptr->bt.args = args;
|
||||
specpdl_ptr->bt.nargs = nargs;
|
||||
grow_specpdl ();
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/* This structure helps implement the `catch/throw' and `condition-case/signal'
|
||||
control structures. A struct handler contains all the information needed to
|
||||
restore the state of the interpreter after a non-local jump.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue