[Rd] utils::isS3stdGeneric chokes on primitives and identity

Gabriel Becker g@bembecker @end|ng |rom gm@||@com
Sun Aug 30 22:27:18 CEST 2020


Submitted to bugzilla here:
https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17901

On Sat, Aug 29, 2020 at 1:57 PM Gabriel Becker <gabembecker using gmail.com>
wrote:

> Hi all,
>
> I have a patch that fixes this and also fixes/improves debugcall so that
> it supports pkg::fun(obj) and pkg:::fun(obj) style calls. I'm going to test
> it a bit more and add a regression test for isS3stdGeneric and then I will
> submit it to bugzilla tonight or tomorrow morning.
>
> Best,
> ~G
>
> On Thu, Aug 27, 2020 at 5:28 PM Gabriel Becker <gabembecker using gmail.com>
> wrote:
>
>> Trace adds something to the body of the function, so it does make sense
>> that it doesn't. Whether traced functions still technically meet the
>> definition of standard s3 generic or not is, I suppose, up for debate, but
>> I would say that they should, I think.
>>
>> As before, if desired I can work on a patch for this if desired, or
>> someone on R-core can just take care of it if that is easier.
>>
>> Best,
>> ~G
>>
>> On Thu, Aug 27, 2020 at 11:22 AM Antoine Fabri <antoine.fabri using gmail.com>
>> wrote:
>>
>>> Should it work on traced functions ?
>>>
>>> As it is now it doesn't.
>>>
>>> Best,
>>>
>>> Antoine
>>>
>>> Le jeu. 20 août 2020 à 09:58, Kurt Hornik <Kurt.Hornik using wu.ac.at> a
>>> écrit :
>>>
>>>> >>>>> Gabriel Becker writes:
>>>>
>>>> > I added that so I can look at the proposed fix and put it or something
>>>> > similar in bugzilla for review final review.
>>>>
>>>> > Apologies for the oversight.
>>>>
>>>> Fixed now with
>>>>
>>>> -    while(as.character(bdexpr[[1L]]) == "{")
>>>> +    while(is.call(bdexpr) && (as.character(bdexpr[[1L]]) == "{"))
>>>>
>>>> (the suggested fix does not work on things like
>>>> foo <- function(x) {{ x }}
>>>> ...)
>>>>
>>>> Best
>>>> -k
>>>>
>>>> > ~G
>>>>
>>>> > On Wed, Aug 19, 2020 at 3:40 PM Antoine Fabri <
>>>> antoine.fabri using gmail.com>
>>>> > wrote:
>>>>
>>>> >> Dear R-devel,
>>>> >>
>>>> >> utils::isS3stdGeneric tries to subset the body of the function it's
>>>> fed,
>>>> >> primitives don't like that because they don't have a body, identity
>>>> doesn't
>>>> >> like it either because it's body is a symbol.
>>>> >>
>>>> >> According to the doc, any function is a legal input.
>>>> >>
>>>> >> See below:
>>>> >>
>>>> >> identity
>>>> >> #> function (x)
>>>> >> #> x
>>>> >> #> <bytecode: 0x0000000013d6da28>
>>>> >> #> <environment: namespace:base>
>>>> >>
>>>> >> max
>>>> >> #> function (..., na.rm = FALSE)  .Primitive("max")
>>>> >>
>>>> >> isS3stdGeneric(identity)
>>>> >> #> Error in bdexpr[[1L]]: objet de type 'symbol' non indiçable
>>>> >>
>>>> >> isS3stdGeneric(max)
>>>> >> #> Error in while (as.character(bdexpr[[1L]]) == "{") bdexpr <-
>>>> >> bdexpr[[2L]]: l'argument est de longueur nulle
>>>> >>
>>>> >> Here is a simple fix :
>>>> >>
>>>> >> isS3stdGeneric <- function(f) {
>>>> >> {
>>>> >> bdexpr <- body(f)
>>>> >> if(is.null(bdexpr) || !is.call(bdexpr)) return(FALSE)
>>>> >> while (as.character(bdexpr[[1L]]) == "{") bdexpr <- bdexpr[[2L]]
>>>> >> ret <- is.call(bdexpr) && identical(bdexpr[[1L]], as.name
>>>> >> ("UseMethod"))
>>>> >> if (ret)
>>>> >> names(ret) <- bdexpr[[2L]]
>>>> >> ret
>>>> >> }
>>>> >> }
>>>> >>
>>>> >> isS3stdGeneric(identity)
>>>> >> #> [1] FALSE
>>>> >> isS3stdGeneric(max)
>>>> >> #> [1] FALSE
>>>> >>
>>>> >> Best,
>>>> >>
>>>> >> Antoine
>>>> >>
>>>> >> [[alternative HTML version deleted]]
>>>> >>
>>>> >> ______________________________________________
>>>> >> R-devel using r-project.org mailing list
>>>> >> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>> >>
>>>>
>>>> >       [[alternative HTML version deleted]]
>>>>
>>>> > ______________________________________________
>>>> > R-devel using r-project.org mailing list
>>>> > https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>
>>>

	[[alternative HTML version deleted]]



More information about the R-devel mailing list