]> git.eshelyaron.com Git - emacs.git/commitdiff
Open-code aref and aset in bytecode interpreter
authorMattias Engdegård <mattiase@acm.org>
Sun, 2 Jan 2022 11:19:54 +0000 (12:19 +0100)
committerMattias Engdegård <mattiase@acm.org>
Mon, 24 Jan 2022 10:41:47 +0000 (11:41 +0100)
* 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

index b2e8f4a9166de3353e56de60588bfe1929194e3a..76ef2fb661c837b5ddf0a476a4931f370c4d1d31 100644 (file)
@@ -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;
          }