mes: Fix assq to improve performance.
authorJan Nieuwenhuizen <janneke@gnu.org>
Tue, 12 Dec 2017 19:25:48 +0000 (20:25 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Tue, 12 Dec 2017 19:25:48 +0000 (20:25 +0100)
* src/mes.c (assq): Special case eq_p to improve performance.

src/mes.c

index 92f47124c81f5aeabdfcf323125fd5ea988300ad..f89490e7af1cab2dcf23bfb45bec8bd80227c40a 100644 (file)
--- a/src/mes.c
+++ b/src/mes.c
@@ -641,9 +641,24 @@ call (SCM fn, SCM x)
 SCM
 assq (SCM x, SCM a)
 {
-  //FIXME: move into fast-non eq_p-ing assq core:assq?
-  //while (a != cell_nil && x != CAAR (a)) a = CDR (a);
-  while (a != cell_nil && eq_p (x, CAAR (a)) == cell_f) a = CDR (a);
+  switch (TYPE (x))
+    {
+    case TCHAR:
+    case TNUMBER:
+      {
+        SCM v = VALUE (x);
+        while (a != cell_nil && v != VALUE (CAAR (a))) a = CDR (a); break;
+      }
+    case TKEYWORD:
+      {
+        SCM v = STRING (x);
+        while (a != cell_nil && v != STRING (CAAR (a))) a = CDR (a); break;
+      }
+    // case TSYMBOL:
+    // case TSPECIAL:
+    default:
+      while (a != cell_nil && x != CAAR (a)) a = CDR (a); break;
+    }
   return a != cell_nil ? CAR (a) : cell_f;
 }