Fix hash tables not being purified correctly.
commit9c4dfdd1af9f97c6a8d7e922b68a39052116790c
authorVibhav Pant <vibhavp@gmail.com>
Mon, 30 Jan 2017 06:33:23 +0000 (30 12:03 +0530)
committerVibhav Pant <vibhavp@gmail.com>
Mon, 30 Jan 2017 06:33:23 +0000 (30 12:03 +0530)
tree1fb54fcb7d5eaa61ed88ea67ee9d17fde112bc4a
parent8ba236e772b64d0bb021aa691bd7eacf4b7f3ae4
Fix hash tables not being purified correctly.

* src/alloc.c
(purecopy_hash_table) New function, makes a copy of the given hash
table in pure storage.
Add new struct `pinned_object' and `pinned_objects' linked list for
pinning objects.
(Fpurecopy) Allow purifying hash tables
(purecopy) Pin hash tables that are either weak or not declared with
`:purecopy t`, use purecopy_hash_table otherwise.
(marked_pinned_objects) New function, marks all objects in pinned_objects.
(garbage_collect_1) Use it. Mark all pinned objects before sweeping.
* src/lisp.h Add new field `pure' to struct `Lisp_Hash_Table'.
* src/fns.c: Add `purecopy' parameter to hash tables.
(Fmake_hash_table): Check for a `:purecopy PURECOPY' argument, pass it
to make_hash_table.
(make_hash_table): Add `pure' parameter, set h->pure to it.
(Fclrhash, Fremhash, Fputhash): Enforce that the table is impure with
CHECK_IMPURE.
* src/lread.c: (read1) Parse for `purecopy' parameter while reading
  hash tables.
* src/print.c: (print_object) add the `purecopy' parameter while
  printing hash tables.
* src/category.c, src/emacs-module.c, src/image.c, src/profiler.c,
  src/xterm.c: Use new (make_hash_table).
src/alloc.c
src/category.c
src/emacs-module.c
src/fns.c
src/image.c
src/lisp.h
src/lread.c
src/print.c
src/profiler.c
src/xterm.c