aboutsummaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorPaul Eggert2018-08-08 19:46:29 -0700
committerPaul Eggert2018-08-11 18:50:25 -0700
commitd614e4a8cd2d5fe37b38bb4d8191013a7d917731 (patch)
treef27e866dc009cba536575c9a30af362296a9b60e /src/data.c
parentd3ec5117da3146573cad5c1f8d01ab2e58f21e92 (diff)
downloademacs-d614e4a8cd2d5fe37b38bb4d8191013a7d917731.tar.gz
emacs-d614e4a8cd2d5fe37b38bb4d8191013a7d917731.zip
Turn misc objects into pseudovectors
Eliminate the category of miscellaneous objects, and turn all such objects into pseudovectors. The immediate motivation for this change is to free up an enum Lisp_Type tag value, a scarce resource that can be better used elsewhere. However, this change is worthwhile in its own right, as it improves performance slightly on my platform, 0.3% faster for 'make compile-always' on Fedora 28, and it simplifies the garbage collector and interpreter (Bug#32405). * doc/lispref/internals.texi (Garbage Collection): * etc/NEWS: Document change to garbage-collect return value. * src/alloc.c (total_markers, total_free_markers): (union aligned_Lisp_Misc, MARKER_BLOCK_SIZE) (struct marker_block, marker_block, marker_block_index) (misc_free_list, allocate_misc, live_misc_holding) (live_misc_p, sweep_misc): * src/lisp.h (lisp_h_MARKERP, lisp_h_MISCP, MARKERP, MISCP) (Lisp_Misc, enum Lisp_Misc_Type, Lisp_Misc_Free) (Lisp_Misc_Marker, Lisp_Misc_Overlay, Lisp_Misc_Finalizer) (Lisp_Misc_Ptr, Lisp_Misc_User_Ptr, Lisp_Misc_Limit) (Lisp_Misc_Bignum) (XSETMISC, struct Lisp_Misc_Any, XMISCANY, XMISCTYPE) (struct Lisp_Free, union Lisp_Misc, XMISC): Remove. All uses removed. (cleanup_vector): Clean up objects that were formerly misc and are now pseudovectors. (make_misc_ptr, build_overlay, Fmake_marker, build_marker) (make_bignum_str, make_number, make_pure_bignum) (make_user_ptr, Fmake_finalizer): Build as pseudovectors, not as misc objects. (mark_finalizer_list, queue_doomed_finalizers) (compact_undo_list, mark_overlay, mark_object) (unchain_dead_markers): Mark as vector-like objects, not as misc objects. (mark_maybe_object, mark_maybe_pointer, valid_lisp_object_p) (total_bytes_of_live_objects, survives_gc_p): * src/fns.c (sxhash): No need to worry about misc objects. (garbage_collect_1): Do not generate a 'misc' component. (syms_of_alloc): No need for 'misc' symbol. * src/buffer.c (overlays_at, overlays_in, overlay_touches_p) (overlay_strings, recenter_overlay_lists) (fix_start_end_in_overlays, fix_overlays_before) (Foverlay_lists, report_overlay_modification) (evaporate_overlays): * src/editfns.c (overlays_around): * src/data.c (Ftype_of): * src/fns.c (internal_equal): * src/lisp.h (mint_ptrp, xmint_pointer, FINALIZERP) (XFINALIZER, MARKERP, XMARKER, OVERLAYP, XOVERLAY, USER_PTRP) (XUSER_PTR, BIGNUMP, XBIGNUM): * src/print.c (print_vectorlike, print_object): * src/undo.c (record_marker_adjustments): * src/xdisp.c (load_overlay_strings): Formerly misc objects are now pseudovectors. * src/lisp.h (PVEC_MARKER, PVEC_OVERLAY, PVEC_FINALIZER) (PVEC_BIGNUM, PVEC_MISC_PTR, PVEC_USER_PTR): New constants, replacing their misc versions. All uses changed. (struct Lisp_Marker, struct Lisp_Overlay, struct Lisp_Misc_Ptr) (struct Lisp_Bignum, struct Lisp_User_Ptr, struct Lisp_Finalizer): Make usable as a pseudovector by using a pseudovector header, replacing any DIY components, and putting Lisp_Object members first. All uses changed.
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c27
1 files changed, 8 insertions, 19 deletions
diff --git a/src/data.c b/src/data.c
index 7d701fde0e2..c8a9c6b3783 100644
--- a/src/data.c
+++ b/src/data.c
@@ -221,29 +221,17 @@ for example, (type-of 1) returns `integer'. */)
221 case Lisp_Cons: 221 case Lisp_Cons:
222 return Qcons; 222 return Qcons;
223 223
224 case Lisp_Misc:
225 switch (XMISCTYPE (object))
226 {
227 case Lisp_Misc_Marker:
228 return Qmarker;
229 case Lisp_Misc_Overlay:
230 return Qoverlay;
231 case Lisp_Misc_Finalizer:
232 return Qfinalizer;
233#ifdef HAVE_MODULES
234 case Lisp_Misc_User_Ptr:
235 return Quser_ptr;
236#endif
237 case Lisp_Misc_Bignum:
238 return Qinteger;
239 default:
240 emacs_abort ();
241 }
242
243 case Lisp_Vectorlike: 224 case Lisp_Vectorlike:
244 switch (PSEUDOVECTOR_TYPE (XVECTOR (object))) 225 switch (PSEUDOVECTOR_TYPE (XVECTOR (object)))
245 { 226 {
246 case PVEC_NORMAL_VECTOR: return Qvector; 227 case PVEC_NORMAL_VECTOR: return Qvector;
228 case PVEC_BIGNUM: return Qinteger;
229 case PVEC_MARKER: return Qmarker;
230 case PVEC_OVERLAY: return Qoverlay;
231 case PVEC_FINALIZER: return Qfinalizer;
232#ifdef HAVE_MODULES
233 case PVEC_USER_PTR: return Quser_ptr;
234#endif
247 case PVEC_WINDOW_CONFIGURATION: return Qwindow_configuration; 235 case PVEC_WINDOW_CONFIGURATION: return Qwindow_configuration;
248 case PVEC_PROCESS: return Qprocess; 236 case PVEC_PROCESS: return Qprocess;
249 case PVEC_WINDOW: return Qwindow; 237 case PVEC_WINDOW: return Qwindow;
@@ -279,6 +267,7 @@ for example, (type-of 1) returns `integer'. */)
279 case PVEC_MODULE_FUNCTION: 267 case PVEC_MODULE_FUNCTION:
280 return Qmodule_function; 268 return Qmodule_function;
281 /* "Impossible" cases. */ 269 /* "Impossible" cases. */
270 case PVEC_MISC_PTR:
282 case PVEC_XWIDGET: 271 case PVEC_XWIDGET:
283 case PVEC_OTHER: 272 case PVEC_OTHER:
284 case PVEC_XWIDGET_VIEW: 273 case PVEC_XWIDGET_VIEW: