Commit 66fda794 authored by Daniel Colascione's avatar Daniel Colascione

Optimize cl-struct-slot-value; fix test

2014-04-22  Daniel Colascione  <dancol@dancol.org>

	* emacs-lisp/cl-macs.el
	(cl-struct-sequence-type,cl-struct-slot-info): Declare pure.
	(cl-struct-slot-value): Conditionally use aref or nth so that the
	compiler produces optimal code.

2014-04-22  Daniel Colascione  <dancol@dancol.org>

	* automated/cl-lib.el (cl-lib-struct-accessors): Fix test to
	account for removal of `cl-struct-set-slot-value'.
parent d6f14ca7
2014-04-22 Daniel Colascione <dancol@dancol.org>
* emacs-lisp/cl-macs.el
(cl-struct-sequence-type,cl-struct-slot-info): Declare pure.
(cl-struct-slot-value): Conditionally use aref or nth so that the
compiler produces optimal code.
2014-04-22 Stefan Monnier <monnier@iro.umontreal.ca>
* emacs-lisp/cl-macs.el (cl-struct-slot-offset): Mark as pure.
......
......@@ -2600,6 +2600,7 @@ STRUCT-TYPE is a symbol naming a struct type. Return 'vector or
'list, or nil if STRUCT-TYPE is not a struct type. "
(car (get struct-type 'cl-struct-type)))
(put 'cl-struct-sequence-type 'side-effect-free t)
(put 'cl-struct-sequence-type 'pure t)
(defun cl-struct-slot-info (struct-type)
"Return a list of slot names of struct STRUCT-TYPE.
......@@ -2609,6 +2610,7 @@ slot name symbol and OPTS is a list of slot options given to
slots skipped by :initial-offset may appear in the list."
(get struct-type 'cl-struct-slots))
(put 'cl-struct-slot-info 'side-effect-free t)
(put 'cl-struct-slot-info 'pure t)
(defun cl-struct-slot-offset (struct-type slot-name)
"Return the offset of slot SLOT-NAME in STRUCT-TYPE.
......@@ -2942,7 +2944,12 @@ The type name can then be used in `cl-typecase', `cl-check-type', etc."
STRUCT and SLOT-NAME are symbols. INST is a structure instance."
(unless (cl-typep inst struct-type)
(signal 'wrong-type-argument (list struct-type inst)))
(elt inst (cl-struct-slot-offset struct-type slot-name)))
;; We could use `elt', but since the byte compiler will resolve the
;; branch below at compile time, it's more efficient to use the
;; type-specific accessor.
(if (eq (cl-struct-sequence-type struct-type) 'vector)
(aref inst (cl-struct-slot-offset struct-type slot-name))
(nth (cl-struct-slot-offset struct-type slot-name) inst)))
(put 'cl-struct-slot-value 'side-effect-free t)
(run-hooks 'cl-macs-load-hook)
......
2014-04-22 Daniel Colascione <dancol@dancol.org>
* automated/cl-lib.el (cl-lib-struct-accessors): Fix test to
account for removal of `cl-struct-set-slot-value'.
2014-04-21 Daniel Colascione <dancol@dancol.org>
* automated/bytecomp-tests.el (test-byte-comp-compile-and-load):
......
......@@ -206,7 +206,7 @@
(let ((x (make-mystruct :abc 1 :def 2)))
(should (eql (cl-struct-slot-value 'mystruct 'abc x) 1))
(should (eql (cl-struct-slot-value 'mystruct 'def x) 2))
(cl-struct-set-slot-value 'mystruct 'def x -1)
(setf (cl-struct-slot-value 'mystruct 'def x) -1)
(should (eql (cl-struct-slot-value 'mystruct 'def x) -1))
(should (eql (cl-struct-slot-offset 'mystruct 'abc) 1))
(should-error (cl-struct-slot-offset 'mystruct 'marypoppins))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment