From: shugo@... Date: 2017-10-25T04:41:32+00:00 Subject: [ruby-core:83556] [Ruby trunk Bug#14051] net/imap issue on idle method with an empty block Issue #14051 has been updated by shugo (Shugo Maeda). simayosi (SHIMAYOSHI Takao) wrote: > Description > If Net::IMAP#idle method is called with empty block, all response handlers that have added beforehand are unintentionally removed before returning from the call. > > Sample Code > imap.add_response_handler do |resp| > if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" > imap.idle_done > end > end > imap.idle {} > # the response handler firstly added is unregistered here I couldn't reproduce the problem with the following code: ```ruby imap.add_response_handler do |resp| if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" imap.idle_done end end p imap.response_handlers #=> [#] imap.idle {} p imap.response_handlers #=> [#] ``` > Cause > @response_handlers.delete(nil) is executed in Net::IMAP#remove_response_handler called from the idle method. Even if the body of a block is empty, a block parameter cannot be nil. ```ruby def foo(&b) p b end foo {} #=> # ``` And even if no block is given, a LocalJumpError will be raised. ```ruby def idle(timeout = nil, &response_handler) raise LocalJumpError, "no block given" unless response_handler ``` ---------------------------------------- Bug #14051: net/imap issue on idle method with an empty block https://bugs.ruby-lang.org/issues/14051#change-67583 * Author: simayosi (SHIMAYOSHI Takao) * Status: Assigned * Priority: Normal * Assignee: shugo (Shugo Maeda) * Target version: * ruby -v: * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- Description If Net::IMAP#idle method is called with empty block, all response handlers that have added beforehand are unintentionally removed before returning from the call. Sample Code imap.add_response_handler do |resp| if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" imap.idle_done end end imap.idle {} # the response handler firstly added is unregistered here Cause @response_handlers.delete(nil) is executed in Net::IMAP#remove_response_handler called from the idle method. -- https://bugs.ruby-lang.org/ Unsubscribe: