diff options
| author | Stefan Monnier | 2008-05-06 20:11:13 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2008-05-06 20:11:13 +0000 |
| commit | 7a3d90dc245c540145b50fadc6d5cb18df095a09 (patch) | |
| tree | 99e6dc2efeacdad0fa3018ef1455604016bec9f0 /src | |
| parent | ee5d572fa1207a9f57a59705a597765b9bbb3ff4 (diff) | |
| download | emacs-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/ChangeLog | 4 | ||||
| -rw-r--r-- | src/lread.c | 56 |
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 @@ | |||
| 1 | 2008-05-06 Stefan Monnier <monnier@iro.umontreal.ca> | 1 | 2008-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 | ||
| 3073 | static Lisp_Object | 3073 | static Lisp_Object |
| 3074 | substitute_object_recurse (object, placeholder, subtree) | 3074 | substitute_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 | ||