emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 886f4207ab7: * src/lread.c (bytecode_from_rev_list): Re-group che


From: Stefan Monnier
Subject: master 886f4207ab7: * src/lread.c (bytecode_from_rev_list): Re-group checks
Date: Thu, 1 Feb 2024 11:07:05 -0500 (EST)

branch: master
commit 886f4207ab71b2a3367566d013cbcb27eec25639
Author: Stefan Monnier <monnier@iro.umontreal.ca>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * src/lread.c (bytecode_from_rev_list): Re-group checks
    
    Bring together all the conditions for well-formedness of the resulting
    bytecode object.
---
 src/lread.c | 52 +++++++++++++++++++++++++++-------------------------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/src/lread.c b/src/lread.c
index e77bfb8021d..a6bfdfcf626 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -3490,38 +3490,40 @@ bytecode_from_rev_list (Lisp_Object elems, Lisp_Object 
readcharfun)
   Lisp_Object *vec = XVECTOR (obj)->contents;
   ptrdiff_t size = ASIZE (obj);
 
+  if (!(size >= COMPILED_CONSTANTS))
+    {
+      /* Always read 'lazily-loaded' bytecode (generated by the
+         `byte-compile-dynamic' feature prior to Emacs 30) eagerly, to
+         avoid code in the fast path during execution.  */
+      if (CONSP (vec[COMPILED_BYTECODE])
+          && FIXNUMP (XCDR (vec[COMPILED_BYTECODE])))
+        vec[COMPILED_BYTECODE] = get_lazy_string (vec[COMPILED_BYTECODE]);
+
+      /* Lazily-loaded bytecode is represented by the constant slot being nil
+         and the bytecode slot a (lazily loaded) string containing the
+         print representation of (BYTECODE . CONSTANTS).  Unpack the
+         pieces by coerceing the string to unibyte and reading the result.  */
+      if (NILP (vec[COMPILED_CONSTANTS]) && STRINGP (vec[COMPILED_BYTECODE]))
+        {
+          Lisp_Object enc = vec[COMPILED_BYTECODE];
+          Lisp_Object pair = Fread (Fcons (enc, readcharfun));
+          if (!CONSP (pair))
+           invalid_syntax ("Invalid byte-code object", readcharfun);
+
+          vec[COMPILED_BYTECODE] = XCAR (pair);
+          vec[COMPILED_CONSTANTS] = XCDR (pair);
+        }
+    }
+
   if (!(size >= COMPILED_STACK_DEPTH + 1 && size <= COMPILED_INTERACTIVE + 1
        && (FIXNUMP (vec[COMPILED_ARGLIST])
            || CONSP (vec[COMPILED_ARGLIST])
            || NILP (vec[COMPILED_ARGLIST]))
+       && STRINGP (vec[COMPILED_BYTECODE])
+       && VECTORP (vec[COMPILED_CONSTANTS])
        && FIXNATP (vec[COMPILED_STACK_DEPTH])))
     invalid_syntax ("Invalid byte-code object", readcharfun);
 
-  /* Always read 'lazily-loaded' bytecode (generated by the
-     `byte-compile-dynamic' feature prior to Emacs 30) eagerly, to
-     avoid code in the fast path during execution.  */
-  if (CONSP (vec[COMPILED_BYTECODE]))
-    vec[COMPILED_BYTECODE] = get_lazy_string (vec[COMPILED_BYTECODE]);
-
-  /* Lazily-loaded bytecode is represented by the constant slot being nil
-     and the bytecode slot a (lazily loaded) string containing the
-     print representation of (BYTECODE . CONSTANTS).  Unpack the
-     pieces by coerceing the string to unibyte and reading the result.  */
-  if (NILP (vec[COMPILED_CONSTANTS]))
-    {
-      Lisp_Object enc = vec[COMPILED_BYTECODE];
-      Lisp_Object pair = Fread (Fcons (enc, readcharfun));
-      if (!CONSP (pair))
-       invalid_syntax ("Invalid byte-code object", readcharfun);
-
-      vec[COMPILED_BYTECODE] = XCAR (pair);
-      vec[COMPILED_CONSTANTS] = XCDR (pair);
-    }
-
-  if (!(STRINGP (vec[COMPILED_BYTECODE])
-       && VECTORP (vec[COMPILED_CONSTANTS])))
-    invalid_syntax ("Invalid byte-code object", readcharfun);
-
   if (STRING_MULTIBYTE (vec[COMPILED_BYTECODE]))
     /* BYTESTR must have been produced by Emacs 20.2 or earlier
        because it produced a raw 8-bit string for byte-code and



reply via email to

[Prev in Thread] Current Thread [Next in Thread]