Those would serve, certainly. But won't they vary from run to run for
reasons outside our control? I'd be a little more comfortable keeping the
id's deterministic, if it's not a big deal.



On Tue, Dec 13, 2016 at 8:58 AM, Nick Fitzgerald <nfitzger...@mozilla.com>
wrote:

> We already have IDs for GC things that are stable across moving GCs, but
> I'm not 100% sure they are exposed in JSAPI.
>
> Aha, looks like it is exposed:
> http://searchfox.org/mozilla-central/rev/594937fec2e2fc45fa9308ba2fb964
> 816631f017/js/public/RootingAPI.h#660
>
> On Mon, Dec 12, 2016 at 9:10 PM, Jim Blandy <jbla...@mozilla.com> wrote:
>
> > Honestly, I've never liked the devtools server's practice of using
> weakmaps
> > for every little thing. They're expensive, and the Debugger itself is
> > already using weakmaps internally for the association from real debuggee
> > things to their Debugger shadows, and guarantees distinct shadows for
> each
> > (debuggee thing, Debugger) pair, explicitly to help things work this way.
> >
> > So I'm in favor of putting the ids directly on the Debugger.Foo
> instances.
> > Death to weakmaps!
> >
> >
> > On Mon, Nov 21, 2016 at 1:24 AM, Eddy Bruel <ejpbr...@mozilla.com>
> wrote:
> >
> > > For the Servo debugger, we need some kind of IPC layer:
> > >
> > > The debugger server (i.e. the thing that talks the Chrome debugging
> > > protocol) needs to live in the same process (and perhaps even the same
> > > thread) as the constellation; it needs to work closely with the
> > > constellation to figure out which script threads exists, and to route
> > > messages to individual script threads.
> > >
> > > At the other end, the debugger API (i.e. the thing we use to examine
> the
> > > execution state of the JS engine) needs to live in the same thread as
> the
> > > one it is debugging (i.e. the script thread). In multiprocess mode,
> there
> > > will be a process boundary between the constellation and the script
> > > threads. Consequently, we need an IPC layer between the debugger server
> > and
> > > the debugger API in each script thread.
> > >
> > > Since the debugger API consists of a set of shadow objects (each of
> which
> > > represents som part of the execution state, such as stack frames,
> > > environments, scripts, etc), the obvious way to implement such an IPC
> > layer
> > > is as a set of proxies to each shadow object: to serialize a shadow
> > object
> > > over ipc, we assign it a unique ID. In the other direction, any message
> > > addressed to that id will be routed to the appropriate object.
> > >
> > > To route messages addressed to a specific id to the corresponding
> object,
> > > we need to maintain some for of id -> object map. Moreover, because the
> > > same shadow object can be obtained via different API calls, we need an
> > > object -> id map; this allows us to ensure that we never create more
> than
> > > one proxy for the same shadow object.
> > >
> > > Creating an object -> id map is problematic; since a *mut JSObject does
> > not
> > > have a stable address, it cannot be used as a key in a HashMap. The
> > obvious
> > > answer here is to use a WeakMap. WeakMaps are available in JSAPI, but
> as
> > > far as I can tell, not usable with the Rust bindings for JSAPI.
> > >
> > > Adding WeakMap support to the Rust bindings for JSAPI is probably
> > > non-trivial, so I'm looking for some kind of temporary workaround. The
> > > simplest option is perhaps to store the id directly on the JSObject.
> The
> > > Debugger API is designed so that defining arbitrary properties on
> shadow
> > > objects is well-defined. Since we control how these JSObjects are used
> > > (i.e. they are not exposed to arbitrary client JS), this should not
> lead
> > to
> > > conflicts.
> > >
> > > Another option is to create a WeakMap indirectly, by doing the
> equivalent
> > > of evaluating "new WeakMap()", storing the resulting JSObject, and then
> > > providing some strongly typed Rust API on top of it. Note that this is
> > very
> > > similar to what we do for the shadow objects in the debugger API.
> > >
> > > I am currently leaning towards the first option, but perhaps someone
> has
> > a
> > > better idea?
> > > _______________________________________________
> > > dev-servo mailing list
> > > dev-servo@lists.mozilla.org
> > > https://lists.mozilla.org/listinfo/dev-servo
> > >
> > _______________________________________________
> > dev-servo mailing list
> > dev-servo@lists.mozilla.org
> > https://lists.mozilla.org/listinfo/dev-servo
> >
> _______________________________________________
> dev-servo mailing list
> dev-servo@lists.mozilla.org
> https://lists.mozilla.org/listinfo/dev-servo
>
_______________________________________________
dev-servo mailing list
dev-servo@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-servo

Reply via email to