Bjoern Hoehrmann <[EMAIL PROTECTED]> writes: >* Tassilo von Parseval wrote: >>On Mon, Aug 23, 2004 at 08:14:45AM +0200 Bjoern Hoehrmann wrote: >> >>> Should my XS code check whether an object 'can' a specific method >>> before calling call_method() for a reason other than performance? It >>> seems that such a check is not commonly performed so it is probably >>> not very important. >> >>Depends. When writing pure Perl code, do you usually check that a method >>exists before you call it? I'd say no. However, sometimes you may want >>to do it. The same is true for XS. If it's crucial not to trigger a >>non-existent method, then do a preliminary check. > >Right, I looked at it in the context of optional event handlers where >it is common that specific methods do not exist. In Perl, if $o->x is >called even though there is no method x, Perl would die; so my question >is rather whether call_method for a non-existant method has negative >side-effects.
Calling the method and catching the die via call_method("Not_there",G_SCALARX|G_EVAL); is what I do in Tk. But Tk has the G_EVAL there anyway so that any die is reported in Tk context. > >>> What's the best way to check whether an object 'can' a specific >>> method? >> >>You can use 'gv_fetchmethod_autoload': >> >> /* assuming 'obj' holds the object reference */ >> HV *stash = HvSTASH((SV*)SvRV(obj)); >> >> if (!gv_fetchmethod_autoload(stash, "method", FALSE)) >> croak("'method' does not exist"); >> else >> /* call it */ >> >>If you want to allow 'method' to be autoloaded, set the third parameter >>to TRUE. > >Thanks!