Mercurial > hg > xemacs-beta
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()}. |