Yang, I see. My intent had been to put a reference to the metadata object directly in the Script object so no weak map would be required -- the metadata would live as long as Script, Script would just have gotten a little bigger. But, since there's no compelling use case, it's all academic.
Thanks, Alex On Monday, February 22, 2021 at 7:16:23 AM UTC-6 Yang Guo wrote: > It is true that Scripts are already listed in the weak array list. > However, that's hidden in V8. So if we were to keep a weak list of scripts > to metadata mapping, that would work fine. If we did this on the embedder > side, then we'd need something else than script IDs as keys. > > Looking forward to your patch :) > > Yang > > On Mon, Feb 22, 2021 at 1:55 PM Alex Kodat <ako...@rocketsoftware.com> > wrote: > >> Yang, >> >> Thanks for your response. I've decided to bail out on the metadata part >> of my proposal for the very reason you indicated -- it's kind of a niche >> application and, in many ways, a time-based cache makes more sense for my >> application. I'll submit a CL soon to add GitScriptSource >> and GetScriptSourceMappingURL methods to StackFrame. These are very >> straightforward, require no data structure changes and expose nothing >> unless an embedder choses to do so. Hopefully this is OK. >> >> Not that its important but I'm a little puzzled by your comment about the >> weak map. Scripts are already managed via a WeakArrayList -- functionality >> that would be nice in JS but, of course, only usable because the iterator >> is able to block GC while it's alive and, of course, exposing something >> like that in JS would be a bad idea. >> >> Cheers, >> Alex >> >> On Monday, February 22, 2021 at 3:40:07 AM UTC-6 Yang Guo wrote: >> >>> To understand this a bit better, the reason a map from script to >>> metadata doesn't work for you, when implemented on the embedder side, is >>> that you can't have a weak map with script IDs as keys? >>> >>> I'm concerned that since this seems like a niche use case, adding >>> another field to Script objects is not a good idea. So we'd have to >>> implement that as a weak map inside of V8 either way. >>> >>> Cheers, >>> >>> Yang >>> >>> >>> >>> On Wed, Feb 17, 2021 at 5:52 PM Alex Kodat <ako...@rocketsoftware.com> >>> wrote: >>> >>>> Thanks Yang, >>>> >>>> FWIW, it appears that one can effectively disable the prepareStackTrace >>>> API by setting Error.stackTraceLimit to 0. Fortunately, this does not >>>> affect Exception::StackTrace. But you knew that. >>>> >>>> My impression of import.meta is that it's a way of the environment >>>> passing information into a module, presumably information about the module >>>> itself. >>>> >>>> My ScriptMetadata proposal is more about maintaining information about >>>> the script for use outside of the script though it could, in theory, be >>>> exposed inside a script if an embedder chooses to do so (doubt if we >>>> would). >>>> >>>> I guess one similarity to import.meta is the >>>> read-only/lazy-instantiation of ScriptMetadata so, like import.meta, if >>>> it's not used, there's no cost but once it's set, it can't be changed. >>>> Also >>>> ScriptMetadata and import.meta would have lifetimes that would tend to >>>> follow the lifetimes of the corresponding script or module which is why >>>> ScriptMetadata would be useful. >>>> >>>> On Wednesday, February 17, 2021 at 8:37:50 AM UTC-6 Yang Guo wrote: >>>> >>>>> Hi, >>>>> >>>>> I think the hurdle for a C++ API is a lot lower, and I can see the >>>>> usefulness of GetScriptSource as you suggest. >>>>> >>>>> I'm somewhat indifferent about a metadata object. Isn't that a bit >>>>> like import.meta for modules? >>>>> >>>>> Cheers, >>>>> >>>>> Yang >>>>> >>>>> >>>>> >>>>> On Wed, Feb 17, 2021 at 2:43 PM Alex Kodat <ako...@rocketsoftware.com> >>>>> wrote: >>>>> >>>>>> Thanks Yang, >>>>>> >>>>>> Got it on prepareStackTrace -- it's a funny and sketchy beast. >>>>>> getThis and getFunction are particularly beyond the pale in terms of >>>>>> encapsulation. In fact, it wouldn't hurt to have a flag to disable the >>>>>> API. >>>>>> >>>>>> In hindsight, the right solution is for me to use >>>>>> Exception::GetStackTrace and the StackFrame class. This does have the >>>>>> ScriptId. I guess I had it in my head that prepareStackTrace was the >>>>>> preferred API. Clearly not. ;-) >>>>>> >>>>>> So changing my proposal to adding a Local<Value> GetScriptSource to >>>>>> StackFrame. The idea is to prevent storage leaks by eliminating the need >>>>>> to >>>>>> manage script source external to the internal Script as it's very >>>>>> difficult >>>>>> to manage the lifetime of the source that way. By providing access to >>>>>> the >>>>>> source via the internal Script, the lifetime is nicely managed for us. >>>>>> This >>>>>> seems pretty safe from a security/encapsulation perspective as embedders >>>>>> can limit access to this information as they see fit. >>>>>> >>>>>> It would also be useful to have a Local<Object> GetScriptMetadata (or >>>>>> GetScriptMemo?) in StackFrame to allow memoization of the script data. >>>>>> The >>>>>> metadata object could be lazily instantiated and again, would reduce the >>>>>> risk of storage leaks as the lifetime of the ScriptMetadata would >>>>>> generally >>>>>> match the lifetime of the internal Script object. UnboundScript and >>>>>> maybe >>>>>> Module could also have a GetScriptMetadata to provide access to the same >>>>>> object. >>>>>> >>>>>> Might either of these be more palatable? >>>>>> >>>>>> On Wednesday, February 17, 2021 at 4:07:31 AM UTC-6 Yang Guo wrote: >>>>>> >>>>>>> Generally I would discourage adding more non-spec features to the >>>>>>> V8's JS implementation. In the long run, these non-spec features cause >>>>>>> compatibility problems, and often are a security nightmare. They also >>>>>>> add >>>>>>> unnecessary complexity to maintain. The reason we have not removed the >>>>>>> prepareStackTrace API is because it was introduced more than 10 years >>>>>>> ago, >>>>>>> and so much existing code already relies on it. We would not have >>>>>>> introduced it today. Providing this non-spec feature is already causing >>>>>>> unnecessary memory leaks in some cases, and exposing script source as >>>>>>> you >>>>>>> suggest is not going to improve that. >>>>>>> >>>>>>> I'm also skeptical about exposing the script ID. We only expose it >>>>>>> via Chrome DevTools protocol, which is orthogonal to the JS-accessible >>>>>>> stack trace API. >>>>>>> >>>>>>> +Shu-yu Guo to maybe provide another perspective. >>>>>>> >>>>>>> I'd encourage you to use the Chrome DevTools protocol to achieve >>>>>>> what you are trying to do. >>>>>>> >>>>>>> Cheers, >>>>>>> >>>>>>> Yang >>>>>>> >>>>>>> On Wed, Feb 17, 2021 at 5:42 AM Alex Kodat < >>>>>>> ako...@rocketsoftware.com> wrote: >>>>>>> >>>>>>>> In managing a menagerie of scripts from various sources, I've found >>>>>>>> it useful to enhance CallSite locally to have two additional functions >>>>>>>> getScriptId and getScriptSource. The former provides a unique >>>>>>>> identifier >>>>>>>> for the script that contains the code in the stack frame and the >>>>>>>> latter >>>>>>>> access to the script source so one can say extract a sourceMappingUrl >>>>>>>> or >>>>>>>> display more than one line around the point of error or show source >>>>>>>> lines >>>>>>>> in a stack trace or whatever. While it's possible to maintain a table >>>>>>>> of >>>>>>>> source ourselves (the scriptId would be helpful in managing such a >>>>>>>> table) >>>>>>>> there's no great way of managing the lifespan of entries in the table >>>>>>>> so it >>>>>>>> seems useful to be able to get access to the source via the Script >>>>>>>> object >>>>>>>> which manages the lifespan of the source nicely. >>>>>>>> >>>>>>>> It was pretty trivial to add these so it doesn't seem like there's >>>>>>>> a major downside, so does it seem reasonable to submit a CL for this? >>>>>>>> I'd >>>>>>>> offer to fix up the doc at https://v8.dev/docs/stack-trace-api if >>>>>>>> it does, but, of course, I don't have access. >>>>>>>> >>>>>>>> A bit more controversial, perhaps, would be that it seems it would >>>>>>>> be useful to add a lazily instantiated metadata object on (internal) >>>>>>>> Script >>>>>>>> objects. A CallSite could have a getScriptMetadata function to provide >>>>>>>> access to this object. Similarly, maybe a GetScriptMetadata method for >>>>>>>> the >>>>>>>> UnboundScript and maybe Module and Function classes would also provide >>>>>>>> access to the object. The first request for the ScriptMetadata could >>>>>>>> create >>>>>>>> an empty JS Object which could then be used by apps to store script >>>>>>>> metadata such as, for example, a dereferenced sourceMappingURL. Again, >>>>>>>> we >>>>>>>> could manage such metadata externally ourselves but it's a major pain >>>>>>>> managing the lifespan of such metadata, especially as there's no way >>>>>>>> of >>>>>>>> having a direct weak reference to the internal Script object -- the >>>>>>>> closest >>>>>>>> we can get is a weak reference to the UnboundScript which is a proxy >>>>>>>> for >>>>>>>> the SharedFunctionInfo which isn't quite right but might be workable. >>>>>>>> >>>>>>>> Does ScriptMetadata sound too crazy/special-purpose or should I try >>>>>>>> coding it up and submitting a CL and let the reviewers judge if the >>>>>>>> pain >>>>>>>> justifies the gain? >>>>>>>> >>>>>>>> Thanks >>>>>>>> >>>>>>>> -- >>>>>>>> -- >>>>>>>> v8-dev mailing list >>>>>>>> v8-...@googlegroups.com >>>>>>>> http://groups.google.com/group/v8-dev >>>>>>>> --- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "v8-dev" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to v8-dev+un...@googlegroups.com. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/v8-dev/46c81d5a-e18e-43fe-b1ae-80002cbd56d8n%40googlegroups.com >>>>>>>> >>>>>>>> <https://groups.google.com/d/msgid/v8-dev/46c81d5a-e18e-43fe-b1ae-80002cbd56d8n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>> -- >>>>>> -- >>>>>> v8-dev mailing list >>>>>> v8-...@googlegroups.com >>>>>> http://groups.google.com/group/v8-dev >>>>>> --- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "v8-dev" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to v8-dev+un...@googlegroups.com. >>>>>> >>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/v8-dev/2f6aaef5-4d2f-4c29-9df6-0ed133e0143fn%40googlegroups.com >>>>>> >>>>>> <https://groups.google.com/d/msgid/v8-dev/2f6aaef5-4d2f-4c29-9df6-0ed133e0143fn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>> -- >>>> -- >>>> v8-dev mailing list >>>> v8-...@googlegroups.com >>>> http://groups.google.com/group/v8-dev >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "v8-dev" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to v8-dev+un...@googlegroups.com. >>>> >>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/v8-dev/37509e39-de36-445a-8990-0eec38a9363cn%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/v8-dev/37509e39-de36-445a-8990-0eec38a9363cn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> -- >> v8-dev mailing list >> v8-...@googlegroups.com >> http://groups.google.com/group/v8-dev >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-dev" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to v8-dev+un...@googlegroups.com. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/v8-dev/8efe618c-26c0-4b08-ab3f-27dac6765209n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/v8-dev/8efe618c-26c0-4b08-ab3f-27dac6765209n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- -- v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev --- You received this message because you are subscribed to the Google Groups "v8-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-dev/379d49bb-0bdf-45c7-b846-9ec49b1b535cn%40googlegroups.com.