Mercurial > hg > xemacs-beta
comparison src/lrecord.h @ 934:c925bacdda60
[xemacs-hg @ 2002-07-29 09:21:12 by michaels]
2002-07-17 Marcus Crestani <crestani@informatik.uni-tuebingen.de>
Markus Kaltenbach <makalten@informatik.uni-tuebingen.de>
Mike Sperber <mike@xemacs.org>
configure flag to turn these changes on: --use-kkcc
First we added a dumpable flag to lrecord_implementation. It shows,
if the object is dumpable and should be processed by the dumper.
* lrecord.h (struct lrecord_implementation): added dumpable flag
(MAKE_LRECORD_IMPLEMENTATION): fitted the different makro definitions
to the new lrecord_implementation and their calls.
Then we changed mark_object, that it no longer needs a mark method for
those types that have pdump descritions.
* alloc.c:
(mark_object): If the object has a description, the new mark algorithm
is called, and the object is marked according to its description.
Otherwise it uses the mark method like before.
These procedures mark objects according to their descriptions. They
are modeled on the corresponding pdumper procedures.
(mark_with_description):
(get_indirect_count):
(structure_size):
(mark_struct_contents):
These procedures still call mark_object, this is needed while there are
Lisp_Objects without descriptions left.
We added pdump descriptions for many Lisp_Objects:
* extents.c: extent_auxiliary_description
* database.c: database_description
* gui.c: gui_item_description
* scrollbar.c: scrollbar_instance_description
* toolbar.c: toolbar_button_description
* event-stream.c: command_builder_description
* mule-charset.c: charset_description
* device-msw.c: devmode_description
* dialog-msw.c: mswindows_dialog_id_description
* eldap.c: ldap_description
* postgresql.c: pgconn_description
pgresult_description
* tooltalk.c: tooltalk_message_description
tooltalk_pattern_description
* ui-gtk.c: emacs_ffi_description
emacs_gtk_object_description
* events.c:
* events.h:
* event-stream.c:
* event-Xt.c:
* event-gtk.c:
* event-tty.c:
To write a pdump description for Lisp_Event, we converted every struct
in the union event to a Lisp_Object. So we created nine new
Lisp_Objects: Lisp_Key_Data, Lisp_Button_Data, Lisp_Motion_Data,
Lisp_Process_Data, Lisp_Timeout_Data, Lisp_Eval_Data,
Lisp_Misc_User_Data, Lisp_Magic_Data, Lisp_Magic_Eval_Data.
We also wrote makro selectors and mutators for the fields of the new
designed Lisp_Event and added everywhere these new abstractions.
We implemented XD_UNION support in (mark_with_description), so
we can describe exspecially console/device specific data with XD_UNION.
To describe with XD_UNION, we added a field to these objects, which
holds the variant type of the object. This field is initialized in
the appendant constructor. The variant is an integer, it has also to
be described in an description, if XD_UNION is used.
XD_UNION is used in following descriptions:
* console.c: console_description
(get_console_variant): returns the variant
(create_console): added variant initialization
* console.h (console_variant): the different console types
* console-impl.h (struct console): added enum console_variant contype
* device.c: device_description
(Fmake_device): added variant initialization
* device-impl.h (struct device): added enum console_variant devtype
* objects.c: image_instance_description
font_instance_description
(Fmake_color_instance): added variant initialization
(Fmake_font_instance): added variant initialization
* objects-impl.h (struct Lisp_Color_Instance): added color_instance_type
* objects-impl.h (struct Lisp_Font_Instance): added font_instance_type
* process.c: process_description
(make_process_internal): added variant initialization
* process.h (process_variant): the different process types
author | michaels |
---|---|
date | Mon, 29 Jul 2002 09:21:25 +0000 |
parents | 201c016cfc12 |
children | 25e260cb7994 |
comparison
equal
deleted
inserted
replaced
933:f6bc42928b34 | 934:c925bacdda60 |
---|---|
75 | 75 |
76 /* 1 if the object is readonly from lisp */ | 76 /* 1 if the object is readonly from lisp */ |
77 unsigned int lisp_readonly :1; | 77 unsigned int lisp_readonly :1; |
78 | 78 |
79 unsigned int unused :21; | 79 unsigned int unused :21; |
80 | |
80 }; | 81 }; |
81 | 82 |
82 struct lrecord_implementation; | 83 struct lrecord_implementation; |
83 int lrecord_type_index (const struct lrecord_implementation *implementation); | 84 int lrecord_type_index (const struct lrecord_implementation *implementation); |
84 | 85 |
163 lrecord_type_extent, | 164 lrecord_type_extent, |
164 lrecord_type_extent_info, | 165 lrecord_type_extent_info, |
165 lrecord_type_extent_auxiliary, | 166 lrecord_type_extent_auxiliary, |
166 lrecord_type_marker, | 167 lrecord_type_marker, |
167 lrecord_type_event, | 168 lrecord_type_event, |
169 #ifdef USE_KKCC | |
170 lrecord_type_key_data, | |
171 lrecord_type_button_data, | |
172 lrecord_type_motion_data, | |
173 lrecord_type_process_data, | |
174 lrecord_type_timeout_data, | |
175 lrecord_type_eval_data, | |
176 lrecord_type_misc_user_data, | |
177 lrecord_type_magic_eval_data, | |
178 lrecord_type_magic_data, | |
179 #endif /* USE_KKCC */ | |
168 lrecord_type_keymap, | 180 lrecord_type_keymap, |
169 lrecord_type_command_builder, | 181 lrecord_type_command_builder, |
170 lrecord_type_timeout, | 182 lrecord_type_timeout, |
171 lrecord_type_specifier, | 183 lrecord_type_specifier, |
172 lrecord_type_console, | 184 lrecord_type_console, |
207 | 219 |
208 struct lrecord_implementation | 220 struct lrecord_implementation |
209 { | 221 { |
210 const char *name; | 222 const char *name; |
211 | 223 |
224 /* information for the dumper: is the object dumpable and should it | |
225 be dumped. */ | |
226 unsigned int dumpable :1; | |
227 | |
212 /* `marker' is called at GC time, to make sure that all Lisp_Objects | 228 /* `marker' is called at GC time, to make sure that all Lisp_Objects |
213 pointed to by this object get properly marked. It should call | 229 pointed to by this object get properly marked. It should call |
214 the mark_object function on all Lisp_Objects in the object. If | 230 the mark_object function on all Lisp_Objects in the object. If |
215 the return value is non-nil, it should be a Lisp_Object to be | 231 the return value is non-nil, it should be a Lisp_Object to be |
216 marked (don't call the mark_object function explicitly on it, | 232 marked (don't call the mark_object function explicitly on it, |
301 SCRRH_lheader->mark = 1; \ | 317 SCRRH_lheader->mark = 1; \ |
302 } while (0) | 318 } while (0) |
303 #define SET_LISP_READONLY_RECORD_HEADER(lheader) \ | 319 #define SET_LISP_READONLY_RECORD_HEADER(lheader) \ |
304 ((void) ((lheader)->lisp_readonly = 1)) | 320 ((void) ((lheader)->lisp_readonly = 1)) |
305 #define RECORD_MARKER(lheader) lrecord_markers[(lheader)->type] | 321 #define RECORD_MARKER(lheader) lrecord_markers[(lheader)->type] |
322 | |
323 #ifdef USE_KKCC | |
324 #define RECORD_DUMPABLE(lheader) (lrecord_implementations_table[(lheader)->type])->dumpable | |
325 #endif /* USE_KKCC */ | |
306 | 326 |
307 /* External description stuff | 327 /* External description stuff |
308 | 328 |
309 PLEASE NOTE: Both lrecord_description and struct_description are | 329 PLEASE NOTE: Both lrecord_description and struct_description are |
310 badly misnamed. In reality, an lrecord_description is nothing more | 330 badly misnamed. In reality, an lrecord_description is nothing more |
633 # define DECLARE_ERROR_CHECK_TYPES(c_name, structtype) | 653 # define DECLARE_ERROR_CHECK_TYPES(c_name, structtype) |
634 #else | 654 #else |
635 # define DECLARE_ERROR_CHECK_TYPES(c_name, structtype) | 655 # define DECLARE_ERROR_CHECK_TYPES(c_name, structtype) |
636 #endif | 656 #endif |
637 | 657 |
638 #define DEFINE_BASIC_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ | 658 |
639 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) | 659 #ifdef USE_KKCC |
640 | 660 #define DEFINE_BASIC_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \ |
641 #define DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ | 661 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) |
642 MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof(structtype),0,1,structtype) | 662 |
643 | 663 #define DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ |
644 #define DEFINE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ | 664 MAKE_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof(structtype),0,1,structtype) |
645 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) | 665 |
646 | 666 #define DEFINE_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \ |
647 #define DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ | 667 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) |
648 MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) | 668 |
649 | 669 #define DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ |
650 #define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ | 670 MAKE_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) |
651 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) | 671 |
652 | 672 #define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
653 #define DEFINE_BASIC_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ | 673 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) |
654 MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,1,structtype) | 674 |
655 | 675 #define DEFINE_BASIC_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
656 #define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ | 676 MAKE_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,1,structtype) |
657 MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) | 677 |
658 | 678 #define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ |
659 #define MAKE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ | 679 MAKE_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) |
680 | |
681 #define MAKE_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ | |
660 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ | 682 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ |
661 const struct lrecord_implementation lrecord_##c_name = \ | 683 const struct lrecord_implementation lrecord_##c_name = \ |
662 { name, marker, printer, nuker, equal, hash, desc, \ | 684 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ |
663 getprop, putprop, remprop, plist, size, sizer, \ | 685 getprop, putprop, remprop, plist, size, sizer, \ |
664 lrecord_type_##c_name, basic_p } | 686 lrecord_type_##c_name, basic_p } |
665 | 687 |
666 #define DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ | 688 #define DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,structtype) \ |
667 DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) | 689 DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) |
668 | 690 |
669 #define DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ | 691 #define DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ |
670 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) | 692 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) |
671 | 693 |
672 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ | 694 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ |
673 DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) | 695 DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) |
674 | 696 |
675 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ | 697 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ |
676 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) | 698 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) |
677 | 699 |
678 #define MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ | 700 #define MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ |
679 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ | 701 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ |
680 int lrecord_type_##c_name; \ | 702 int lrecord_type_##c_name; \ |
681 struct lrecord_implementation lrecord_##c_name = \ | 703 struct lrecord_implementation lrecord_##c_name = \ |
682 { name, marker, printer, nuker, equal, hash, desc, \ | 704 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ |
683 getprop, putprop, remprop, plist, size, sizer, \ | 705 getprop, putprop, remprop, plist, size, sizer, \ |
684 lrecord_type_last_built_in_type, basic_p } | 706 lrecord_type_last_built_in_type, basic_p } |
685 | 707 |
708 #else /* not USE_KKCC */ | |
709 | |
710 #define DEFINE_BASIC_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ | |
711 DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) | |
712 | |
713 #define DEFINE_BASIC_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ | |
714 MAKE_LRECORD_IMPLEMENTATION(name,c_name,0,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof(structtype),0,1,structtype) | |
715 | |
716 #define DEFINE_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ | |
717 DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) | |
718 | |
719 #define DEFINE_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ | |
720 MAKE_LRECORD_IMPLEMENTATION(name,c_name,0,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) | |
721 | |
722 #define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ | |
723 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) | |
724 | |
725 #define DEFINE_BASIC_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ | |
726 MAKE_LRECORD_IMPLEMENTATION(name,c_name,0,marker,printer,nuker,equal,hash,desc,0,0,0,0,0,sizer,1,structtype) | |
727 | |
728 #define DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ | |
729 MAKE_LRECORD_IMPLEMENTATION(name,c_name,0,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) | |
730 | |
731 #define MAKE_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ | |
732 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ | |
733 const struct lrecord_implementation lrecord_##c_name = \ | |
734 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ | |
735 getprop, putprop, remprop, plist, size, sizer, \ | |
736 lrecord_type_##c_name, basic_p } | |
737 | |
738 #define DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,structtype) \ | |
739 DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,structtype) | |
740 | |
741 #define DEFINE_EXTERNAL_LRECORD_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,structtype) \ | |
742 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,0,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizeof (structtype),0,0,structtype) | |
743 | |
744 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION(name,c_name,marker,printer,nuker,equal,hash,desc,sizer,structtype) \ | |
745 DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,0,0,0,0,sizer,structtype) | |
746 | |
747 #define DEFINE_EXTERNAL_LRECORD_SEQUENCE_IMPLEMENTATION_WITH_PROPS(name,c_name,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,sizer,structtype) \ | |
748 MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,0,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,0,sizer,0,structtype) | |
749 | |
750 #define MAKE_EXTERNAL_LRECORD_IMPLEMENTATION(name,c_name,dumpable,marker,printer,nuker,equal,hash,desc,getprop,putprop,remprop,plist,size,sizer,basic_p,structtype) \ | |
751 DECLARE_ERROR_CHECK_TYPES(c_name, structtype) \ | |
752 int lrecord_type_##c_name; \ | |
753 struct lrecord_implementation lrecord_##c_name = \ | |
754 { name, dumpable, marker, printer, nuker, equal, hash, desc, \ | |
755 getprop, putprop, remprop, plist, size, sizer, \ | |
756 lrecord_type_last_built_in_type, basic_p } | |
757 #endif /* not USE_KKCC */ | |
686 | 758 |
687 extern Lisp_Object (*lrecord_markers[]) (Lisp_Object); | 759 extern Lisp_Object (*lrecord_markers[]) (Lisp_Object); |
688 | 760 |
689 #define INIT_LRECORD_IMPLEMENTATION(type) do { \ | 761 #define INIT_LRECORD_IMPLEMENTATION(type) do { \ |
690 lrecord_implementations_table[lrecord_type_##type] = &lrecord_##type; \ | 762 lrecord_implementations_table[lrecord_type_##type] = &lrecord_##type; \ |