From adb6c3f1a4cc5ec3d26bfb2311dfc87b965153a0 Mon Sep 17 00:00:00 2001 From: Yikai Zhao Date: Sat, 14 Aug 2021 13:46:30 +0200 Subject: Fix memory-report counting of vector/hash table sizes * lisp/emacs-lisp/memory-report.el (memory-report--object-size-1): Count element values in vectors and hash tables. Copyright-paperwork-exempt: yes --- lisp/emacs-lisp/memory-report.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'lisp/emacs-lisp/memory-report.el') diff --git a/lisp/emacs-lisp/memory-report.el b/lisp/emacs-lisp/memory-report.el index 1125dde4055..aee2a0079ca 100644 --- a/lisp/emacs-lisp/memory-report.el +++ b/lisp/emacs-lisp/memory-report.el @@ -230,8 +230,7 @@ by counted more than once." (let ((total (+ (memory-report--size 'vector) (* (memory-report--size 'object) (length value))))) (cl-loop for elem across value - do (setf (gethash elem counted) t) - (cl-incf total (memory-report--object-size counted elem))) + do (cl-incf total (memory-report--object-size counted elem))) total)) (cl-defmethod memory-report--object-size-1 (counted (value hash-table)) @@ -239,8 +238,6 @@ by counted more than once." (* (memory-report--size 'object) (hash-table-size value))))) (maphash (lambda (key elem) - (setf (gethash key counted) t) - (setf (gethash elem counted) t) (cl-incf total (memory-report--object-size counted key)) (cl-incf total (memory-report--object-size counted elem))) value) -- cgit v1.2.3 From d8d5dc45656233fdccc3709093a16e2562cd4a40 Mon Sep 17 00:00:00 2001 From: Yikai Zhao Date: Thu, 2 Sep 2021 09:37:06 +0200 Subject: memory-report: support calculating size for structures * lisp/emacs-lisp/memory-report.el (memory-report--object-size-1): Add support for cl-defstruct types (bug#50301). --- lisp/emacs-lisp/memory-report.el | 15 ++++++++++++++- test/lisp/emacs-lisp/memory-report-tests.el | 8 ++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'lisp/emacs-lisp/memory-report.el') diff --git a/lisp/emacs-lisp/memory-report.el b/lisp/emacs-lisp/memory-report.el index aee2a0079ca..3166d33e029 100644 --- a/lisp/emacs-lisp/memory-report.el +++ b/lisp/emacs-lisp/memory-report.el @@ -29,7 +29,7 @@ (require 'seq) (require 'subr-x) -(eval-when-compile (require 'cl-lib)) +(require 'cl-lib) (defvar memory-report--type-size (make-hash-table)) @@ -243,6 +243,19 @@ by counted more than once." value) total)) +;; All cl-defstruct types. +(cl-defmethod memory-report--object-size-1 (counted (value cl-structure-object)) + (let ((struct-type (type-of value))) + (apply #'+ + (memory-report--size 'vector) + (mapcar (lambda (slot) + (if (eq (car slot) 'cl-tag-slot) + 0 + (memory-report--object-size + counted + (cl-struct-slot-value struct-type (car slot) value)))) + (cl-struct-slot-info struct-type))))) + (defun memory-report--format (bytes) (setq bytes (/ bytes 1024.0)) (let ((units '("KiB" "MiB" "GiB" "TiB"))) diff --git a/test/lisp/emacs-lisp/memory-report-tests.el b/test/lisp/emacs-lisp/memory-report-tests.el index 0c0297b5fce..e352dd165f3 100644 --- a/test/lisp/emacs-lisp/memory-report-tests.el +++ b/test/lisp/emacs-lisp/memory-report-tests.el @@ -68,6 +68,14 @@ (vector string string)) 124)))) +(ert-deftest memory-report-sizes-structs () + (cl-defstruct memory-report-test-struct + (item0 nil) + (item1 nil)) + (let ((s (make-memory-report-test-struct :item0 "hello" :item1 "world"))) + (should (= (memory-report-object-size s) + 90)))) + (provide 'memory-report-tests) ;;; memory-report-tests.el ends here -- cgit v1.2.3 From e498e5be207ce53028af3f820c123def6f6968a8 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Tue, 5 Oct 2021 08:40:52 +0200 Subject: Make `memory-report-object-size' work standalone * lisp/emacs-lisp/memory-report.el (memory-report--type-size): Default to nil so that the test in `memory-report-object-size' works. (memory-report--set-size): Initialize memory-report-object-size. --- lisp/emacs-lisp/memory-report.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lisp/emacs-lisp/memory-report.el') diff --git a/lisp/emacs-lisp/memory-report.el b/lisp/emacs-lisp/memory-report.el index 3166d33e029..cda2dee6cbc 100644 --- a/lisp/emacs-lisp/memory-report.el +++ b/lisp/emacs-lisp/memory-report.el @@ -31,7 +31,7 @@ (require 'subr-x) (require 'cl-lib) -(defvar memory-report--type-size (make-hash-table)) +(defvar memory-report--type-size nil) ;;;###autoload (defun memory-report () @@ -84,6 +84,7 @@ by counted more than once." (gethash 'object memory-report--type-size))) (defun memory-report--set-size (elems) + (setq memory-report--type-size (make-hash-table)) (setf (gethash 'string memory-report--type-size) (cadr (assq 'strings elems))) (setf (gethash 'cons memory-report--type-size) -- cgit v1.2.3 From 1c3e45396e07b6ec7246c2d5763c187092a55264 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 4 Nov 2021 18:14:23 +0100 Subject: Rename button-buttonize to buttonize * lisp/help.el (help--describe-command): * lisp/emacs-lisp/memory-report.el (memory-report--buffers): * lisp/button.el (button-buttonize): * doc/lispref/display.texi (Making Buttons): Rename button-buttonize to just buttonize and adjust callers. --- doc/lispref/display.texi | 2 +- lisp/button.el | 4 +++- lisp/emacs-lisp/memory-report.el | 2 +- lisp/help.el | 5 ++--- 4 files changed, 7 insertions(+), 6 deletions(-) (limited to 'lisp/emacs-lisp/memory-report.el') diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index f88f65f0dc0..aacbcaf6c3b 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -7067,7 +7067,7 @@ This inserts a button with the label @var{label} at point, using text properties. @end defun -@defun button-buttonize string callback &optional data +@defun buttonize string callback &optional data Sometimes it's more convenient to make a string into a button without inserting it into a buffer immediately, for instance when creating data structures that may then, later, be inserted into a buffer. This diff --git a/lisp/button.el b/lisp/button.el index acf76464332..b790104e966 100644 --- a/lisp/button.el +++ b/lisp/button.el @@ -616,7 +616,9 @@ button at point is the button to describe." (button--describe props) t))) -(defun button-buttonize (string callback &optional data) +(define-obsolete-function-alias 'button-buttonize #'buttonize "29.1") + +(defun buttonize (string callback &optional data) "Make STRING into a button and return it. When clicked, CALLBACK will be called with the DATA as the function argument. If DATA isn't present (or is nil), the button diff --git a/lisp/emacs-lisp/memory-report.el b/lisp/emacs-lisp/memory-report.el index cda2dee6cbc..450cdaa7a84 100644 --- a/lisp/emacs-lisp/memory-report.el +++ b/lisp/emacs-lisp/memory-report.el @@ -283,7 +283,7 @@ by counted more than once." buffers) do (insert (memory-report--format size) " " - (button-buttonize + (buttonize (buffer-name buffer) #'memory-report--buffer-details buffer) "\n")) diff --git a/lisp/help.el b/lisp/help.el index f6041c21c35..d10ea1c2867 100644 --- a/lisp/help.el +++ b/lisp/help.el @@ -1339,12 +1339,11 @@ Return nil if the key sequence is too long." ((keymapp definition) (insert "Prefix Command\n")) ((byte-code-function-p definition) - (insert "[%s]\n" - (button-buttonize "byte-code" #'disassemble definition))) + (insert "[%s]\n" (buttonize "byte-code" #'disassemble definition))) ((and (consp definition) (memq (car definition) '(closure lambda))) (insert (format "[%s]\n" - (button-buttonize + (buttonize (symbol-name (car definition)) (lambda (_) (pp-display-expression -- cgit v1.2.3