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 | 7afd881933ca5eaedf470dee5c71ac882761069a (patch) | |
tree | 7454e3192fb9e01cf7b8887d462a05886d68c6f1 /eval.c | |
parent | 47f82d8db36673156252726f1ee4e6201017a432 (diff) | |
download | ruby-7afd881933ca5eaedf470dee5c71ac882761069a.tar.gz ruby-7afd881933ca5eaedf470dee5c71ac882761069a.tar.xz ruby-7afd881933ca5eaedf470dee5c71ac882761069a.zip |
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@8590 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -4719,6 +4719,14 @@ break_jump(retval) static VALUE bmcall _((VALUE, VALUE)); static int method_arity _((VALUE)); +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 */ @@ -4736,9 +4744,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; @@ -6078,8 +6084,9 @@ backtrace(lev) } } } - while (frame && (n = frame->node)) { + for (; frame && (n = frame->node); frame = frame->prev) { if (frame->prev && frame->prev->this_func) { + if (frame->prev->node == n) continue; snprintf(buf, BUFSIZ, "%s:%d:in `%s'", n->nd_file, nd_line(n), rb_id2name(frame->prev->this_func)); @@ -6088,7 +6095,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; |