summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-07 23:33:51 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-06-07 23:33:51 +0000
commit17920c7a9e41f8f89f6a413e42fadfa332b5665e (patch)
tree7454e3192fb9e01cf7b8887d462a05886d68c6f1 /eval.c
parentdb128e1b31f3c31e955a9063d027a97dcb938873 (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/trunk@8590 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/eval.c b/eval.c
index 5a5428613d..1bdb582017 100644
--- a/eval.c
+++ b/eval.c
@@ -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;