From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Vibhav Pant Newsgroups: gmane.emacs.devel Subject: [PATCH] Make purecopy create hash tables properly Date: Sat, 28 Jan 2017 00:07:05 +0530 Message-ID: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a113c4860ab1023054717c09e X-Trace: blaine.gmane.org 1485542389 8478 195.159.176.226 (27 Jan 2017 18:39:49 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Fri, 27 Jan 2017 18:39:49 +0000 (UTC) To: "emacs-devel@gnu.org" Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Fri Jan 27 19:39:41 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cXBQy-0001am-Av for ged-emacs-devel@m.gmane.org; Fri, 27 Jan 2017 19:39:40 +0100 Original-Received: from localhost ([::1]:47357 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cXBR3-000219-NM for ged-emacs-devel@m.gmane.org; Fri, 27 Jan 2017 13:39:45 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:44704) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cXBOW-0000v6-Ci for emacs-devel@gnu.org; Fri, 27 Jan 2017 13:37:09 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cXBOV-0006tR-3E for emacs-devel@gnu.org; Fri, 27 Jan 2017 13:37:08 -0500 Original-Received: from mail-yb0-x22d.google.com ([2607:f8b0:4002:c09::22d]:34453) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cXBOU-0006tI-Ty for emacs-devel@gnu.org; Fri, 27 Jan 2017 13:37:07 -0500 Original-Received: by mail-yb0-x22d.google.com with SMTP id j82so70244513ybg.1 for ; Fri, 27 Jan 2017 10:37:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=F46f8LlFaFfAlsq2h3nTbCLd45UhdIQ1CnW0ZpRyg/Q=; b=QNMalqIra5MeEQ2oePslBS1NYt/lVGAZSL6ZaeDjX0ziM1q8PZKazA13+CDLjDrVQB gKZmDU0K3Shc/Nn0snfRFw2H8qLwKJLzD3H9h0XdfGU9nNzf1qNyCAPQer8kO/uVhpUv GKBqZr6r/E+2zD+J5DYCrOTOUDyD98bFMzmBEhRXD9W5XlN5one4Imzhr5Ar2+qQmRau qokS9mgGnkZarmZHSgR4DpWFX/yXDgwbj+0orvznWXv3Dbzj9nRWDwF2ACUQ+kqpZSZf 8z/juKXoPJMLiWx37MpNUziHGODLPL+yiOqXr6jyWK8/HdxJxbv4rg6TYYhNuysB66JH kLaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=F46f8LlFaFfAlsq2h3nTbCLd45UhdIQ1CnW0ZpRyg/Q=; b=lRhBptBvtRO35TXZ3GUscEI4Jh8pQrkC9Wb1c3M1cljl0pPURh0Anbd6dRFscCJ6hH sqZunWtcuYhVJ6Ydxwzslb+iJqOXzgnwG99vmsAfWtI6WrBA01C7Day8QwWWC1sFk4Tc SE05rgWrliOYniGFoD4Z7p01TAStoqtCDones1d5KDFAOEY/zyo8yYAo3Fk1ZPbxJjPP zY/SlB4x7XVYzdMpCMhQzpf4XdzqX3lO+ohLMMKX72DkIg/osdBA3C2obepeuPjHYs0w lExDVyiZoiUhwIFiZJ5LMMkRMmhIXStrp2yOcNAQx9i5XekWn7j436r/7j5Efe+AY8fk h/EQ== X-Gm-Message-State: AIkVDXIS3p6F/P+iHci5v/EzNaSJAr7UiGIh7A30e6J427ITCQS8VbJKXmDd2ZWIAkvsIomi/lK1pKSwuH1HoQ== X-Received: by 10.37.70.86 with SMTP id t83mr2592817yba.180.1485542225794; Fri, 27 Jan 2017 10:37:05 -0800 (PST) Original-Received: by 10.129.153.77 with HTTP; Fri, 27 Jan 2017 10:37:05 -0800 (PST) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:4002:c09::22d X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:211649 Archived-At: --001a113c4860ab1023054717c09e Content-Type: text/plain; charset=UTF-8 As of now, hash tables are purecopied by getting XVECTOR(table), and copying the contents to pure-alloced memory[0]. This resulted in purecopy returning a vector consisting of mostly nil and random numbers[1]. As the current lisp code doesn't use printed hash tables anywhere, this never caused a problem while dumping emacs. However, using printed hash tables in any code thats loaded in temacs causes the keys and values of the table to change [2], or segfaults temacs altogether [3]. The following patch attempts to fix this, by adding a make_pure_hash_table function that returns a copy of the provided Lisp_Hash_Table* value allocated in pure space. From my testing, this both the issues with printed hash tables in temacs, although I am not sure about the repercussions of blindly copying the header (vectorlike_header) from one Lisp_Hash_Table to another. Any feedback on this would be appreciated, as I would like to get this into master to continue work on byte-switch [4], which makes use of printed hash tables in the constant vector of bytecode functions. I'm not well versed with Emacs internals, apologies if anything above was incorrect. [0] http://git.savannah.gnu.org/cgit/emacs.git/tree/src/alloc.c#n5480 [1] http://ix.io/1ReZ [2] https://lists.gnu.org/archive/html/emacs-devel/2017-01/msg00568.html [3] https://lists.gnu.org/archive/html/emacs-devel/2017-01/msg00597.html [4] http://git.savannah.gnu.org/cgit/emacs.git/tree/etc/TODO#n38 --- diff --git a/src/alloc.c b/src/alloc.c index f7b6515f4e..b64f2de224 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -5434,6 +5434,33 @@ make_pure_vector (ptrdiff_t len) return new; } +static struct Lisp_Hash_Table * make_pure_hash_table(struct Lisp_Hash_Table *table); + +/* Return a hash table with the same parameters and values as that of TABLE + allocated from pure space. */ +static struct Lisp_Hash_Table * +make_pure_hash_table(struct Lisp_Hash_Table *table) +{ + struct Lisp_Hash_Table *pure = pure_alloc (sizeof *pure, Lisp_Vectorlike); + pure->header = table->header; + pure->weak = purecopy (table->weak); + pure->rehash_size = purecopy (table->rehash_size); + pure->rehash_threshold = purecopy(table->rehash_threshold); + pure->hash = purecopy (table->hash); + pure->next = purecopy (table->next); + pure->next_free = purecopy (table->next_free); + pure->index = purecopy (table->index); + pure->count = table->count; + pure->key_and_value = purecopy (table->key_and_value); + pure->test = table->test; + + if (table->next_weak) { + pure->next_weak = make_pure_hash_table (table->next_weak); + } + + return pure; +} + 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. @@ -5477,7 +5504,11 @@ purecopy (Lisp_Object obj) obj = make_pure_string (SSDATA (obj), SCHARS (obj), SBYTES (obj), STRING_MULTIBYTE (obj)); - else if (COMPILEDP (obj) || VECTORP (obj) || HASH_TABLE_P (obj)) + else if (HASH_TABLE_P (obj)) { + struct Lisp_Hash_Table *h = make_pure_hash_table(XHASH_TABLE(obj)); + XSET_HASH_TABLE(obj, h); + } + else if (COMPILEDP (obj) || VECTORP (obj)) { struct Lisp_Vector *objp = XVECTOR (obj); ptrdiff_t nbytes = vector_nbytes (objp); -- Vibhav Pant vibhavp@gmail.com --001a113c4860ab1023054717c09e Content-Type: text/x-patch; charset=US-ASCII; name="purecopy_hash_table.patch" Content-Disposition: attachment; filename="purecopy_hash_table.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iyg5bmt90 ZGlmZiAtLWdpdCBhL3NyYy9hbGxvYy5jIGIvc3JjL2FsbG9jLmMKaW5kZXggZjdiNjUxNWY0ZS4u YjY0ZjJkZTIyNCAxMDA2NDQKLS0tIGEvc3JjL2FsbG9jLmMKKysrIGIvc3JjL2FsbG9jLmMKQEAg LTU0MzQsNiArNTQzNCwzMyBAQCBtYWtlX3B1cmVfdmVjdG9yIChwdHJkaWZmX3QgbGVuKQogICBy ZXR1cm4gbmV3OwogfQogCitzdGF0aWMgc3RydWN0IExpc3BfSGFzaF9UYWJsZSAqIG1ha2VfcHVy ZV9oYXNoX3RhYmxlKHN0cnVjdCBMaXNwX0hhc2hfVGFibGUgKnRhYmxlKTsKKworLyogUmV0dXJu IGEgaGFzaCB0YWJsZSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYW5kIHZhbHVlcyBhcyB0aGF0 IG9mIFRBQkxFCisgICBhbGxvY2F0ZWQgZnJvbSBwdXJlIHNwYWNlLiAgKi8KK3N0YXRpYyBzdHJ1 Y3QgTGlzcF9IYXNoX1RhYmxlICoKK21ha2VfcHVyZV9oYXNoX3RhYmxlKHN0cnVjdCBMaXNwX0hh c2hfVGFibGUgKnRhYmxlKQoreworICBzdHJ1Y3QgTGlzcF9IYXNoX1RhYmxlICpwdXJlID0gcHVy ZV9hbGxvYyAoc2l6ZW9mICpwdXJlLCBMaXNwX1ZlY3Rvcmxpa2UpOworICBwdXJlLT5oZWFkZXIg PSB0YWJsZS0+aGVhZGVyOworICBwdXJlLT53ZWFrID0gcHVyZWNvcHkgKHRhYmxlLT53ZWFrKTsK KyAgcHVyZS0+cmVoYXNoX3NpemUgPSBwdXJlY29weSAodGFibGUtPnJlaGFzaF9zaXplKTsKKyAg cHVyZS0+cmVoYXNoX3RocmVzaG9sZCA9IHB1cmVjb3B5KHRhYmxlLT5yZWhhc2hfdGhyZXNob2xk KTsKKyAgcHVyZS0+aGFzaCA9IHB1cmVjb3B5ICh0YWJsZS0+aGFzaCk7CisgIHB1cmUtPm5leHQg PSBwdXJlY29weSAodGFibGUtPm5leHQpOworICBwdXJlLT5uZXh0X2ZyZWUgPSBwdXJlY29weSAo dGFibGUtPm5leHRfZnJlZSk7CisgIHB1cmUtPmluZGV4ID0gcHVyZWNvcHkgKHRhYmxlLT5pbmRl eCk7CisgIHB1cmUtPmNvdW50ID0gdGFibGUtPmNvdW50OworICBwdXJlLT5rZXlfYW5kX3ZhbHVl ID0gcHVyZWNvcHkgKHRhYmxlLT5rZXlfYW5kX3ZhbHVlKTsKKyAgcHVyZS0+dGVzdCA9IHRhYmxl LT50ZXN0OworCisgIGlmICh0YWJsZS0+bmV4dF93ZWFrKSB7CisgICAgcHVyZS0+bmV4dF93ZWFr ID0gbWFrZV9wdXJlX2hhc2hfdGFibGUgKHRhYmxlLT5uZXh0X3dlYWspOworICB9CisKKyAgcmV0 dXJuIHB1cmU7Cit9CisKIERFRlVOICgicHVyZWNvcHkiLCBGcHVyZWNvcHksIFNwdXJlY29weSwg MSwgMSwgMCwKICAgICAgICBkb2M6IC8qIE1ha2UgYSBjb3B5IG9mIG9iamVjdCBPQkogaW4gcHVy ZSBzdG9yYWdlLgogUmVjdXJzaXZlbHkgY29waWVzIGNvbnRlbnRzIG9mIHZlY3RvcnMgYW5kIGNv bnMgY2VsbHMuCkBAIC01NDc3LDcgKzU1MDQsMTEgQEAgcHVyZWNvcHkgKExpc3BfT2JqZWN0IG9i aikKICAgICBvYmogPSBtYWtlX3B1cmVfc3RyaW5nIChTU0RBVEEgKG9iaiksIFNDSEFSUyAob2Jq KSwKIAkJCSAgICBTQllURVMgKG9iaiksCiAJCQkgICAgU1RSSU5HX01VTFRJQllURSAob2JqKSk7 Ci0gIGVsc2UgaWYgKENPTVBJTEVEUCAob2JqKSB8fCBWRUNUT1JQIChvYmopIHx8IEhBU0hfVEFC TEVfUCAob2JqKSkKKyAgZWxzZSBpZiAoSEFTSF9UQUJMRV9QIChvYmopKSB7CisgICAgc3RydWN0 IExpc3BfSGFzaF9UYWJsZSAqaCA9IG1ha2VfcHVyZV9oYXNoX3RhYmxlKFhIQVNIX1RBQkxFKG9i aikpOworICAgIFhTRVRfSEFTSF9UQUJMRShvYmosIGgpOworICB9CisgIGVsc2UgaWYgKENPTVBJ TEVEUCAob2JqKSB8fCBWRUNUT1JQIChvYmopKQogICAgIHsKICAgICAgIHN0cnVjdCBMaXNwX1Zl Y3RvciAqb2JqcCA9IFhWRUNUT1IgKG9iaik7CiAgICAgICBwdHJkaWZmX3QgbmJ5dGVzID0gdmVj dG9yX25ieXRlcyAob2JqcCk7Cg== --001a113c4860ab1023054717c09e--