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 | 1a8ccefafc490875a90515907f05a565c4c8f7ba (patch) | |
tree | 68dd6036eca5931bd9c70030d9df7bfbe1a1c6cd /eval.c | |
parent | cf22db8d6910a428b2bb51b3c78c34b86d83bf74 (diff) |
* 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: svn+ssh://ci.ruby-lang.org/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; |