mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* eval.c (localjump_destination): lambda should not interfere
return from the yielded block. * hash.c (delete_if_i): use st_delete_safe() (via rb_hash_delete()) instead of returning ST_DELETE. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5842 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
52e0246b61
commit
aba4666e19
5 changed files with 30 additions and 15 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,8 @@
|
|||
Fri Feb 27 02:10:49 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* eval.c (localjump_destination): lambda should not interfere
|
||||
return from the yielded block.
|
||||
|
||||
Fri Feb 27 00:53:49 2004 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
|
||||
|
||||
* lib/drb/drb.rb, test/drb/drbtest.rb: require drb/eq.rb by default
|
||||
|
@ -7,6 +12,11 @@ Thu Feb 26 12:15:02 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|||
* win32/win32.c (make_cmdvector): adjust successive double-quote
|
||||
handling.
|
||||
|
||||
Thu Feb 26 09:42:56 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* hash.c (delete_if_i): use st_delete_safe() (via
|
||||
rb_hash_delete()) instead of returning ST_DELETE.
|
||||
|
||||
Thu Feb 26 02:35:10 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* process.c (rb_f_exec): get rid of SEGV when exec failed for command
|
||||
|
|
2
enum.c
2
enum.c
|
@ -661,7 +661,7 @@ min_ii(i, memo)
|
|||
*
|
||||
* a = %w(albatross dog horse)
|
||||
* a.min #=> "albatross"
|
||||
* a.max {|a,b| a.length <=> b.length } #=> "dog"
|
||||
* a.min {|a,b| a.length <=> b.length } #=> "dog"
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
|
|
14
eval.c
14
eval.c
|
@ -912,6 +912,7 @@ static struct tag *prot_tag;
|
|||
#define PROT_ITER INT2FIX(1) /* 3 */
|
||||
#define PROT_CALL INT2FIX(2) /* 5 */
|
||||
#define PROT_PCALL INT2FIX(3) /* 7 */
|
||||
#define PROT_YIELD INT2FIX(4) /* 9 */
|
||||
|
||||
#define EXEC_TAG() (FLUSH_REGISTER_WINDOWS, setjmp(prot_tag->buf))
|
||||
|
||||
|
@ -4514,10 +4515,15 @@ localjump_destination(state, retval)
|
|||
{
|
||||
struct tag *tt = prot_tag;
|
||||
VALUE tag = (state == TAG_BREAK) ? PROT_ITER : PROT_FUNC;
|
||||
int uniq = 0;
|
||||
|
||||
if (retval == Qundef) retval = Qnil;
|
||||
while (tt) {
|
||||
if (tt->tag == PROT_PCALL || (tt->tag == PROT_THREAD && state == TAG_BREAK) ||
|
||||
if (tt->tag == PROT_YIELD) {
|
||||
uniq = tt->frame->uniq;
|
||||
}
|
||||
if ((tt->tag == PROT_THREAD && state == TAG_BREAK) ||
|
||||
(tt->tag == PROT_PCALL && uniq == 0) ||
|
||||
(tt->tag == PROT_CALL || tt->tag == tag) && tt->frame->uniq == ruby_frame->uniq) {
|
||||
tt->dst = (VALUE)ruby_frame->uniq;
|
||||
tt->retval = retval;
|
||||
|
@ -4639,7 +4645,7 @@ rb_yield_0(val, self, klass, flags, avalue)
|
|||
ruby_current_node = node;
|
||||
|
||||
PUSH_ITER(block->iter);
|
||||
PUSH_TAG(PROT_NONE);
|
||||
PUSH_TAG(PROT_YIELD);
|
||||
if ((state = EXEC_TAG()) == 0) {
|
||||
redo:
|
||||
if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
|
||||
|
@ -7988,7 +7994,7 @@ proc_invoke(proc, args, self, klass)
|
|||
proc_set_safe_level(proc);
|
||||
result = rb_yield_0(args, self, (self!=Qundef)?CLASS_OF(self):0, pcall, avalue);
|
||||
}
|
||||
else if (pcall || orphan || TAG_DST()) {
|
||||
else if (TAG_DST()) {
|
||||
result = prot_tag->retval;
|
||||
}
|
||||
POP_TAG();
|
||||
|
@ -8008,7 +8014,6 @@ proc_invoke(proc, args, self, klass)
|
|||
/* fall through */
|
||||
case TAG_BREAK:
|
||||
case TAG_RETURN:
|
||||
if (pcall) break;
|
||||
if (orphan) { /* orphan block */
|
||||
char mesg[32];
|
||||
snprintf(mesg, sizeof mesg, "%s from proc-closure",
|
||||
|
@ -8016,6 +8021,7 @@ proc_invoke(proc, args, self, klass)
|
|||
localjump_error(mesg, result, state);
|
||||
}
|
||||
if (result != Qundef) {
|
||||
if (pcall) break;
|
||||
localjump_destination(state, result);
|
||||
}
|
||||
default:
|
||||
|
|
11
hash.c
11
hash.c
|
@ -679,12 +679,13 @@ rb_hash_shift(hash)
|
|||
}
|
||||
|
||||
static enum st_retval
|
||||
delete_if_i(key, value)
|
||||
VALUE key, value;
|
||||
delete_if_i(key, value, hash)
|
||||
VALUE key, value, hash;
|
||||
{
|
||||
if (key == Qundef) return ST_CONTINUE;
|
||||
if (RTEST(rb_yield_values(2, key, value)))
|
||||
return ST_DELETE;
|
||||
if (RTEST(rb_yield_values(2, key, value))) {
|
||||
rb_hash_delete(hash, key);
|
||||
}
|
||||
return ST_CONTINUE;
|
||||
}
|
||||
|
||||
|
@ -705,7 +706,7 @@ rb_hash_delete_if(hash)
|
|||
VALUE hash;
|
||||
{
|
||||
rb_hash_modify(hash);
|
||||
rb_hash_foreach(hash, delete_if_i, 0);
|
||||
rb_hash_foreach(hash, delete_if_i, hash);
|
||||
return hash;
|
||||
}
|
||||
|
||||
|
|
|
@ -683,11 +683,9 @@ The variable ruby-indent-level controls the amount of indentation.
|
|||
(setq end nil))
|
||||
(goto-char (or end pos))
|
||||
(skip-chars-backward " \t")
|
||||
(and
|
||||
(setq state (ruby-parse-region parse-start (point)))
|
||||
(nth 0 state)
|
||||
(setq begin (cdr (nth 1 state)))
|
||||
(goto-char pos)))
|
||||
(setq begin (or (nth 0 state) (cdr (nth 1 state))))
|
||||
(goto-char pos))
|
||||
(or (bobp) (forward-char -1))
|
||||
(and
|
||||
(or (and (looking-at ruby-symbol-re)
|
||||
|
|
Loading…
Add table
Reference in a new issue