comparison man/internals/internals.texi @ 5142:f965e31a35f0

reduce lcrecord headers to 2 words, rename printing_unreadable_object -------------------- ChangeLog entries follow: -------------------- man/ChangeLog addition: 2010-03-13 Ben Wing <ben@xemacs.org> * internals/internals.texi (Working with Lisp Objects): * internals/internals.texi (Writing Macros): * internals/internals.texi (lrecords): More rewriting to correspond with changes from *LRECORD* to *LISP_OBJECT*. modules/ChangeLog addition: 2010-03-13 Ben Wing <ben@xemacs.org> * postgresql/postgresql.c (print_pgconn): * postgresql/postgresql.c (print_pgresult): printing_unreadable_object -> printing_unreadable_object_fmt. 2010-03-13 Ben Wing <ben@xemacs.org> * ldap/eldap.c (print_ldap): printing_unreadable_object -> printing_unreadable_object_fmt. src/ChangeLog addition: 2010-03-13 Ben Wing <ben@xemacs.org> * alloc.c (alloc_sized_lrecord_1): * alloc.c (alloc_sized_lrecord_array): * alloc.c (old_alloc_sized_lcrecord): * alloc.c (disksave_object_finalization_1): * alloc.c (mark_lcrecord_list): * alloc.c (alloc_managed_lcrecord): * alloc.c (free_managed_lcrecord): * alloc.c (tick_lcrecord_stats): * alloc.c (sweep_lcrecords_1): * buffer.c (print_buffer): * buffer.c (DEFVAR_BUFFER_LOCAL_1): * casetab.c: * casetab.c (print_case_table): * console.c (print_console): * console.c (DEFVAR_CONSOLE_LOCAL_1): * data.c (print_weak_list): * data.c (print_weak_box): * data.c (print_ephemeron): * data.c (ephemeron_equal): * database.c (print_database): * database.c (finalize_database): * device-msw.c (sync_printer_with_devmode): * device-msw.c (print_devmode): * device-msw.c (finalize_devmode): * device.c: * device.c (print_device): * elhash.c: * elhash.c (print_hash_table): * eval.c (print_subr): * eval.c (print_multiple_value): * event-stream.c (event_stream_resignal_wakeup): * events.c (clear_event_resource): * events.c (zero_event): * events.c (print_event): * extents.c: * extents.c (print_extent): * file-coding.c (print_coding_system): * font-mgr.c: * font-mgr.c (Ffc_init): * frame.c: * frame.c (print_frame): * gc.c: * gc.c (GC_CHECK_NOT_FREE): * glyphs.c: * glyphs.c (print_image_instance): * glyphs.c (print_glyph): * gui.c (print_gui_item): * gui.c (copy_gui_item): * keymap.c (print_keymap): * keymap.c (MARKED_SLOT): * lisp.h: * lisp.h (struct Lisp_String): * lisp.h (DEFUN): * lisp.h (DEFUN_NORETURN): * lrecord.h: * lrecord.h (NORMAL_LISP_OBJECT_UID): * lrecord.h (struct lrecord_header): * lrecord.h (set_lheader_implementation): * lrecord.h (struct old_lcrecord_header): * lrecord.h (struct free_lcrecord_header): * marker.c (print_marker): * mule-charset.c: * mule-charset.c (print_charset): * objects.c (print_color_instance): * objects.c (print_font_instance): * objects.c (finalize_font_instance): * print.c (print_cons): * print.c (printing_unreadable_object_fmt): * print.c (printing_unreadable_lisp_object): * print.c (external_object_printer): * print.c (internal_object_printer): * print.c (debug_p4): * print.c (ext_print_begin): * process.c (print_process): * rangetab.c (print_range_table): * rangetab.c (range_table_equal): * scrollbar.c (free_scrollbar_instance): * specifier.c (print_specifier): * specifier.c (finalize_specifier): * symbols.c (guts_of_unbound_marker): * symeval.h: * symeval.h (DEFVAR_SYMVAL_FWD): * tooltalk.c: * tooltalk.c (print_tooltalk_message): * tooltalk.c (print_tooltalk_pattern): * ui-gtk.c (ffi_object_printer): * ui-gtk.c (emacs_gtk_object_printer): * ui-gtk.c (emacs_gtk_boxed_printer): * window.c (print_window): * window.c (free_window_mirror): * window.c (debug_print_window): * xemacs.def.in.in: (1) printing_unreadable_object -> printing_unreadable_object_fmt. (2) printing_unreadable_lcrecord -> printing_unreadable_lisp_object and fix up so it no longer requires an lcrecord. These previous changes eliminate most of the remaining places where the terms `lcrecord' and `lrecord' occurred outside of specialized code. (3) Fairly major change: Reduce the number of words in an lcrecord from 3 to 2. The third word consisted of a uid that duplicated the lrecord uid, and a single free bit, which was moved into the lrecord structure. This reduces the size of the `uid' slot from 21 bits to 20 bits. Arguably this isn't enough -- we could easily have more than 1,000,000 or so objects created in a session. The answer is (a) It doesn't really matter if we overflow the uid field because it's only used for debugging, to identify an object uniquely (or pretty much so). (b) If we cared about it overflowing and wanted to reduce this, we could make it so that cons, string, float and certain other frob-block types that never print out the uid simply don't store a uid in them and don't increment the lrecord_uid_counter. (4) In conjunction with (3), create new macro NORMAL_LISP_OBJECT_UID() and use it to abstract out the differences between NEWGC and old-GC in accessing the `uid' value from a "normal Lisp Object pointer". (5) In events.c, use zero_nonsized_lisp_object() in place of custom- written equivalent. In font-mgr.c use external_object_printer() in place of custom-written equivalents.
author Ben Wing <ben@xemacs.org>
date Sat, 13 Mar 2010 05:38:08 -0600
parents 7be849cb8828
children 97eb4942aec8
comparison
equal deleted inserted replaced
5141:0dcd22290039 5142:f965e31a35f0
5273 style now forbids passing pointers to @samp{Lisp_<Type>} structures into 5273 style now forbids passing pointers to @samp{Lisp_<Type>} structures into
5274 or out of a function; instead, a @samp{Lisp_Object} should be passed or 5274 or out of a function; instead, a @samp{Lisp_Object} should be passed or
5275 returned (created using @samp{wrap_<type>}, if necessary). 5275 returned (created using @samp{wrap_<type>}, if necessary).
5276 5276
5277 @c #### declaration 5277 @c #### declaration
5278 @item DECLARE_LRECORD (<type>, Lisp_<Type>) 5278 @item DECLARE_LISP_OBJECT (<type>, Lisp_<Type>)
5279 Declares an @samp{lrecord} for @samp{<Type>}, which is the unit of 5279 Declares a Lisp object for @samp{<Type>}, which is the unit of
5280 allocation. 5280 allocation.
5281 5281
5282 @item #define X<TYPE>(x) XRECORD (x, <type>, Lisp_<Type>) 5282 @item #define X<TYPE>(x) XRECORD (x, <type>, Lisp_<Type>)
5283 Turns a @code{Lisp_Object} into a pointer to @samp{struct Lisp_<Type>}. 5283 Turns a @code{Lisp_Object} into a pointer to @samp{struct Lisp_<Type>}.
5284 5284
5340 Here is a checklist of things to do when creating a new lisp object type 5340 Here is a checklist of things to do when creating a new lisp object type
5341 named @var{foo}: 5341 named @var{foo}:
5342 5342
5343 @enumerate 5343 @enumerate
5344 @item 5344 @item
5345 create @var{foo}.h 5345 Create @var{foo}.h
5346 @item 5346 @item
5347 create @var{foo}.c 5347 Create @var{foo}.c
5348 @item 5348 @item
5349 add definitions of @code{syms_of_@var{foo}}, etc. to @file{@var{foo}.c} 5349 Add definitions of @code{syms_of_@var{foo}}, etc. to @file{@var{foo}.c}
5350 @item 5350 @item
5351 add declarations of @code{syms_of_@var{foo}}, etc. to @file{symsinit.h} 5351 Add declarations of @code{syms_of_@var{foo}}, etc. to @file{symsinit.h}
5352 @item 5352 @item
5353 add calls to @code{syms_of_@var{foo}}, etc. to @file{emacs.c} 5353 Add calls to @code{syms_of_@var{foo}}, etc. to @file{emacs.c}
5354 @item 5354 @item
5355 add definitions of macros like @code{CHECK_@var{FOO}} and 5355 Add definitions of macros like @code{CHECK_@var{FOO}} and
5356 @code{@var{FOO}P} to @file{@var{foo}.h} 5356 @code{@var{FOO}P} to @file{@var{foo}.h}
5357 @item 5357 @item
5358 add the new type index to @code{enum lrecord_type} 5358 Add the new type index to @code{enum lrecord_type}
5359 @item 5359 @item
5360 add a DEFINE_LRECORD_IMPLEMENTATION call to @file{@var{foo}.c} 5360 Add a @code{DEFINE_*_LISP_OBJECT()} to @file{@var{foo}.c}
5361 @item 5361 @item
5362 add an INIT_LRECORD_IMPLEMENTATION call to @code{syms_of_@var{foo}.c} 5362 Add an @code{INIT_LISP_OBJECT} call to @code{syms_of_@var{foo}.c}
5363 @end enumerate 5363 @end enumerate
5364 5364
5365 5365
5366 @node Writing Lisp Primitives, Writing Good Comments, Working with Lisp Objects, Rules When Writing New C Code 5366 @node Writing Lisp Primitives, Writing Good Comments, Working with Lisp Objects, Rules When Writing New C Code
5367 @section Writing Lisp Primitives 5367 @section Writing Lisp Primitives
5840 functions a gcc bug, but the gcc maintainers disagree. 5840 functions a gcc bug, but the gcc maintainers disagree.
5841 5841
5842 @cindex inline functions, headers 5842 @cindex inline functions, headers
5843 @cindex header files, inline functions 5843 @cindex header files, inline functions
5844 Every header which contains inline functions, either directly by using 5844 Every header which contains inline functions, either directly by using
5845 @code{DECLARE_INLINE_HEADER} or indirectly by using @code{DECLARE_LRECORD} must 5845 @code{DECLARE_INLINE_HEADER} or indirectly by using
5846 be added to @file{inline.c}'s includes to make the optimization 5846 @code{DECLARE_LISP_OBJECT} must be added to @file{inline.c}'s includes
5847 described above work. (Optimization note: if all INLINE_HEADER 5847 to make the optimization described above work. (Optimization note: if
5848 functions are in fact inlined in all translation units, then the linker 5848 all INLINE_HEADER functions are in fact inlined in all translation
5849 can just discard @code{inline.o}, since it contains only unreferenced code). 5849 units, then the linker can just discard @code{inline.o}, since it
5850 contains only unreferenced code).
5850 5851
5851 The three golden rules of macros: 5852 The three golden rules of macros:
5852 5853
5853 @enumerate 5854 @enumerate
5854 @item 5855 @item
8549 8550
8550 Frob-block lrecords just have a @code{struct lrecord_header} at their 8551 Frob-block lrecords just have a @code{struct lrecord_header} at their
8551 beginning. lcrecords, however, actually have a 8552 beginning. lcrecords, however, actually have a
8552 @code{struct old_lcrecord_header}. This, in turn, has a @code{struct 8553 @code{struct old_lcrecord_header}. This, in turn, has a @code{struct
8553 lrecord_header} at its beginning, so sanity is preserved; but it also 8554 lrecord_header} at its beginning, so sanity is preserved; but it also
8554 has a pointer used to chain all lcrecords together, and a special ID 8555 has a pointer used to chain all lcrecords together.
8555 field used to distinguish one lcrecord from another. (This field is used
8556 only for debugging and could be removed, but the space gain is not
8557 significant.)
8558 8556
8559 @strong{lcrecords are now obsolete when using the write-barrier-based 8557 @strong{lcrecords are now obsolete when using the write-barrier-based
8560 collector.} 8558 collector.}
8561 8559
8562 Frob-block objects are created using @code{ALLOC_FROB_BLOCK_LISP_OBJECT()}. 8560 Frob-block objects are created using @code{ALLOC_FROB_BLOCK_LISP_OBJECT()}.