]> git.eshelyaron.com Git - emacs.git/commitdiff
; bindat (strz): Consistent length type check, take two
authorRichard Hansen <rhansen@rhansen.org>
Sun, 29 May 2022 03:53:51 +0000 (23:53 -0400)
committerLars Ingebrigtsen <larsi@gnus.org>
Fri, 10 Jun 2022 09:53:30 +0000 (11:53 +0200)
Commit 30ec4a7347b2944818c6fc469ae871374ce7caa4 is incorrect -- the
length computation logic uses a simple nilness test, not `numberp'.
The `numberp' case is just an optimization if `len' is a literal
number; it does not affect the behavior.

Revert that commit, add some comments to help future readers avoid the
same mistake, and update the pack logic to use the same optimization
as the length computation for consistency.

lisp/emacs-lisp/bindat.el

index 0725b677cffc8c5c0dfcf36930cf557149ce5d44..760c86feb411e868607d7517db74c360462b26a9 100644 (file)
@@ -688,18 +688,23 @@ is the name of a variable that will hold the value we need to pack.")
     ('unpack `(bindat--unpack-strz ,len))
     (`(length ,val)
      `(cl-incf bindat-idx ,(cond
+                            ;; Optimizations if len is a literal number or nil.
                             ((null len) `(1+ (length ,val)))
                             ((numberp len) len)
+                            ;; General expression support.
                             (t `(or ,len (1+ (length ,val)))))))
     (`(pack . ,args)
-     (macroexp-let2 nil len len
-       `(if (numberp ,len)
-            ;; Same as non-zero terminated strings since we don't actually add
-            ;; the terminating zero anyway (because we rely on the fact that
-            ;; `bindat-raw' was presumably initialized with all-zeroes before
-            ;; we started).
-            (bindat--pack-str ,len . ,args)
-          (bindat--pack-strz . ,args))))))
+     ;; When len is specified, behave the same as the str type since we don't
+     ;; actually add the terminating zero anyway (because we rely on the fact
+     ;; that `bindat-raw' was presumably initialized with all-zeroes before we
+     ;; started).
+     (cond ; Same optimizations as 'length above.
+      ((null len) `(bindat--pack-strz . ,args))
+      ((numberp len) `(bindat--pack-str ,len . ,args))
+      (t (macroexp-let2 nil len len
+           `(if ,len
+                (bindat--pack-str ,len . ,args)
+              (bindat--pack-strz . ,args))))))))
 
 (cl-defmethod bindat--type (op (_ (eql 'bits))  len)
   (bindat--pcase op