From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 5956C201A7; Sun, 21 May 2017 04:38:48 +0000 (UTC) Date: Sun, 21 May 2017 04:38:48 +0000 From: Eric Wong To: Pat Allan Cc: clogger-public@bogomips.org Subject: Re: [PATCH] Update respond_to? calls for second argument. Message-ID: <20170521043848.GA25750@starla> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: List-Id: Pat Allan wrote: > Rack (since v2) has started explicitly listing the second > (optional) argument for respond_to?, which matches the > underlying Ruby spec. This patch fixes the calls in both C and > Ruby approaches. Thanks for noticing this! > However, rb_respond_to only accepts a single argument - > differing from the Ruby side of things - so perhaps this patch > isn't quite perfect (and my C skills are very limited, so the > whole thing could use a review). No worries. I think the following should work: -----8<------ Subject: [PATCH] SQUASH/WIP - use rb_funcallv to handle second respond_to arg While we're at it, avoid mixing declarations and code in case there's still compiler compatibility problems. (We will add a check for -Wdeclaration-after-statement support in a separate commit) --- Also pushed to the respond_to-priv branch at git://bogomips.org/clogger commit 7b3ed7c0bed876efe5298232a49f8542b8b340a0 Do you think you can write a test? No obligation, I can take care of it, too. Thanks again! ext/clogger_ext/clogger.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/ext/clogger_ext/clogger.c b/ext/clogger_ext/clogger.c index 622c98c..daed91a 100644 --- a/ext/clogger_ext/clogger.c +++ b/ext/clogger_ext/clogger.c @@ -965,16 +965,19 @@ static VALUE clogger_init_copy(VALUE clone, VALUE orig) */ static VALUE respond_to(int argc, VALUE *argv, VALUE self) { - VALUE method, include_all; - rb_scan_args(argc, argv, "11", &method, &include_all); - if (NIL_P(include_all)) include_all = Qfalse; - struct clogger *c = clogger_get(self); - ID id = rb_to_id(method); + VALUE method, include_all; + ID id; + rb_scan_args(argc, argv, "11", &method, &include_all); + id = rb_to_id(method); if (close_id == id) return Qtrue; - return rb_respond_to(c->body, id); + + if (argc == 1) + return rb_respond_to(c->body, id); + + return rb_funcallv(c->body, respond_to_id, argc, argv); } /* -- EW