emacs-diffs
[Top][All Lists]
Advanced

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

master ce1de3a8d9 03/14: Inline setcar and setcdr in byte-code interpret


From: Mattias Engdegård
Subject: master ce1de3a8d9 03/14: Inline setcar and setcdr in byte-code interpreter
Date: Mon, 24 Jan 2022 05:42:36 -0500 (EST)

branch: master
commit ce1de3a8d9723305f48fd4527fbceaff3cec50ba
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Inline setcar and setcdr in byte-code interpreter
    
    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 | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/bytecode.c b/src/bytecode.c
index c5c86ba8f0..37da0858ab 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -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;
          }
 



reply via email to

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