From a607c82efe3be64a1822ca70ebdcb45cfd5000d2 Mon Sep 17 00:00:00 2001 From: matz Date: Thu, 30 Oct 2003 09:36:41 +0000 Subject: * io.c (READ_DATA_BUFFERED): new macro to detect whether stdio buffer filled. * io.c (rb_io_fptr_cleanup): move path deallocation to rb_io_fptr_finalize (finalizer called by GC). git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@4865 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 2252dee7c..d6978b057 100644 --- a/eval.c +++ b/eval.c @@ -2585,6 +2585,42 @@ rb_eval(self, n) } goto again; + case NODE_WHEN: + while (node) { + NODE *tag; + + if (nd_type(node) != NODE_WHEN) goto again; + tag = node->nd_head; + while (tag) { + if (trace_func) { + call_trace_func("line", tag, self, + ruby_frame->last_func, + ruby_frame->last_class); + } + if (tag->nd_head && nd_type(tag->nd_head) == NODE_WHEN) { + VALUE v = rb_eval(self, tag->nd_head->nd_head); + long i; + + if (TYPE(v) != T_ARRAY) v = rb_ary_to_ary(v); + for (i=0; ilen; i++) { + if (RTEST(RARRAY(v)->ptr[i])) { + node = node->nd_body; + goto again; + } + } + tag = tag->nd_next; + continue; + } + if (RTEST(rb_eval(self, tag->nd_head))) { + node = node->nd_body; + goto again; + } + tag = tag->nd_next; + } + node = node->nd_next; + } + RETURN(Qnil); + case NODE_CASE: { VALUE val; -- cgit