comparison src/lrecord.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 d1247f3cc363
children b5df3737028a
comparison
equal deleted inserted replaced
5123:fc85923c49af 5124:623d57b7fbe8
352 description below instead), unless the data description is missing. 352 description below instead), unless the data description is missing.
353 Yes, this currently means there is logic duplication. Eventually the 353 Yes, this currently means there is logic duplication. Eventually the
354 mark methods will be removed. */ 354 mark methods will be removed. */
355 Lisp_Object (*marker) (Lisp_Object); 355 Lisp_Object (*marker) (Lisp_Object);
356 356
357 /* `printer' converts the object to a printed representation. 357 /* `printer' converts the object to a printed representation. `printer'
358 This can be NULL; in this case internal_object_printer() will be 358 should never be NULL (if so, you will get an assertion failure when
359 used instead. */ 359 trying to print such an object). Either supply a specific printing
360 method, or use the default methods internal_object_printer() (for
361 internal objects that should not be visible at Lisp level) or
362 external_object_printer() (for objects visible at Lisp level). */
360 void (*printer) (Lisp_Object, Lisp_Object printcharfun, int escapeflag); 363 void (*printer) (Lisp_Object, Lisp_Object printcharfun, int escapeflag);
361 364
362 /* `finalizer' is called at GC time when the object is about to 365 /* `finalizer' is called at GC time when the object is about to be freed.
363 be freed, and at dump time (FOR_DISKSAVE will be non-zero in this 366 It should perform any necessary cleanup, such as freeing malloc()ed
364 case). It should perform any necessary cleanup (e.g. freeing 367 memory or releasing pointers or handles to objects created in external
365 malloc()ed memory). This can be NULL, meaning no special 368 libraries, such as window-system windows or file handles. This can be
366 finalization is necessary. 369 NULL, meaning no special finalization is necessary. */
367 370 void (*finalizer) (void *header);
368 WARNING: remember that `finalizer' is called at dump time even
369 though the object is not being freed. */
370 void (*finalizer) (void *header, int for_disksave);
371 371
372 /* This can be NULL, meaning compare objects with EQ(). */ 372 /* This can be NULL, meaning compare objects with EQ(). */
373 int (*equal) (Lisp_Object obj1, Lisp_Object obj2, int depth); 373 int (*equal) (Lisp_Object obj1, Lisp_Object obj2, int depth);
374 374
375 /* `hash' generates hash values for use with hash tables that have 375 /* `hash' generates hash values for use with hash tables that have
389 `get', `put', `remprop', and `object-plist'. */ 389 `get', `put', `remprop', and `object-plist'. */
390 Lisp_Object (*getprop) (Lisp_Object obj, Lisp_Object prop); 390 Lisp_Object (*getprop) (Lisp_Object obj, Lisp_Object prop);
391 int (*putprop) (Lisp_Object obj, Lisp_Object prop, Lisp_Object val); 391 int (*putprop) (Lisp_Object obj, Lisp_Object prop, Lisp_Object val);
392 int (*remprop) (Lisp_Object obj, Lisp_Object prop); 392 int (*remprop) (Lisp_Object obj, Lisp_Object prop);
393 Lisp_Object (*plist) (Lisp_Object obj); 393 Lisp_Object (*plist) (Lisp_Object obj);
394
395 /* `disksaver' is called at dump time. It is used for objects that
396 contain pointers or handles to objects created in external libraries,
397 such as window-system windows or file handles. Such external objects
398 cannot be dumped, so it is necessary to release them at dump time and
399 arrange somehow or other for them to be resurrected if necessary later
400 on.
401
402 It seems that even non-dumpable objects may be around at dump time,
403 and a disksaver may be provided. (In fact, the only object currently
404 with a disksaver, lstream, is non-dumpable.)
405
406 Objects rarely need to provide this method; most of the time it will
407 be NULL. */
408 void (*disksaver) (Lisp_Object);
394 409
395 /* Only one of `static_size' and `size_in_bytes_method' is non-0. If 410 /* Only one of `static_size' and `size_in_bytes_method' is non-0. If
396 `static_size' is 0, this type is not instantiable by 411 `static_size' is 0, this type is not instantiable by
397 ALLOC_LISP_OBJECT(). If both are 0 (this should never happen), this 412 ALLOC_LISP_OBJECT(). If both are 0 (this should never happen), this
398 object cannot be instantiated; you will get an abort() if you try.*/ 413 object cannot be instantiated; you will get an abort() if you try.*/
452 const struct lrecord_implementation *MCACF_implementation \ 467 const struct lrecord_implementation *MCACF_implementation \
453 = LHEADER_IMPLEMENTATION (MCACF_lheader); \ 468 = LHEADER_IMPLEMENTATION (MCACF_lheader); \
454 if (MCACF_implementation && MCACF_implementation->finalizer) \ 469 if (MCACF_implementation && MCACF_implementation->finalizer) \
455 { \ 470 { \
456 GC_STAT_FINALIZED; \ 471 GC_STAT_FINALIZED; \
457 MCACF_implementation->finalizer (ptr, 0); \ 472 MCACF_implementation->finalizer (ptr); \
458 } \ 473 } \
459 } \ 474 } \
460 } while (0) 475 } while (0)
461 476
462 /* Tell mc-alloc how to call a finalizer for disksave. */ 477 /* Tell mc-alloc how to call a finalizer for disksave. */
467 if (XRECORD_LHEADER (MCACF_obj) && LRECORDP (MCACF_obj) \ 482 if (XRECORD_LHEADER (MCACF_obj) && LRECORDP (MCACF_obj) \
468 && !LRECORD_FREE_P (MCACF_lheader) ) \ 483 && !LRECORD_FREE_P (MCACF_lheader) ) \
469 { \ 484 { \
470 const struct lrecord_implementation *MCACF_implementation \ 485 const struct lrecord_implementation *MCACF_implementation \
471 = LHEADER_IMPLEMENTATION (MCACF_lheader); \ 486 = LHEADER_IMPLEMENTATION (MCACF_lheader); \
472 if (MCACF_implementation && MCACF_implementation->finalizer) \ 487 if (MCACF_implementation && MCACF_implementation->disksaver) \
473 MCACF_implementation->finalizer (ptr, 1); \ 488 MCACF_implementation->disksaver (ptr); \
474 } \ 489 } \
475 } while (0) 490 } while (0)
476 491
477 #define LRECORD_FREE_P(ptr) \ 492 #define LRECORD_FREE_P(ptr) \
478 (((struct lrecord_header *) ptr)->free) 493 (((struct lrecord_header *) ptr)->free)
1141 large blocks ("frob blocks"), which are parceled up individually. Such 1156 large blocks ("frob blocks"), which are parceled up individually. Such
1142 objects need special handling in alloc.c. This does not apply to 1157 objects need special handling in alloc.c. This does not apply to
1143 NEW_GC, because it does this automatically. 1158 NEW_GC, because it does this automatically.
1144 1159
1145 DEFINE_*_INTERNAL_LISP_OBJECT is for "internal" objects that should 1160 DEFINE_*_INTERNAL_LISP_OBJECT is for "internal" objects that should
1146 never be visible on the Lisp level. This is a shorthand for the 1161 never be visible on the Lisp level. This is a shorthand for the most
1147 most common type of internal objects, which have no equal or hash 1162 common type of internal objects, which have no equal or hash method
1148 method (since they generally won't appear in hash tables), no 1163 (since they generally won't appear in hash tables), no finalizer and
1149 finalizer and internal_object_printer() as their print method 1164 internal_object_printer() as their print method (which prints that the
1150 (which prints that the object is internal and shouldn't be visible 1165 object is internal and shouldn't be visible externally). For internal
1151 externally). For internal objects needing a finalizer, equal or 1166 objects needing a finalizer, equal or hash method, or wanting to
1152 hash method, use the normal DEFINE_*_LISP_OBJECT mechanism for 1167 customize the print method, use the normal DEFINE_*_LISP_OBJECT
1153 defining these objects. 1168 mechanism for defining these objects.
1154 1169
1155 DEFINE_*_WITH_PROPS is for objects which support the unified property 1170 DEFINE_*_GENERAL_LISP_OBJECT is for objects that need to provide one of
1156 interface using `get', `put', `remprop' and `object-plist'. 1171 the less common methods that are omitted on most objects. These methods
1172 include the methods supporting the unified property interface using
1173 `get', `put', `remprop' and `object-plist', and (for dumpable objects
1174 only) the `disksaver' method.
1157 1175
1158 DEFINE_MODULE_* is for objects defined in an external module. 1176 DEFINE_MODULE_* is for objects defined in an external module.
1159 1177
1160 MAKE_LISP_OBJECT and MAKE_MODULE_LISP_OBJECT are what underlies all of 1178 MAKE_LISP_OBJECT and MAKE_MODULE_LISP_OBJECT are what underlies all of
1161 these; they define a structure containing pointers to object methods 1179 these; they define a structure containing pointers to object methods
1170 #endif 1188 #endif
1171 1189
1172 /********* The dumpable versions *********** */ 1190 /********* The dumpable versions *********** */
1173 1191
1174 #define DEFINE_DUMPABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ 1192 #define DEFINE_DUMPABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \
1175 DEFINE_DUMPABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) 1193 DEFINE_DUMPABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype)
1176 1194
1177 #define DEFINE_DUMPABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ 1195 #define DEFINE_DUMPABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \
1178 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) 1196 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype)
1179 1197
1180 #define DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ 1198 #define DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \
1181 DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) 1199 DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype)
1182 1200
1183 #define DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ 1201 #define DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \
1184 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) 1202 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype)
1185 1203
1186 #define DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ 1204 #define DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \
1187 DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) 1205 DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype)
1188 1206
1189 #define DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ 1207 #define DEFINE_DUMPABLE_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \
1190 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof(structtype),0,1,structtype) 1208 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof(structtype),0,1,structtype)
1191 1209
1192 #define DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ 1210 #define DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \
1193 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,1,structtype) 1211 MAKE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,0,sizer,1,structtype)
1194 1212
1195 #define DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,structtype) \ 1213 #define DEFINE_DUMPABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,structtype) \
1196 DEFINE_DUMPABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,structtype) 1214 DEFINE_DUMPABLE_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,structtype)
1197 1215
1198 #define DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,sizer,structtype) \ 1216 #define DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,sizer,structtype) \
1199 DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,sizer,structtype) 1217 DEFINE_DUMPABLE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,sizer,structtype)
1200 1218
1201 /********* The non-dumpable versions *********** */ 1219 /********* The non-dumpable versions *********** */
1202 1220
1203 #define DEFINE_NODUMP_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ 1221 #define DEFINE_NODUMP_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \
1204 DEFINE_NODUMP_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) 1222 DEFINE_NODUMP_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype)
1205 1223
1206 #define DEFINE_NODUMP_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ 1224 #define DEFINE_NODUMP_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \
1207 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) 1225 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype)
1208 1226
1209 #define DEFINE_NODUMP_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ 1227 #define DEFINE_NODUMP_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \
1210 DEFINE_NODUMP_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) 1228 DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype)
1211 1229
1212 #define DEFINE_NODUMP_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ 1230 #define DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \
1213 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) 1231 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype)
1214 1232
1215 #define DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ 1233 #define DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \
1216 DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) 1234 DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype)
1217 1235
1218 #define DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ 1236 #define DEFINE_NODUMP_FROB_BLOCK_GENERAL_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \
1219 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof(structtype),0,1,structtype) 1237 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof(structtype),0,1,structtype)
1220 1238
1221 #define DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ 1239 #define DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \
1222 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,1,structtype) 1240 MAKE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,0,sizer,1,structtype)
1223 1241
1224 #define DEFINE_NODUMP_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,structtype) \ 1242 #define DEFINE_NODUMP_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,structtype) \
1225 DEFINE_NODUMP_LISP_OBJECT_WITH_PROPS(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,structtype) 1243 DEFINE_NODUMP_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,structtype)
1226 1244
1227 #define DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,sizer,structtype) \ 1245 #define DEFINE_NODUMP_SIZABLE_INTERNAL_LISP_OBJECT(name,c_name,marker,desc,sizer,structtype) \
1228 DEFINE_NODUMP_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,sizer,structtype) 1246 DEFINE_NODUMP_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,marker,internal_object_printer,0,0,0,desc,0,0,0,0,0,sizer,structtype)
1229 1247
1230 /********* MAKE_LISP_OBJECT, the underlying macro *********** */ 1248 /********* MAKE_LISP_OBJECT, the underlying macro *********** */
1231 1249
1232 #ifdef NEW_GC 1250 #ifdef NEW_GC
1233 #define MAKE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,frob_block_p,structtype) \ 1251 #define MAKE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \
1234 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ 1252 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \
1235 const struct lrecord_implementation lrecord_##c_name = \ 1253 const struct lrecord_implementation lrecord_##c_name = \
1236 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ 1254 { name, dumpable, marker, printer, nuker, equal, hash, desc, \
1237 getprop, putprop, remprop, plist, size, sizer, \ 1255 getprop, putprop, remprop, plist, disksaver, size, sizer, \
1238 lrecord_type_##c_name } 1256 lrecord_type_##c_name }
1239 #else /* not NEW_GC */ 1257 #else /* not NEW_GC */
1240 #define MAKE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,frob_block_p,structtype) \ 1258 #define MAKE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \
1241 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ 1259 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \
1242 const struct lrecord_implementation lrecord_##c_name = \ 1260 const struct lrecord_implementation lrecord_##c_name = \
1243 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ 1261 { name, dumpable, marker, printer, nuker, equal, hash, desc, \
1244 getprop, putprop, remprop, plist, size, sizer, \ 1262 getprop, putprop, remprop, plist, disksaver, size, sizer, \
1245 lrecord_type_##c_name, frob_block_p } 1263 lrecord_type_##c_name, frob_block_p }
1246 #endif /* not NEW_GC */ 1264 #endif /* not NEW_GC */
1247 1265
1248 1266
1249 /********* The module dumpable versions *********** */ 1267 /********* The module dumpable versions *********** */
1250 1268
1251 #define DEFINE_DUMPABLE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \ 1269 #define DEFINE_DUMPABLE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \
1252 DEFINE_DUMPABLE_MODULE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) 1270 DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype)
1253 1271
1254 #define DEFINE_DUMPABLE_MODULE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ 1272 #define DEFINE_DUMPABLE_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \
1255 MAKE_MODULE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) 1273 MAKE_MODULE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype)
1256 1274
1257 #define DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ 1275 #define DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \
1258 DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) 1276 DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype)
1259 1277
1260 #define DEFINE_DUMPABLE_MODULE_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ 1278 #define DEFINE_DUMPABLE_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \
1261 MAKE_MODULE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) 1279 MAKE_MODULE_LISP_OBJECT(name,c_name,1 /*dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype)
1262 1280
1263 /********* The module non-dumpable versions *********** */ 1281 /********* The module non-dumpable versions *********** */
1264 1282
1265 #define DEFINE_NODUMP_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \ 1283 #define DEFINE_NODUMP_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \
1266 DEFINE_NODUMP_MODULE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) 1284 DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,structtype)
1267 1285
1268 #define DEFINE_NODUMP_MODULE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ 1286 #define DEFINE_NODUMP_MODULE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,structtype) \
1269 MAKE_MODULE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) 1287 MAKE_MODULE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizeof (structtype),0,0,structtype)
1270 1288
1271 #define DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ 1289 #define DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \
1272 DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) 1290 DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,structtype)
1273 1291
1274 #define DEFINE_NODUMP_MODULE_SIZABLE_LISP_OBJECT_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ 1292 #define DEFINE_NODUMP_MODULE_SIZABLE_GENERAL_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,sizer,structtype) \
1275 MAKE_MODULE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) 1293 MAKE_MODULE_LISP_OBJECT(name,c_name,0 /*non-dumpable*/,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,0,sizer,0,structtype)
1276 1294
1277 /********* MAKE_MODULE_LISP_OBJECT, the underlying macro *********** */ 1295 /********* MAKE_MODULE_LISP_OBJECT, the underlying macro *********** */
1278 1296
1279 #ifdef NEW_GC 1297 #ifdef NEW_GC
1280 #define MAKE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,frob_block_p,structtype) \ 1298 #define MAKE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \
1281 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ 1299 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \
1282 int lrecord_type_##c_name; \ 1300 int lrecord_type_##c_name; \
1283 struct lrecord_implementation lrecord_##c_name = \ 1301 struct lrecord_implementation lrecord_##c_name = \
1284 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ 1302 { name, dumpable, marker, printer, nuker, equal, hash, desc, \
1285 getprop, putprop, remprop, plist, size, sizer, \ 1303 getprop, putprop, remprop, plist, disksaver, size, sizer, \
1286 lrecord_type_last_built_in_type } 1304 lrecord_type_last_built_in_type }
1287 #else /* not NEW_GC */ 1305 #else /* not NEW_GC */
1288 #define MAKE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,frob_block_p,structtype) \ 1306 #define MAKE_MODULE_LISP_OBJECT(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,disksaver,size,sizer,frob_block_p,structtype) \
1289 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ 1307 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \
1290 int lrecord_type_##c_name; \ 1308 int lrecord_type_##c_name; \
1291 struct lrecord_implementation lrecord_##c_name = \ 1309 struct lrecord_implementation lrecord_##c_name = \
1292 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ 1310 { name, dumpable, marker, printer, nuker, equal, hash, desc, \
1293 getprop, putprop, remprop, plist, size, sizer, \ 1311 getprop, putprop, remprop, plist, disksaver, size, sizer, \
1294 lrecord_type_last_built_in_type, frob_block_p } 1312 lrecord_type_last_built_in_type, frob_block_p }
1295 #endif /* not NEW_GC */ 1313 #endif /* not NEW_GC */
1296 1314
1297 #ifdef USE_KKCC 1315 #ifdef USE_KKCC
1298 extern MODULE_API const struct memory_description *lrecord_memory_descriptions[]; 1316 extern MODULE_API const struct memory_description *lrecord_memory_descriptions[];