diff options
| author | Paul Eggert | 2018-08-08 19:46:29 -0700 |
|---|---|---|
| committer | Paul Eggert | 2018-08-11 18:50:25 -0700 |
| commit | d614e4a8cd2d5fe37b38bb4d8191013a7d917731 (patch) | |
| tree | f27e866dc009cba536575c9a30af362296a9b60e /src/data.c | |
| parent | d3ec5117da3146573cad5c1f8d01ab2e58f21e92 (diff) | |
| download | emacs-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.c | 27 |
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: |