Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
4e2db1fe
Commit
4e2db1fe
authored
May 14, 2010
by
Stefan Monnier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* eval.c (specbind): Disallow let-binding frame-local vars.
Remove left-over duplicate test. Add comment.
parent
10dcc561
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
33 additions
and
11 deletions
+33
-11
etc/NEWS
etc/NEWS
+1
-0
src/ChangeLog
src/ChangeLog
+8
-3
src/eval.c
src/eval.c
+24
-8
No files found.
etc/NEWS
View file @
4e2db1fe
...
...
@@ -221,6 +221,7 @@ Secret Service API requires D-Bus for communication.
* Lisp changes in Emacs 24.1
** frame-local variables cannot be let-bound any more.
** prog-mode is a new major-mode meant to be the parent of programming mode.
** define-minor-mode accepts a new keyword :variable.
...
...
src/ChangeLog
View file @
4e2db1fe
2010-05-14 Stefan Monnier <monnier@iro.umontreal.ca>
* eval.c (specbind): Remove left-over duplicate test.
Disallow let-binding frame-local vars. Add comment.
2010-05-14 Eli Zaretskii <eliz@gnu.org>
Make the cache of bidi iterator states dynamically allocated.
...
...
@@ -5,7 +10,7 @@
(bidi_init_it): Call it.
(bidi_cache_iterator_state): Enlarge the cache if needed.
* bidi.c (bidi_move_to_visually_next): Rename
d
from
* bidi.c (bidi_move_to_visually_next): Rename from
bidi_get_next_char_visually. All callers changed.
2010-05-14 Kenichi Handa <handa@m17n.org>
...
...
@@ -18,8 +23,8 @@
Set CMP_IT->reversed_p.
(composition_update_it): Pay attention to CMP_IT->reversed_p.
* xdisp.c (set_iterator_to_next):
Call
composition_compute_stop_pos with negative ENDPOS if we are
* xdisp.c (set_iterator_to_next):
Call
composition_compute_stop_pos with negative ENDPOS if we are
scanning backward. Call composition_compute_stop_pos if scan
direction is changed.
(next_element_from_buffer): Call composition_compute_stop_pos with
...
...
src/eval.c
View file @
4e2db1fe
...
...
@@ -3308,6 +3308,21 @@ grow_specpdl ()
specpdl_ptr
=
specpdl
+
count
;
}
/* specpdl_ptr->symbol is a field which describes which variable is
let-bound, so it can be properly undone when we unbind_to.
It can have the following two shapes:
- SYMBOL : if it's a plain symbol, it means that we have let-bound
a symbol that is not buffer-local (at least at the time
the let binding started). Note also that it should not be
aliased (i.e. when let-binding V1 that's aliased to V2, we want
to record V2 here).
- (SYMBOL WHERE . BUFFER) : this means that it is a let-binding for
variable SYMBOL which can be buffer-local. WHERE tells us
which buffer is affected (or nil if the let-binding affects the
global value of the variable) and BUFFER tells us which buffer was
current (i.e. if WHERE is non-nil, then BUFFER==WHERE, otherwise
BUFFER did not yet have a buffer-local value). */
void
specbind
(
symbol
,
value
)
Lisp_Object
symbol
,
value
;
...
...
@@ -3339,7 +3354,10 @@ specbind (symbol, value)
set_internal
(
symbol
,
value
,
Qnil
,
1
);
break
;
}
case
SYMBOL_LOCALIZED
:
case
SYMBOL_FORWARDED
:
case
SYMBOL_LOCALIZED
:
if
(
SYMBOL_BLV
(
sym
)
->
frame_local
)
error
(
"Frame-local vars cannot be let-bound"
);
case
SYMBOL_FORWARDED
:
{
Lisp_Object
ovalue
=
find_symbol_value
(
symbol
);
specpdl_ptr
->
func
=
0
;
...
...
@@ -3376,6 +3394,7 @@ specbind (symbol, value)
/* FIXME: The third value `current_buffer' is only used in
let_shadows_buffer_binding_p which is itself only used
in set_internal for local_if_set. */
eassert
(
NILP
(
where
)
||
EQ
(
where
,
cur_buf
));
specpdl_ptr
->
symbol
=
Fcons
(
symbol
,
Fcons
(
where
,
cur_buf
));
/* If SYMBOL is a per-buffer variable which doesn't have a
...
...
@@ -3460,13 +3479,10 @@ unbind_to (count, value)
Fset_default
(
symbol
,
this_binding
.
old_value
);
/* If `where' is non-nil, reset the value in the appropriate
local binding, but only if that binding still exists. */
else
if
(
BUFFERP
(
where
))
{
if
(
BUFFERP
(
where
)
?
!
NILP
(
Flocal_variable_p
(
symbol
,
where
))
:
!
NILP
(
Fassq
(
symbol
,
XFRAME
(
where
)
->
param_alist
)))
set_internal
(
symbol
,
this_binding
.
old_value
,
where
,
1
);
}
else
if
(
BUFFERP
(
where
)
?
!
NILP
(
Flocal_variable_p
(
symbol
,
where
))
:
!
NILP
(
Fassq
(
symbol
,
XFRAME
(
where
)
->
param_alist
)))
set_internal
(
symbol
,
this_binding
.
old_value
,
where
,
1
);
}
/* If variable has a trivial value (no forwarding), we can
just set it. No need to check for constant symbols here,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment