• Vibhav Pant's avatar
    Fix hash tables not being purified correctly. · 9c4dfdd1
    Vibhav Pant authored
    * 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).
    9c4dfdd1
lread.c 142 KB