diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-30 09:36:41 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-10-30 09:36:41 +0000 |
commit | a607c82efe3be64a1822ca70ebdcb45cfd5000d2 (patch) | |
tree | 68dd6036eca5931bd9c70030d9df7bfbe1a1c6cd /eval.c | |
parent | c1f9b6b5159d4c40031ed7d6d3dea4dc6deef5a5 (diff) | |
download | ruby-a607c82efe3be64a1822ca70ebdcb45cfd5000d2.tar.gz ruby-a607c82efe3be64a1822ca70ebdcb45cfd5000d2.tar.xz ruby-a607c82efe3be64a1822ca70ebdcb45cfd5000d2.zip |
* 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
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 36 |
1 files changed, 36 insertions, 0 deletions
@@ -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; i<RARRAY(v)->len; 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; |