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

Kurt Hornik Kurt@Horn|k @end|ng |rom wu@@c@@t
Thu Aug 20 09:58:16 CEST 2020


>>>>> 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



More information about the R-devel mailing list