Mercurial > hg > xemacs-beta
annotate src/lisp-disunion.h @ 5124:623d57b7fbe8 ben-lisp-object
separate regular and disksave finalization, print method fixes.
Create separate disksave method and make the finalize method only be for
actual object finalization, not disksave finalization.
Fix places where 0 was given in place of a printer -- print methods are
mandatory, and internal objects formerly without a print method now must
explicitly specify internal_object_printer().
Change the defn of CONSOLE_LIVE_P to avoid problems in some weird situations.
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-01-20 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (very_old_free_lcrecord):
* alloc.c (disksave_object_finalization_1):
* alloc.c (make_lcrecord_list):
* alloc.c (alloc_managed_lcrecord):
* alloc.c (free_managed_lcrecord):
* alloc.c (sweep_lcrecords_1):
* buffer.c:
* bytecode.c:
* bytecode.c (Fcompiled_function_p):
* chartab.c:
* console-impl.h:
* console-impl.h (CONSOLE_TYPE_P):
* console.c:
* console.c (set_quit_events):
* data.c:
* data.c (Fmake_ephemeron):
* database.c:
* database.c (finalize_database):
* database.c (Fclose_database):
* device-msw.c:
* device-msw.c (finalize_devmode):
* device-msw.c (allocate_devmode):
* device.c:
* elhash.c:
* elhash.c (finalize_hash_table):
* eval.c:
* eval.c (bind_multiple_value_limits):
* event-stream.c:
* event-stream.c (finalize_command_builder):
* events.c:
* events.c (mark_event):
* extents.c:
* extents.c (finalize_extent_info):
* extents.c (uninit_buffer_extents):
* faces.c:
* file-coding.c:
* file-coding.c (finalize_coding_system):
* file-coding.h:
* file-coding.h (struct coding_system_methods):
* file-coding.h (struct detector):
* floatfns.c:
* floatfns.c (extract_float):
* fns.c:
* fns.c (Fidentity):
* font-mgr.c (finalize_fc_pattern):
* font-mgr.c (finalize_fc_config):
* frame.c:
* glyphs.c:
* glyphs.c (finalize_image_instance):
* glyphs.c (unmap_subwindow_instance_cache_mapper):
* gui.c:
* gui.c (gui_error):
* keymap.c:
* lisp.h (struct Lisp_Symbol):
* lrecord.h:
* lrecord.h (struct lrecord_implementation):
* lrecord.h (MC_ALLOC_CALL_FINALIZER):
* lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE):
* lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_INTERNAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT):
* lrecord.h (MAKE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT):
* lrecord.h (DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT):
* lrecord.h (MAKE_MODULE_LISP_OBJECT):
* lstream.c:
* lstream.c (finalize_lstream):
* lstream.c (disksave_lstream):
* marker.c:
* marker.c (finalize_marker):
* mule-charset.c (make_charset):
* number.c:
* objects.c:
* objects.c (finalize_color_instance):
* objects.c (finalize_font_instance):
* opaque.c:
* opaque.c (make_opaque_ptr):
* process-nt.c:
* process-nt.c (nt_finalize_process_data):
* process-nt.c (nt_deactivate_process):
* process.c:
* process.c (finalize_process):
* procimpl.h (struct process_methods):
* scrollbar.c:
* scrollbar.c (free_scrollbar_instance):
* specifier.c (finalize_specifier):
* symbols.c:
* toolbar.c:
* toolbar.c (Ftoolbar_button_p):
* tooltalk.c:
* ui-gtk.c:
* ui-gtk.c (emacs_gtk_object_finalizer):
* ui-gtk.c (allocate_emacs_gtk_boxed_data):
* window.c:
* window.c (finalize_window):
* window.c (mark_window_as_deleted):
Separate out regular and disksave finalization. Instead of a
FOR_DISKSAVE argument to the finalizer, create a separate object
method `disksaver'. Make `finalizer' have only one argument.
Go through and separate out all finalize methods into finalize
and disksave. Delete lots of thereby redundant disksave checking.
Delete places that signal an error if we attempt to disksave --
all of these objects are non-dumpable and we will get an error
from pdump anyway if we attempt to dump them. After this is done,
only one object remains that has a disksave method -- lstream.
Change DEFINE_*_LISP_OBJECT_WITH_PROPS to DEFINE_*_GENERAL_LISP_OBJECT,
which is used for specifying either property methods or disksave
methods (or in the future, any other less-used methods).
Remove the for_disksave argument to finalize_process_data. Don't
provide a disksaver for processes because no one currently needs
it.
Clean up various places where objects didn't provide a print method.
It was made mandatory in previous changes, and all methods now
either provide their own print method or use internal_object_printer
or external_object_printer.
Change the definition of CONSOLE_LIVE_P to use the contype enum
rather than looking into the conmeths structure -- in some weird
situations with dead objects, the conmeths structure is NULL,
and printing such objects from debug_print() will crash if we try
to look into the conmeths structure.
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Wed, 20 Jan 2010 07:05:57 -0600 |
| parents | 184461bc8de4 |
| children | ae48681c47fa |
| rev | line source |
|---|---|
| 428 | 1 /* Fundamental definitions for XEmacs Lisp interpreter -- non-union objects. |
| 2 Copyright (C) 1985, 1986, 1987, 1992, 1993 Free Software Foundation, Inc. | |
| 826 | 3 Copyright (C) 2001, 2002 Ben Wing. |
| 428 | 4 |
| 5 This file is part of XEmacs. | |
| 6 | |
| 7 XEmacs is free software; you can redistribute it and/or modify it | |
| 8 under the terms of the GNU General Public License as published by the | |
| 9 Free Software Foundation; either version 2, or (at your option) any | |
| 10 later version. | |
| 11 | |
| 12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 15 for more details. | |
| 16 | |
| 17 You should have received a copy of the GNU General Public License | |
| 18 along with XEmacs; see the file COPYING. If not, write to | |
| 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 20 Boston, MA 02111-1307, USA. */ | |
| 21 | |
| 22 /* Synched up with: FSF 19.30. Split out from lisp.h. */ | |
| 23 /* This file has diverged greatly from FSF Emacs. Syncing is no | |
| 24 longer desirable or possible */ | |
| 25 | |
| 26 /* | |
| 27 Format of a non-union-type Lisp Object | |
| 28 | |
| 29 3 2 1 0 | |
| 30 bit 10987654321098765432109876543210 | |
| 31 -------------------------------- | |
| 32 VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTT | |
| 33 | |
| 34 Integers are treated specially, and look like this: | |
| 35 | |
| 36 3 2 1 0 | |
| 37 bit 10987654321098765432109876543210 | |
| 38 -------------------------------- | |
| 39 VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVT | |
| 40 | |
| 41 For integral Lisp types, i.e. integers and characters, the value | |
| 458 | 42 bits are the Lisp object. Some people call such Lisp_Objects "immediate". |
| 428 | 43 |
| 458 | 44 The object is obtained by masking off the type bits. |
| 462 | 45 Bit 1 is used as a value bit by splitting the Lisp integer type |
| 458 | 46 into two subtypes, Lisp_Type_Int_Even and Lisp_Type_Int_Odd. |
| 47 By this trickery we get 31 bits for integers instead of 30. | |
| 428 | 48 |
| 49 For non-integral types, the value bits of a Lisp_Object contain | |
| 50 a pointer to a structure containing the object. The pointer is | |
| 51 obtained by masking off the type and mark bits. | |
| 52 | |
| 462 | 53 All pointer-based types are coalesced under a single type called |
| 458 | 54 Lisp_Type_Record. The type bits for this type are required by the |
| 55 implementation to be 00, just like the least significant bits of | |
| 56 word-aligned struct pointers on 32-bit hardware. This requires that | |
| 57 all structs implementing Lisp_Objects have an alignment of at least 4 | |
| 58 bytes. Because of this, Lisp_Object pointers don't have to be masked | |
| 59 and are full-sized. | |
| 428 | 60 |
| 458 | 61 There are no mark bits in the Lisp_Object itself (there used to be). |
| 62 | |
| 63 Integers and characters don't need to be marked. All other types are | |
| 64 lrecord-based, which means they get marked by setting the mark bit in | |
| 65 the struct lrecord_header. | |
| 428 | 66 |
| 67 Here is a brief description of the following macros: | |
| 68 | |
| 69 XTYPE The type bits of a Lisp_Object | |
| 70 XPNTRVAL The value bits of a Lisp_Object storing a pointer | |
| 867 | 71 XCHARVAL The value bits of a Lisp_Object storing a Ichar |
| 428 | 72 XREALINT The value bits of a Lisp_Object storing an integer, signed |
| 73 XUINT The value bits of a Lisp_Object storing an integer, unsigned | |
| 458 | 74 INTP Non-zero if this Lisp_Object is an integer |
| 428 | 75 Qzero Lisp Integer 0 |
| 458 | 76 EQ Non-zero if two Lisp_Objects are identical, not merely equal. */ |
| 428 | 77 |
| 78 | |
| 79 typedef EMACS_INT Lisp_Object; | |
| 80 | |
| 81 #define Lisp_Type_Int_Bit (Lisp_Type_Int_Even & Lisp_Type_Int_Odd) | |
| 82 #define VALMASK (((1UL << VALBITS) - 1UL) << GCTYPEBITS) | |
| 83 #define XTYPE(x) ((enum Lisp_Type) (((EMACS_UINT)(x)) & ~VALMASK)) | |
| 84 #define XPNTRVAL(x) (x) /* This depends on Lisp_Type_Record == 0 */ | |
| 85 #define XCHARVAL(x) ((x) >> GCBITS) | |
| 86 #define XREALINT(x) ((x) >> INT_GCBITS) | |
| 87 #define XUINT(x) ((EMACS_UINT)(x) >> INT_GCBITS) | |
| 826 | 88 |
| 89 #define wrap_pointer_1(ptr) ((Lisp_Object) (ptr)) | |
| 90 | |
| 91 DECLARE_INLINE_HEADER ( | |
| 92 Lisp_Object | |
| 93 make_int_verify (EMACS_INT val) | |
| 94 ) | |
| 95 { | |
| 96 Lisp_Object obj = (Lisp_Object) ((val << INT_GCBITS) | Lisp_Type_Int_Bit); | |
| 97 type_checking_assert (XREALINT (obj) == val); | |
| 98 return obj; | |
| 99 } | |
| 100 | |
| 101 #define make_int(x) ((Lisp_Object) (((x) << INT_GCBITS) | Lisp_Type_Int_Bit)) | |
| 102 | |
| 831 | 103 #define make_char_1(x) ((Lisp_Object) (((x) << GCBITS) | Lisp_Type_Char)) |
| 826 | 104 |
| 428 | 105 #define INTP(x) ((EMACS_UINT)(x) & Lisp_Type_Int_Bit) |
| 106 #define INT_PLUS(x,y) ((x)+(y)-Lisp_Type_Int_Bit) | |
| 107 #define INT_MINUS(x,y) ((x)-(y)+Lisp_Type_Int_Bit) | |
| 108 #define INT_PLUS1(x) INT_PLUS (x, make_int (1)) | |
| 109 #define INT_MINUS1(x) INT_MINUS (x, make_int (1)) | |
| 110 | |
| 111 #define Qzero make_int (0) | |
| 112 #define Qnull_pointer ((Lisp_Object) 0) | |
| 113 #define EQ(x,y) ((x) == (y)) | |
| 114 | |
| 853 | 115 /* WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
| 116 | |
| 117 You can only VOID_TO_LISP something that had previously been | |
| 118 LISP_TO_VOID'd. You cannot go the other way, i.e. create a bogus | |
| 119 Lisp_Object. If you want to stuff a void * into a Lisp_Object, use | |
| 120 make_opaque_ptr(). */ | |
| 121 | |
| 428 | 122 /* Convert between a (void *) and a Lisp_Object, as when the |
| 123 Lisp_Object is passed to a toolkit callback function */ | |
| 826 | 124 #define VOID_TO_LISP(varg) ((Lisp_Object) (varg)) |
| 428 | 125 #define LISP_TO_VOID(larg) ((void *) (larg)) |
| 126 | |
| 127 /* Convert a Lisp_Object into something that can't be used as an | |
| 128 lvalue. Useful for type-checking. */ | |
| 129 #define NON_LVALUE(larg) ((larg) + 0) |
