Finalizer documentation, minor improvements

* doc/lispref/objects.texi (Finalizer Type): New section
(Type Predicates): Mention finalizers in `type-of' documentation.
* doc/lispref/elisp.texi (Top): Link to finalizer type.

* src/data.c (Ftype_of): Make `type-of' work with finalizers.
(syms_of_data): Register Qfinalizer.

* src/print.c (print_object): Print whether a finalizer has
been called.

* test/automated/finalizer-tests.el (finalizer-object-type): Test that
`type-of' works correctly for finalizers.
This commit is contained in:
Daniel Colascione 2015-03-02 19:08:06 -08:00
parent 8af3e1848c
commit 2cc23f170f
8 changed files with 63 additions and 7 deletions

View file

@ -1,3 +1,9 @@
2015-03-03 Daniel Colascione <dancol@dancol.org>
* objects.texi (Finalizer Type): New section for finalizer objects.
(Type Predicates): Mention finalizers in `type-of' documentation.
* elisp.texi (Top): Link to finalizer type.
2015-03-02 Daniel Colascione <dancol@dancol.org>
* control.texi (Generators): New section

View file

@ -316,6 +316,7 @@ Programming Types
* Byte-Code Type:: A function written in Lisp, then compiled.
* Autoload Type:: A type used for automatically loading seldom-used
functions.
* Finalizer Type:: Runs code when no longer reachable.
Character Type

View file

@ -156,6 +156,8 @@ latter are unique to Emacs Lisp.
* Byte-Code Type:: A function written in Lisp, then compiled.
* Autoload Type:: A type used for automatically loading seldom-used
functions.
* Finalizer Type:: Runs code when no longer reachable.
@end menu
@node Integer Type
@ -1361,6 +1363,31 @@ in the loaded file.
@code{autoload}, which stores the object in the function cell of a
symbol. @xref{Autoload}, for more details.
@node Finalizer Type
@subsection Finalizer Type
A @dfn{finalizer object} helps Lisp code clean up after objects that
are no longer needed. A finalizer holds a Lisp function object.
When a finalizer object becomes unreachable after a garbage collection
pass, Emacs calls the finalizer's associated function object.
When deciding whether a finalizer is reachable, Emacs does not count
references from finalizer objects themselves, allowing you to use
finalizers without having to worry about accidentally capturing
references to finalized objects themselves.
Errors in finalizers are printed to @code{*Messages*}. Emacs runs
a given finalizer object's associated function exactly once, even
if that function fails.
@defun make-finalizer function
Make a finalizer that will run @var{function}. @var{function} will be
called after garbage collection when the returned finalizer object
becomes unreachable. If the finalizer object is reachable only
through references from finalizer objects, it does not count as
reachable for the purpose of deciding whether to run @var{function}.
@var{function} will be run once per finalizer object.
@end defun
@node Editing Types
@section Editing Types
@cindex editing types
@ -1907,11 +1934,11 @@ types. In most cases, it is more convenient to use type predicates than
This function returns a symbol naming the primitive type of
@var{object}. The value is one of the symbols @code{bool-vector},
@code{buffer}, @code{char-table}, @code{compiled-function},
@code{cons}, @code{float}, @code{font-entity}, @code{font-object},
@code{font-spec}, @code{frame}, @code{hash-table}, @code{integer},
@code{marker}, @code{overlay}, @code{process}, @code{string},
@code{subr}, @code{symbol}, @code{vector}, @code{window}, or
@code{window-configuration}.
@code{cons}, @code{finalizer}, @code{float}, @code{font-entity},
@code{font-object}, @code{font-spec}, @code{frame}, @code{hash-table},
@code{integer}, @code{marker}, @code{overlay}, @code{process},
@code{string}, @code{subr}, @code{symbol}, @code{vector},
@code{window}, or @code{window-configuration}.
@example
(type-of 1)

View file

@ -1,3 +1,11 @@
2015-03-03 Daniel Colascione <dancol@dancol.org>
* print.c (print_object): Print whether a finalizer has
been called.
* data.c (Ftype_of): Make `type-of' work with finalizers.
(syms_of_data): Register Qfinalizer.
2015-03-02 Daniel Colascione <dancol@dancol.org>
* print.c (print_object): Print finalizers.

View file

@ -223,7 +223,9 @@ for example, (type-of 1) returns `integer'. */)
case Lisp_Misc_Overlay:
return Qoverlay;
case Lisp_Misc_Float:
return Qfloat;
return Qfloat;
case Lisp_Misc_Finalizer:
return Qfinalizer;
}
emacs_abort ();
@ -3547,6 +3549,7 @@ syms_of_data (void)
DEFSYM (Qcons, "cons");
DEFSYM (Qmarker, "marker");
DEFSYM (Qoverlay, "overlay");
DEFSYM (Qfinalizer, "finalizer");
DEFSYM (Qfloat, "float");
DEFSYM (Qwindow_configuration, "window-configuration");
DEFSYM (Qprocess, "process");

View file

@ -2046,7 +2046,10 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag)
break;
case Lisp_Misc_Finalizer:
strout ("#<finalizer>", -1, -1, printcharfun);
strout ("#<finalizer", -1, -1, printcharfun);
if (NILP (XFINALIZER (obj)->function))
strout (" used", -1, -1, printcharfun);
strout (">", -1, -1, printcharfun);
break;
/* Remaining cases shouldn't happen in normal usage, but let's

View file

@ -1,3 +1,8 @@
2015-03-03 Daniel Colascione <dancol@dancol.org>
* automated/finalizer-tests.el (finalizer-object-type): Test that
`type-of' works correctly for finalizers.
2015-03-02 Daniel Colascione <dancol@dancol.org>
* automated/generator-tests.el: New tests

View file

@ -76,3 +76,6 @@
(should (equal
(buffer-substring (point) (point-at-eol))
"finalizer failed: (error \"ABCDEF\")")))))
(ert-deftest finalizer-object-type ()
(should (equal (type-of (make-finalizer nil)) 'finalizer)))