One alternative to using Callee for functions you created yourself is specifying the data parameter which is passed via FunctionCallbackInfo::Data
Data could be an External that points to a data structure holding a weak Global pointing back at the function. Would that work for you? On Fri, Dec 11, 2015, 8:41 AM Toon Verwaest <[email protected]> wrote: > The difference is that FunctionTemplates are (supposedly) unique for the > entire isolate, whereas JSFunctions are instantiated per native context. So > if you use multiple realms (iframes in a browser setting), you'd be getting > multiple Callees (jsfunction) for the same callback (FunctionTemplate). > > Preallocating all of those is expensive memory-wise and in terms of > context-initialization. Getting to all-can-read accessors (jsfunction from > the accessing context rather than the installed accessor) is either > expensive performance-wise while accessing; or makes the memory and > initialization issues even worse. > > My thinking now is that we could hide the cost inside of info.Callee(), by > instantiating the FunctionTemplate in the current (accessing) context if > the value passed in was null or some other sentinel. That makes it slightly > more expensive for regular templates (the null check), and quite a bit more > for lazy instantiated templates that access Callee. The latter should just > not be used in that scenario... > > On Thu, Dec 10, 2015, 23:25 Alex Kodat <[email protected]> wrote: > >> That makes great sense to me and would be much appreciated. Though I'll >> admit I don't really understand what it means to call a FunctionTemplate. I >> guess for C++ code there really isn't any containing JS scope so the >> distinction between Function and FunctionTemplate is kinda (largely?) >> meaningless? >> >> >> On Thursday, December 10, 2015 at 1:25:38 PM UTC-8, Toon Verwaest wrote: >> >>> The reasoning behind this change is that in the future we'll have >>> FunctionTemplates that can be called through accessors without even >>> allocating the JSFunction. Registering the last called value isn't possible >>> in that case... >>> >>> Perhaps rather than fully getting rid of the parameter we should change >>> the API to pass undefined if there is no closure. In that case the >>> FunctionTemplate would need to be instantiated manually through the API to >>> get to the callee. >>> >>> Wdyt Enrico? >>> Toon >>> >>> On Thu, Dec 10, 2015, 20:59 Alex Kodat <[email protected]> wrote: >>> >> Sorry if this would have been more appropriate on v8-dev but just >>>> downloaded the latest and greatest 4.9 commit and discovered that Callee is >>>> no longer available in FunctionCallBackInfo. While I'm sure there was a >>>> good reason for this, my sample size of one embedder registers one "ouch". >>>> Dunno if this affects any other embedders but I guess this is a head's up >>>> in case anyone wants to check. >>>> >>>> I currently use Callee as a convenience when passing around >>>> FunctionCallBackInfo: for adding the function name to a Throw or as >>>> debugging information it's very convenient. Callee is also very useful in >>>> the common pattern of allowing a constructor to be called without a New and >>>> invoking it as a constructor under the covers: >>>> args.Callee()->NewInstance(argc, argsForConstructor). >>>> >>>> The former use is easy to work around but painful as I now need to add >>>> an extra parameter to a ton of internal C++ methods. The latter is more >>>> challenging as I now need to add a persistent reference to all my C++ >>>> constructors. >>>> >>>> I guess I'll just suck it up but if this affects anyone else one way to >>>> help people deal with this would be to keep a weak reference in the Isolate >>>> to last C++ function called that's made available via something like >>>> isolate->LastCallee(). I'd be happy to submit a project to add such a call >>>> (obviously on purely selfish grounds) but I suspect it would be >>>> (justifiably) rejected if I'm the world's only user of Callee. >>>> >>>> So are there any others out there? >>>> >>>> Thanks >>>> >>>> -- >>>> -- >>>> v8-users mailing list >>>> >>> [email protected] >>> >>> >>>> http://groups.google.com/group/v8-users >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "v8-users" group. >>>> >>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>> >>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >> -- >> v8-users mailing list >> [email protected] >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > -- > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to the Google Groups > "v8-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
