From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Daniel Colascione Newsgroups: gmane.emacs.bugs Subject: bug#17168: 24.3.50; Segfault at mark_object Date: Sat, 05 Apr 2014 15:37:37 -0700 Message-ID: <534085B1.9070307@dancol.org> References: <87y4zop44m.fsf@yahoo.fr> <533C3AF5.6070502@yandex.ru> <533C6905.9060309@dancol.org> <83bnwjbh8v.fsf@gnu.org> <533C75A6.60900@dancol.org> <533D06E6.2060001@yandex.ru> <533D07EF.1040502@yandex.ru> <533D13E2.3060300@dancol.org> <533D251E.3030108@dancol.org> <533D6A19.8050504@yandex.ru> <533D9099.3000104@dancol.org> <533D9F2C.7030500@yandex.ru> <533D9FBB.2050803@dancol.org> <533DB4F0.20706@dancol.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="52bOscr0PMTNj4eALxsMbESsfSCn58PSL" X-Trace: ger.gmane.org 1396737505 15735 80.91.229.3 (5 Apr 2014 22:38:25 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 5 Apr 2014 22:38:25 +0000 (UTC) Cc: Dmitry Antipov , 17168@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Apr 06 00:38:19 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1WWZEA-0008TP-HK for geb-bug-gnu-emacs@m.gmane.org; Sun, 06 Apr 2014 00:38:18 +0200 Original-Received: from localhost ([::1]:56052 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WWZEA-0001X3-3E for geb-bug-gnu-emacs@m.gmane.org; Sat, 05 Apr 2014 18:38:18 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:38319) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WWZE0-0001Ws-Sx for bug-gnu-emacs@gnu.org; Sat, 05 Apr 2014 18:38:14 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WWZDv-0001Sj-Fe for bug-gnu-emacs@gnu.org; Sat, 05 Apr 2014 18:38:08 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:35968) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WWZDv-0001Se-7L for bug-gnu-emacs@gnu.org; Sat, 05 Apr 2014 18:38:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1WWZDu-00023a-Km for bug-gnu-emacs@gnu.org; Sat, 05 Apr 2014 18:38:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Daniel Colascione Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 05 Apr 2014 22:38:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 17168 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: moreinfo Original-Received: via spool by 17168-submit@debbugs.gnu.org id=B17168.13967374727886 (code B ref 17168); Sat, 05 Apr 2014 22:38:02 +0000 Original-Received: (at 17168) by debbugs.gnu.org; 5 Apr 2014 22:37:52 +0000 Original-Received: from localhost ([127.0.0.1]:37150 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WWZDi-000236-8a for submit@debbugs.gnu.org; Sat, 05 Apr 2014 18:37:51 -0400 Original-Received: from dancol.org ([96.126.100.184]:39466) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1WWZDb-00022r-Pc for 17168@debbugs.gnu.org; Sat, 05 Apr 2014 18:37:45 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dancol.org; s=x; h=Content-Type:In-Reply-To:References:Subject:CC:To:MIME-Version:From:Date:Message-ID; bh=7RGIiTjW1PqktEmrQV37LClKtxDzyoC6Esxl964zOcE=; b=O2RDB71HkrgTj2zVX06qdx3j28P0MHmcE/K+ATkPrAFo6q/fZcpbzFOORgym1XfX7Rb6SAhmLTt1zDjwkjLOBsz86bPvDDdYsQE5EFAfhk9PRxLhy3wnIA679EXDW5W+vtK3DIIcjlvEQIrTg7dqUf2qAuz9S4ZyjiQ8skbqFVSCJ+tFF5qCdy6b6D07xIFln/xBNQiEYjUIkjO+O+f4H/Y8ZYWA5hP/Ru/FYegW52dvzihB8hqdPgz/t2SwqWnJfsM/Nn8LToPmz9LDvbbLLiUabs9sWZg/m8N5Zm3qO9lO8Nku4JD7041XhssZ3s8tMg3lZqgXpC7e2CrWrnAooQ==; Original-Received: from [2601:8:b200:551::2b1] by dancol.org with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1WWZDX-00013e-CZ; Sat, 05 Apr 2014 15:37:39 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 In-Reply-To: <533DB4F0.20706@dancol.org> X-Enigmail-Version: 1.6 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:87783 Archived-At: This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --52bOscr0PMTNj4eALxsMbESsfSCn58PSL Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 04/03/2014 12:22 PM, Daniel Colascione wrote: > On 04/03/2014 12:21 PM, Stefan Monnier wrote: >>> Sure; I don't think it's too late to take pure storage out of 24.4 >> >> It is definitely too late for that. >=20 > Okay. Let's try your proposed solution then. I'll see whether I can cod= e > something up today. The patch came out more complicated than I'd hoped. Basically, we define a new variable Vpure_reachable, accessible only from C. Early in startup, we make it a plain list and cons reachable but non-pure objects from Fpurecopy onto it. Once we have hash tables available, we turn it into a hash table. At the end of loadup, instead of just setting purify-flag to nil, we call a new subr finalize-pure-storage. finalize-pure-storage sets purify-flag to nil by side effect and, as new behavior, makes purify-flag constant so that it can never again become non-nil. Before returning, finalize-pure-storage also turns Vpure_reachable into a vector *in pure storage* of objects we need to keep around. Fgarbage_collect knows how to mark objects in Vpure_reachable and understands that if Vpure_reachable is a vector, its contents should be marked, not the vector itself. This scheme works and passes Dmitry's test, but the resulting Vpure_reachable vector has over 8,000 items. Most of these items are ordinary interned symbols. As an optimization, when we build the final vector form of Fpure_reachable, we see whether each item is a symbol interned in the initial obarray. If it is, then instead of adding it to the vector, we mark the symbol as un-uninternable, and add code to Funintern to look for this new flag. After this optimization, Vpure-reachable only has 251 elements. Please review. =3D=3D=3D modified file 'lisp/loadup.el' --- lisp/loadup.el 2014-02-10 01:34:22 +0000 +++ lisp/loadup.el 2014-04-05 22:24:34 +0000 @@ -56,7 +56,7 @@ t)) (let ((dir (car load-path))) ;; We'll probably overflow the pure space. - (setq purify-flag nil) + (finalize-pure-storage) (setq load-path (list (expand-file-name "." dir) (expand-file-name "emacs-lisp" dir) (expand-file-name "language" dir) @@ -389,12 +389,11 @@ (message "Pure-hashed: %d strings, %d vectors, %d conses, %d bytecodes, %d others" strings vectors conses bytecodes others))) -;; Avoid error if user loads some more libraries now and make sure the -;; hash-consing hash table is GC'd. -(setq purify-flag nil) - -(if (null (garbage-collect)) - (setq pure-space-overflow t)) +;; Runs garbage-collect and sets purify-flag to nil by side effect. +(when (and purify-flag + (progn (finalize-pure-storage) + (not (garbage-collect)))) + (setq pure-space-overflow t)) (if (or (member (nth 3 command-line-args) '("dump" "bootstrap")) (member (nth 4 command-line-args) '("dump" "bootstrap"))) =3D=3D=3D modified file 'src/alloc.c' --- src/alloc.c 2014-04-03 09:50:58 +0000 +++ src/alloc.c 2014-04-05 22:30:18 +0000 @@ -173,6 +173,14 @@ static char *purebeg; static ptrdiff_t pure_size; +/* Data structure holding non-pure objects reachable from objects in + pure storage. Initially a list, since we need this data structure + before we've initialized enough of Emacs to make hash tables. We + transform it into a hash table when hash tables become available. + In `finalize-pure-storage', we turn Vpure_reachable into a vector in + pure storage. */ +static Lisp_Object Vpure_reachable; + /* Number of bytes of pure storage used before pure storage overflowed. If this is non-zero, this implies that an overflow occurred. */ @@ -196,6 +204,8 @@ const char *pending_malloc_warning; +static Lisp_Object purecopy_1 (Lisp_Object obj, bool top_level); + #if 0 /* Normally, pointer sanity only on request... */ #ifdef ENABLE_CHECKING #define SUSPICIOUS_OBJECT_CHECKING 1 @@ -5228,8 +5238,8 @@ Lisp_Object new; struct Lisp_Cons *p =3D pure_alloc (sizeof *p, Lisp_Cons); XSETCONS (new, p); - XSETCAR (new, Fpurecopy (car)); - XSETCDR (new, Fpurecopy (cdr)); + XSETCAR (new, purecopy_1 (car, false)); + XSETCDR (new, purecopy_1 (cdr, false)); return new; } @@ -5261,12 +5271,8 @@ return new; } - -DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0, - doc: /* Make a copy of object OBJ in pure storage. -Recursively copies contents of vectors and cons cells. -Does not copy symbols. Copies strings without text properties. */) - (register Lisp_Object obj) +static Lisp_Object +purecopy_1 (Lisp_Object obj, bool top_level) { if (NILP (Vpurify_flag)) return obj; @@ -5300,7 +5306,7 @@ size &=3D PSEUDOVECTOR_SIZE_MASK; vec =3D XVECTOR (make_pure_vector (size)); for (i =3D 0; i < size; i++) - vec->contents[i] =3D Fpurecopy (AREF (obj, i)); + vec->contents[i] =3D purecopy_1 (AREF (obj, i), false); if (COMPILEDP (obj)) { XSETPVECTYPE (vec, PVEC_COMPILED); @@ -5311,9 +5317,20 @@ } else if (MARKERP (obj)) error ("Attempt to copy a marker to pure storage"); - else + else if (top_level) /* Not purified, don't hash-cons. */ return obj; + else if (!INTEGERP (obj) && !EQ (obj, Qt) && !EQ (obj, Qnil)) + { + /* Object is reachable from a pure object, so we need remember + it as a GC root: we don't mark pure objects themselves. */ + if (NILP (Vpure_reachable) || CONSP (Vpure_reachable)) + Vpure_reachable =3D Fcons (obj, Vpure_reachable); + else + Fputhash (obj, Qnil, Vpure_reachable); + + return obj; + } if (HASH_TABLE_P (Vpurify_flag)) /* Hash consing. */ Fputhash (obj, obj, Vpurify_flag); @@ -5322,6 +5339,73 @@ } +DEFUN ("purecopy", Fpurecopy, Spurecopy, 1, 1, 0, + doc: /* Make a copy of object OBJ in pure storage. +Recursively copies contents of vectors and cons cells. +Does not copy symbols. Copies strings without text properties. */) + (register Lisp_Object obj) +{ + return purecopy_1 (obj, true); +} + +DEFUN ("finalize-pure-storage", Ffinalize_pure_storage, + Sfinalize_pure_storage, 0, 0, 0, + doc: /* Finishes building pure storage. +May be called only once, with purify-flag non-nil. */) + (void) +{ + struct Lisp_Hash_Table *h; + ptrdiff_t nr_reachable; + Lisp_Object new_pure_reachable; + Lisp_Object reachable_object; + ptrdiff_t i; + Lisp_Object reachable_objects; + + if (NILP (Vpurify_flag)) + error ("Purification not started"); + + eassert (HASH_TABLE_P (Vpure_reachable)); + h =3D XHASH_TABLE (Vpure_reachable); + + reachable_objects =3D Qnil; + nr_reachable =3D 0; + + for (i =3D 0; i < HASH_TABLE_SIZE (h); ++i) + if (!NILP (HASH_HASH (h, i))) + { + reachable_object =3D HASH_KEY (h, i); + if (SYMBOLP (reachable_object)) + { + if (SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (reachable_object))= + XSYMBOL (reachable_object)->interned =3D + SYMBOL_INTERNED_IN_INITIAL_OBARRAY_CANNOT_UNINTERN; + + if (XSYMBOL (reachable_object)->interned + =3D=3D SYMBOL_INTERNED_IN_INITIAL_OBARRAY_CANNOT_UNINTER= N) + { + /* No need to remember this object, since it's already + on the main obarray and won't be uninterned. */ + continue; + } + } + + nr_reachable +=3D 1; + reachable_objects =3D Fcons (reachable_object, reachable_objects= ); + } + + new_pure_reachable =3D make_pure_vector (nr_reachable); + for (i =3D 0; CONSP (reachable_objects); ++i) + { + XVECTOR (new_pure_reachable)->contents[i] =3D XCAR (reachable_obje= cts); + reachable_objects =3D XCDR (reachable_objects); + } + + XSYMBOL (intern_c_string ("purify-flag"))->constant =3D 1; + Vpurify_flag =3D Qnil; + Vpure_reachable =3D new_pure_reachable; + return Qnil; +} + =0C /***********************************************************************= Protection from GC @@ -5578,6 +5662,19 @@ for (i =3D 0; i < staticidx; i++) mark_object (*staticvec[i]); + if (VECTORP (Vpure_reachable)) + { + /* Vpure_reachable is a pure-allocated vector of objects + reachable from pure storage. We can't mark it, but we can + mark its contents. */ + struct Lisp_Vector* pv =3D XVECTOR (Vpure_reachable); + eassert (PURE_POINTER_P (pv)); + for (i =3D 0; i < pv->header.size; ++i) + mark_object (pv->contents[i]); + } + else + mark_object (Vpure_reachable); + mark_specpdl (); mark_terminals (); mark_kboards (); @@ -6581,12 +6678,7 @@ for (; sym < end; ++sym) { - /* Check if the symbol was created during loadup. In such a c= ase - it might be pointed to by pure bytecode which we don't trac= e, - so we conservatively assume that it is live. */ - bool pure_p =3D PURE_POINTER_P (XSTRING (sym->s.name)); - - if (!sym->s.gcmarkbit && !pure_p) + if (!sym->s.gcmarkbit) { if (sym->s.redirect =3D=3D SYMBOL_LOCALIZED) xfree (SYMBOL_BLV (&sym->s)); @@ -6600,8 +6692,6 @@ else { ++num_used; - if (!pure_p) - eassert (!STRING_MARKED_P (XSTRING (sym->s.name))); sym->s.gcmarkbit =3D 0; /* Attempt to catch bogus objects. */ eassert (valid_lisp_object_p (sym->s.function) >=3D 1); @@ -6922,6 +7012,9 @@ /* Used to do Vpurify_flag =3D Qt here, but Qt isn't set up yet! */ purebeg =3D PUREBEG; pure_size =3D PURESIZE; +#ifdef ENABLE_CHECKING + Vpure_reachable =3D make_number (-1); +#endif #if GC_MARK_STACK || defined GC_MALLOC_CHECK mem_init (); @@ -6941,6 +7034,39 @@ } void +init_alloc_once_post_obarray (void) +{ + /* This function is called after Qnil and Qt make sense. Qt is + correct even if CANNOT_DUMP. loadup.el will set to nil at end. */ + Vpurify_flag =3D Qt; + Vpure_reachable =3D Qnil; + /* We don't need to staticpro Vpure_reachable as we mark is specially + in Fgarbage_collect. */ +} + +void +init_alloc_once_post_hash_tables (void) +{ + /* This function is called after hash tables become available. Make + Vpure_reachable a hash table for more efficiency. */ + Lisp_Object reachable_list =3D Vpure_reachable; + Lisp_Object new_pure_reachable =3D + make_hash_table (hashtest_eq, + make_number (DEFAULT_HASH_SIZE), + make_float (DEFAULT_REHASH_SIZE), + make_float (DEFAULT_REHASH_THRESHOLD), + Qnil); + + while (CONSP (reachable_list)) + { + Fputhash (XCAR (reachable_list), Qnil, new_pure_reachable); + reachable_list =3D XCDR (reachable_list); + } + + Vpure_reachable =3D new_pure_reachable; +} + +void init_alloc (void) { gcprolist =3D 0; @@ -7068,6 +7194,7 @@ defsubr (&Smake_symbol); defsubr (&Smake_marker); defsubr (&Spurecopy); + defsubr (&Sfinalize_pure_storage); defsubr (&Sgarbage_collect); defsubr (&Smemory_limit); defsubr (&Smemory_use_counts); =3D=3D=3D modified file 'src/emacs.c' --- src/emacs.c 2014-04-03 07:14:02 +0000 +++ src/emacs.c 2014-04-05 20:33:09 +0000 @@ -1171,6 +1171,7 @@ { init_alloc_once (); init_obarray (); + init_alloc_once_post_obarray (); init_eval_once (); init_charset_once (); init_coding_once (); @@ -1198,6 +1199,7 @@ /* Called before syms_of_fileio, because it sets up Qerror_condition. */ syms_of_data (); syms_of_fns (); /* Before syms_of_charset which uses hashtables. */ + init_alloc_once_post_hash_tables (); syms_of_fileio (); /* Before syms_of_coding to initialize Vgc_cons_threshold. */ syms_of_alloc (); @@ -2078,7 +2080,6 @@ You must run Emacs in batch mode in order to dump it. */) (Lisp_Object filename, Lisp_Object symfile) { - Lisp_Object tem; Lisp_Object symbol; ptrdiff_t count =3D SPECPDL_INDEX (); @@ -2090,6 +2091,9 @@ if (!might_dump) error ("Emacs can be dumped only once"); + if (!NILP (Vpurify_flag)) + error ("Purification must have completed before dumping"); + #ifdef GNU_LINUX /* Warn if the gap between BSS end and heap start is larger than this. */ @@ -2127,9 +2131,6 @@ } } - tem =3D Vpurify_flag; - Vpurify_flag =3D Qnil; - #ifdef HAVE_TZSET set_time_zone_rule (dump_tz); #ifndef LOCALTIME_CACHE @@ -2173,8 +2174,6 @@ reset_image_types (); #endif - Vpurify_flag =3D tem; - return unbind_to (count, Qnil); } =3D=3D=3D modified file 'src/fns.c' --- src/fns.c 2014-04-01 20:18:12 +0000 +++ src/fns.c 2014-04-05 21:39:19 +0000 @@ -3483,8 +3483,9 @@ Low-level Functions ***********************************************************************= / -static struct hash_table_test hashtest_eq; -struct hash_table_test hashtest_eql, hashtest_equal; +struct hash_table_test hashtest_eq; +struct hash_table_test hashtest_eql; +struct hash_table_test hashtest_equal; /* Compare KEY1 which has hash code HASH1 and KEY2 with hash code HASH2 in hash table H using `eql'. Value is true if KEY1 and =3D=3D=3D modified file 'src/lisp.h' --- src/lisp.h 2014-04-03 00:18:08 +0000 +++ src/lisp.h 2014-04-05 22:13:57 +0000 @@ -1537,7 +1537,8 @@ { SYMBOL_UNINTERNED =3D 0, SYMBOL_INTERNED =3D 1, - SYMBOL_INTERNED_IN_INITIAL_OBARRAY =3D 2 + SYMBOL_INTERNED_IN_INITIAL_OBARRAY =3D 2, + SYMBOL_INTERNED_IN_INITIAL_OBARRAY_CANNOT_UNINTERN =3D 3 }; enum symbol_redirect @@ -1658,7 +1659,14 @@ INLINE bool SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object sym) { - return XSYMBOL (sym)->interned =3D=3D SYMBOL_INTERNED_IN_INITIAL_OBARR= AY; + return XSYMBOL (sym)->interned >=3D SYMBOL_INTERNED_IN_INITIAL_OBARRAY= ; +} + +INLINE bool +SYMBOL_CANNOT_UNINTERN_P (Lisp_Object sym) +{ + return XSYMBOL (sym)->interned =3D=3D + SYMBOL_INTERNED_IN_INITIAL_OBARRAY_CANNOT_UNINTERN; } /* Value is non-zero if symbol is considered a constant, i.e. its @@ -3450,7 +3458,7 @@ ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *); ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object, EMACS_UINT); -extern struct hash_table_test hashtest_eql, hashtest_equal; +extern struct hash_table_test hashtest_eq, hashtest_eql, hashtest_equal;= extern Lisp_Object substring_both (Lisp_Object, ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t); @@ -3741,6 +3749,8 @@ extern void free_marker (Lisp_Object); extern void free_cons (struct Lisp_Cons *); extern void init_alloc_once (void); +extern void init_alloc_once_post_obarray (void); +extern void init_alloc_once_post_hash_tables (void); extern void init_alloc (void); extern void syms_of_alloc (void); extern struct buffer * allocate_buffer (void); =3D=3D=3D modified file 'src/lread.c' --- src/lread.c 2014-02-25 22:51:34 +0000 +++ src/lread.c 2014-04-05 22:11:09 +0000 @@ -3895,10 +3895,17 @@ if (SYMBOLP (name) && !EQ (name, tem)) return Qnil; - /* There are plenty of other symbols which will screw up the Emacs - session if we unintern them, as well as even more ways to use - `setq' or `fset' or whatnot to make the Emacs session - unusable. Let's not go down this silly road. --Stef */ + if (XSYMBOL (tem)->interned + =3D=3D SYMBOL_INTERNED_IN_INITIAL_OBARRAY_CANNOT_UNINTERN) + { + /* We can't unintern this symbol because pure storage might + refer to it. If we were to allow uninterning, we'd have to + remember these symbols as GC roots elsewhere, and if the user + later re-interned them, the core functionality would refer to + symbols with a different name. */ + error ("Attempt to unintern symbol in Emacs core"); + } + /* if (EQ (tem, Qnil) || EQ (tem, Qt)) error ("Attempt to unintern t or nil"); */ @@ -4052,9 +4059,6 @@ XSYMBOL (Qnil)->declared_special =3D 1; XSYMBOL (Qt)->constant =3D 1; - /* Qt is correct even if CANNOT_DUMP. loadup.el will set to nil at end. */ - Vpurify_flag =3D Qt; - DEFSYM (Qvariable_documentation, "variable-documentation"); read_buffer =3D xmalloc (size); --52bOscr0PMTNj4eALxsMbESsfSCn58PSL Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.14 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTQIWxAAoJEMAaIROpHW7IHh4QAMBMuceMwnxer6zZq3oa3KIX Nvke2lZPInqJre8QbG2Pmz4NjGGxazaH00uVR8KMpase3+XiibuF0kuOGTvy/CW8 dKBMxlNLRTEyyzzWpm5PViYBq3VGhMbVhV4oh+dx/29QD+ETEp6UXmt5/HWKUQN6 AhEqMBqnp0N8MD6IHLANS9SImnSKB+87OyhUVvReedauVceFIDFgbpO0E5db4MG2 fGf2Ju1bC+aTzeHOdRh39Z8vfI5pSJ5s3n1OdvpEUtAIMS87yiB3PJJ7xTtSZgXZ +hgX+BdJMGuDF5hHtWOtadi3zSjGJZgq9lTz0el2sCiU1hkiUp13fb8pua7bpLyJ cU2b6hToBPjr6mKYHXaFE6Tcs9kYaA10Lr0EkI9NslT1hjSCesx5BhZ6EzA2+7t6 G9+CTGIss3J8LJJYNe9opLdx1GOg/9CKqkZ3iWJneKohijcSbrzP4QyqaBRgVpbZ a2V4ov7DTN505od7raSpdtyweITjbC1ktaYHzJO5cUzt3RFN6P2pqd7J5RZJEs51 dvQu8dGu/x2BKyY956P85EdNCMdHN3aUx0YgzmzbV5WFHtADZJEhmRXplC5wzTRF o2THSr8cWIy6RiJmOVM3+2POfKfzCg3NnY5a7gONVOayytZbP/y0BNZuSGDw4ttI +lEYj2gLASjI+WyToNzZ =ihNB -----END PGP SIGNATURE----- --52bOscr0PMTNj4eALxsMbESsfSCn58PSL--