]> git.eshelyaron.com Git - emacs.git/commitdiff
Inline setcar and setcdr in byte-code interpreter
authorMattias Engdegård <mattiase@acm.org>
Fri, 31 Dec 2021 15:47:56 +0000 (16:47 +0100)
committerMattias Engdegård <mattiase@acm.org>
Mon, 24 Jan 2022 10:41:46 +0000 (11:41 +0100)
The function call overhead is nontrivial in comparison to the actual
code which makes this worthwhile.

* src/bytecode.c (exec_byte_code):
Inline code from Fsetcar and Fsetcdr.

src/bytecode.c

index c5c86ba8f05111cc448bf2d773fb81ab30f0b34f..37da0858ab4fd621b3a31d54cfb883b573c989df 100644 (file)
@@ -26,6 +26,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include "keyboard.h"
 #include "syntax.h"
 #include "window.h"
+#include "puresize.h"
 
 /* Work around GCC bug 54561.  */
 #if GNUC_PREREQ (4, 3, 0)
@@ -1409,15 +1410,23 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
 
        CASE (Bsetcar):
          {
-           Lisp_Object v1 = POP;
-           TOP = Fsetcar (TOP, v1);
+           Lisp_Object newval = POP;
+           Lisp_Object cell = TOP;
+           CHECK_CONS (cell);
+           CHECK_IMPURE (cell, XCONS (cell));
+           XSETCAR (cell, newval);
+           TOP = newval;
            NEXT;
          }
 
        CASE (Bsetcdr):
          {
-           Lisp_Object v1 = POP;
-           TOP = Fsetcdr (TOP, v1);
+           Lisp_Object newval = POP;
+           Lisp_Object cell = TOP;
+           CHECK_CONS (cell);
+           CHECK_IMPURE (cell, XCONS (cell));
+           XSETCDR (cell, newval);
+           TOP = newval;
            NEXT;
          }