aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStefan Monnier2008-05-06 20:11:13 +0000
committerStefan Monnier2008-05-06 20:11:13 +0000
commit7a3d90dc245c540145b50fadc6d5cb18df095a09 (patch)
tree99e6dc2efeacdad0fa3018ef1455604016bec9f0 /src
parentee5d572fa1207a9f57a59705a597765b9bbb3ff4 (diff)
downloademacs-7a3d90dc245c540145b50fadc6d5cb18df095a09.tar.gz
emacs-7a3d90dc245c540145b50fadc6d5cb18df095a09.zip
(substitute_object_recurse): Use lower-level primitives.
Don't signal errors when traversing sub-char-tables. Don't loop over all the possible characters when traversing char-tables.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog4
-rw-r--r--src/lread.c56
2 files changed, 37 insertions, 23 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index a7b19f3dfc9..3f31a8ad2f6 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,9 @@
12008-05-06 Stefan Monnier <monnier@iro.umontreal.ca> 12008-05-06 Stefan Monnier <monnier@iro.umontreal.ca>
2 2
3 * lread.c (substitute_object_recurse): Use lower-level primitives.
4 Don't signal errors when traversing sub-char-tables.
5 Don't loop over all the possible characters when traversing char-tables.
6
3 * print.c (print_preprocess): Add sub-char-tables to the print-table, 7 * print.c (print_preprocess): Add sub-char-tables to the print-table,
4 just like we do in print.c. 8 just like we do in print.c.
5 9
diff --git a/src/lread.c b/src/lread.c
index 77c7a3c875f..1daf991719a 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -3057,18 +3057,18 @@ substitute_object_in_subtree (object, placeholder)
3057} 3057}
3058 3058
3059/* Feval doesn't get called from here, so no gc protection is needed. */ 3059/* Feval doesn't get called from here, so no gc protection is needed. */
3060#define SUBSTITUTE(get_val, set_val) \ 3060#define SUBSTITUTE(get_val, set_val) \
3061{ \ 3061 do { \
3062 Lisp_Object old_value = get_val; \ 3062 Lisp_Object old_value = get_val; \
3063 Lisp_Object true_value \ 3063 Lisp_Object true_value \
3064 = substitute_object_recurse (object, placeholder,\ 3064 = substitute_object_recurse (object, placeholder, \
3065 old_value); \ 3065 old_value); \
3066 \ 3066 \
3067 if (!EQ (old_value, true_value)) \ 3067 if (!EQ (old_value, true_value)) \
3068 { \ 3068 { \
3069 set_val; \ 3069 set_val; \
3070 } \ 3070 } \
3071} 3071 } while (0)
3072 3072
3073static Lisp_Object 3073static Lisp_Object
3074substitute_object_recurse (object, placeholder, subtree) 3074substitute_object_recurse (object, placeholder, subtree)
@@ -3097,23 +3097,33 @@ substitute_object_recurse (object, placeholder, subtree)
3097 { 3097 {
3098 case Lisp_Vectorlike: 3098 case Lisp_Vectorlike:
3099 { 3099 {
3100 int i; 3100 int i, length = 0;
3101 int length = XINT (Flength(subtree)); 3101 if (BOOL_VECTOR_P (subtree))
3102 return subtree; /* No sub-objects anyway. */
3103 else if (CHAR_TABLE_P (subtree) || SUB_CHAR_TABLE_P (subtree)
3104 || COMPILEDP (subtree))
3105 length = ASIZE (subtree) & PSEUDOVECTOR_SIZE_MASK;
3106 else if (VECTORP (subtree))
3107 length = ASIZE (subtree);
3108 else
3109 /* An unknown pseudovector may contain non-Lisp fields, so we
3110 can't just blindly traverse all its fields. We used to call
3111 `Flength' which signalled `sequencep', so I just preserved this
3112 behavior. */
3113 wrong_type_argument (Qsequencep, subtree);
3114
3102 for (i = 0; i < length; i++) 3115 for (i = 0; i < length; i++)
3103 { 3116 SUBSTITUTE (AREF (subtree, i),
3104 Lisp_Object idx = make_number (i); 3117 ASET (subtree, i, true_value));
3105 SUBSTITUTE (Faref (subtree, idx),
3106 Faset (subtree, idx, true_value));
3107 }
3108 return subtree; 3118 return subtree;
3109 } 3119 }
3110 3120
3111 case Lisp_Cons: 3121 case Lisp_Cons:
3112 { 3122 {
3113 SUBSTITUTE (Fcar_safe (subtree), 3123 SUBSTITUTE (XCAR (subtree),
3114 Fsetcar (subtree, true_value)); 3124 XSETCAR (subtree, true_value));
3115 SUBSTITUTE (Fcdr_safe (subtree), 3125 SUBSTITUTE (XCDR (subtree),
3116 Fsetcdr (subtree, true_value)); 3126 XSETCDR (subtree, true_value));
3117 return subtree; 3127 return subtree;
3118 } 3128 }
3119 3129