From: Dave Thomas Date: 2000-02-12T12:05:17-06:00 Subject: [ruby-talk:01318] Bug in Kernel.open (I think) matz: You recently changed Kernel.open so it would take a block in the pipe form. Unfortunately, I think now it _has_ to take a block: f = open("|-", "w+") if f == nil print "in Child\n" else print "Got: ", f.gets end Gives: -:1:in `open': yield called out of iterator (LocalJumpError) from -:1 I think the problem is in rb_f_open: port = pipe_open(RSTRING(pname)->ptr+1, mode); if (NIL_P(port)) { rb_yield(port); } else if (rb_iterator_p()) { return rb_ensure(rb_yield, port, rb_io_close, port); } I'm wondering if it should be: port = pipe_open(RSTRING(pname)->ptr+1, mode); if (!rb_iterator_p()) return port; if (NIL_P(port)) { rb_yield(port); } else { return rb_ensure(rb_yield, port, rb_io_close, port); } I'd submit a patch, but I'm not sure of the side effects of this. Regards Dave -- Thomas Consulting. Innovative and successful developments with Unix, Java, C, and C++. Now in bookstores: The Pragmatic Programmer. www.pragmaticprogrammer.com/ppbook/