diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-07 23:33:51 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-06-07 23:33:51 +0000 |
commit | aac8fbf09ff2bec1b2a0dfa0b484a422f7cf78da (patch) | |
tree | f741ef14908586e50ba0264d7dd2d373d8b53c2b /eval.c | |
parent | fb584cf3dc4b3542c68bc0789d958c106762ec22 (diff) |
* enum.c (enum_min_by, enum_max_by): return nil if no iteration.
fixed: [ruby-dev:26245]
* eval.c (rb_need_block): ensure a block is given.
* eval.c (backtrace): skip successive frames sharing same node.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8590 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -4674,6 +4674,14 @@ break_jump(retval) localjump_error("unexpected break", retval, TAG_BREAK); } +void +rb_need_block() +{ + if (!rb_block_given_p()) { + localjump_error("no block given", Qnil, 0); + } +} + static VALUE rb_yield_0(val, self, klass, flags, avalue) VALUE val, self, klass; /* OK */ @@ -4691,9 +4699,7 @@ rb_yield_0(val, self, klass, flags, avalue) int lambda = flags & YIELD_LAMBDA_CALL; int state; - if (!rb_block_given_p()) { - localjump_error("no block given", Qnil, 0); - } + rb_need_block(); PUSH_VARS(); block = ruby_block; @@ -6029,8 +6035,9 @@ backtrace(lev) } } } - while (frame && (n = frame->node)) { + for (; frame && (n = frame->node); frame = frame->prev) { if (frame->prev && frame->prev->last_func) { + if (frame->prev->node == n) continue; snprintf(buf, BUFSIZ, "%s:%d:in `%s'", n->nd_file, nd_line(n), rb_id2name(frame->prev->last_func)); @@ -6039,7 +6046,6 @@ backtrace(lev) snprintf(buf, BUFSIZ, "%s:%d", n->nd_file, nd_line(n)); } rb_ary_push(ary, rb_str_new2(buf)); - frame = frame->prev; } return ary; |