]> git.eshelyaron.com Git - emacs.git/commitdiff
Short-circuit substitutions for some simple types.
authorKen Raeburn <raeburn@raeburn.org>
Thu, 27 Oct 2016 06:53:07 +0000 (02:53 -0400)
committerKen Raeburn <raeburn@raeburn.org>
Thu, 22 Jun 2017 02:34:32 +0000 (22:34 -0400)
Values that don't contain other values cannot be circular, so checking
for circular objects is a waste of cycles.

* src/lread.c (substitute_object_recurse): If the subtree being
examined is a symbol, number, or property-less string, just return
it.

src/lread.c

index f8493982c67d03b0167abf6ddd48ac29287dfdd2..263638651db8b27098533b0a22fbde6bbf4084ae 100644 (file)
@@ -3414,6 +3414,13 @@ substitute_object_recurse (Lisp_Object object, Lisp_Object placeholder, Lisp_Obj
   if (EQ (placeholder, subtree))
     return object;
 
+  /* For common object types that can't contain other objects, don't
+     bother looking them up; we're done.  */
+  if (SYMBOLP (subtree)
+      || (STRINGP (subtree) && !string_intervals (subtree))
+      || NUMBERP (subtree))
+    return subtree;
+
   /* If we've been to this node before, don't explore it again.  */
   if (!EQ (Qnil, Fmemq (subtree, seen_list)))
     return subtree;