emacs-diffs
[Top][All Lists]
Advanced

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

master 11e1abd5cc 10/14: Open-code aref and aset in bytecode interpreter


From: Mattias Engdegård
Subject: master 11e1abd5cc 10/14: Open-code aref and aset in bytecode interpreter
Date: Mon, 24 Jan 2022 05:42:37 -0500 (EST)

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

    Open-code aref and aset in bytecode interpreter
    
    * src/bytecode.c (exec_byte_code): Inline aref and aset for
    vectors and records, since this is important for code that makes heavy
    use of arrays and/or objects.
---
 src/bytecode.c | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/src/bytecode.c b/src/bytecode.c
index b2e8f4a916..76ef2fb661 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -948,15 +948,39 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, 
Lisp_Object maxdepth,
 
        CASE (Baref):
          {
-           Lisp_Object v1 = POP;
-           TOP = Faref (TOP, v1);
+           Lisp_Object idxval = POP;
+           Lisp_Object arrayval = TOP;
+           ptrdiff_t size;
+           ptrdiff_t idx;
+           if (((VECTORP (arrayval) && (size = ASIZE (arrayval), true))
+                || (RECORDP (arrayval) && (size = PVSIZE (arrayval), true)))
+               && FIXNUMP (idxval)
+               && (idx = XFIXNUM (idxval),
+                   idx >= 0 && idx < size))
+             TOP = AREF (arrayval, idx);
+           else
+             TOP = Faref (arrayval, idxval);
            NEXT;
          }
 
        CASE (Baset):
          {
-           Lisp_Object v2 = POP, v1 = POP;
-           TOP = Faset (TOP, v1, v2);
+           Lisp_Object newelt = POP;
+           Lisp_Object idxval = POP;
+           Lisp_Object arrayval = TOP;
+           ptrdiff_t size;
+           ptrdiff_t idx;
+           if (((VECTORP (arrayval) && (size = ASIZE (arrayval), true))
+                || (RECORDP (arrayval) && (size = PVSIZE (arrayval), true)))
+               && FIXNUMP (idxval)
+               && (idx = XFIXNUM (idxval),
+                   idx >= 0 && idx < size))
+             {
+               ASET (arrayval, idx, newelt);
+               TOP = newelt;
+             }
+           else
+             TOP = Faset (arrayval, idxval, newelt);
            NEXT;
          }
 



reply via email to

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