mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-27 07:37:33 +00:00
(Writing Emacs Primitives): Strings are
no longer special for GCPROs. Mention GCPRO5, GCPRO6. Explain GCPRO convention for varargs function args.
This commit is contained in:
parent
80d9508acf
commit
70bb440262
@ -572,23 +572,30 @@ Lisp object that you intend to refer to again must be protected somehow.
|
|||||||
@code{UNGCPRO} cancels the protection of the variables that are
|
@code{UNGCPRO} cancels the protection of the variables that are
|
||||||
protected in the current function. It is necessary to do this explicitly.
|
protected in the current function. It is necessary to do this explicitly.
|
||||||
|
|
||||||
For most data types, it suffices to protect at least one pointer to
|
It suffices to ensure that at least one pointer to each object is
|
||||||
the object; as long as the object is not recycled, all pointers to it
|
GC-protected; as long as the object is not recycled, all pointers to
|
||||||
remain valid. This is not so for strings, because the garbage collector
|
it remain valid. So if you are sure that a local variable points to
|
||||||
can move them. When the garbage collector moves a string, it relocates
|
an object that will be preserved by some other pointer, that local
|
||||||
all the pointers it knows about; any other pointers become invalid.
|
variable does not need a GCPRO. (Formerly, strings were an exception
|
||||||
Therefore, you must protect all pointers to strings across any point
|
to this rule; in older Emacs versions, every pointer to a string
|
||||||
where garbage collection may be possible.
|
needed to be marked by GC.)
|
||||||
|
|
||||||
The macro @code{GCPRO1} protects just one local variable. If you want
|
The macro @code{GCPRO1} protects just one local variable. If you
|
||||||
to protect two, use @code{GCPRO2} instead; repeating @code{GCPRO1} will
|
want to protect two, use @code{GCPRO2} instead; repeating
|
||||||
not work. Macros @code{GCPRO3} and @code{GCPRO4} also exist.
|
@code{GCPRO1} will not work. Macros, @code{GCPRO3}, @code{GCPRO4},
|
||||||
|
@code{GCPRO5}, and @code{GCPRO6} also exist. These macros implicitly
|
||||||
These macros implicitly use local variables such as @code{gcpro1}; you
|
use local variables such as @code{gcpro1}; you must declare these
|
||||||
must declare these explicitly, with type @code{struct gcpro}. Thus, if
|
explicitly, with type @code{struct gcpro}. Thus, if you use
|
||||||
you use @code{GCPRO2}, you must declare @code{gcpro1} and @code{gcpro2}.
|
@code{GCPRO2}, you must declare @code{gcpro1} and @code{gcpro2}.
|
||||||
Alas, we can't explain all the tricky details here.
|
Alas, we can't explain all the tricky details here.
|
||||||
|
|
||||||
|
Built-in functions that take a variable number of arguments actually
|
||||||
|
accept two arguments at the C level: the number of Lisp arguments, and
|
||||||
|
a @code{Lisp_Object *} pointer to a C vector containing those Lisp
|
||||||
|
arguments. This C vector may be part of a Lisp vector, but it need
|
||||||
|
not be. The responsibility for protecting the Lisp arguments from GC
|
||||||
|
rests with the caller in this case.
|
||||||
|
|
||||||
You must not use C initializers for static or global variables unless
|
You must not use C initializers for static or global variables unless
|
||||||
the variables are never written once Emacs is dumped. These variables
|
the variables are never written once Emacs is dumped. These variables
|
||||||
with initializers are allocated in an area of memory that becomes
|
with initializers are allocated in an area of memory that becomes
|
||||||
|
Loading…
Reference in New Issue
Block a user