On Mar 27, 2013, at 15:06 , Jeff Walden wrote: > Everyone talks about how discussions on IRC are opaque unless you're there > for them, but nobody ever does anything about it. :-) Given Till and I just > had a spectacularly successful (in my super-humble opinion) discussion of > self-hosting ideas (some short-term fixing/slight hacks, some longer-term), > it seemed like a good idea to record it in less ephemeral form than just > squirreled away in IRC channel logs. So here it is. Context is mostly: > > Bug 851763 - Significant increase in minimum runtime size with large > self-hosted objects > https://bugzilla.mozilla.org/show_bug.cgi?id=851763 > > which is most particularly motivated by Intl code having mega-huge i18n > read-only data tables that are semi-pointlessly cloned amongst compartments. > But I feel like we went rather beyond it by the end, and into making the > self-hosting setup not be so ad-hoc as it is now. Some good fodder for > short-term fixing, some more mid-termish ideas. > > Jeff > > P.S. -- Thanks to everyone else in channel for saying about ten other lines > throughout the entire discussion, so I didn't have to do too much work > disentangling this discussion from others occurring at the time. ;-) > > ===== > > [2013-03-27 14:14:31] <till> Waldo: ping > [2013-03-27 14:14:41] <Waldo> till: pong > [2013-03-27 14:14:53] <till> Waldo: regarding bug 851763 > [2013-03-27 14:15:07] <till> Waldo: I see only two options, really > [2013-03-27 14:15:52] <till> 1. do shallow cloning and use a custom resolver > to lazily clone referenced members > [2013-03-27 14:16:14] <till> 2. somehow enable sharing objects across > compartments > [2013-03-27 14:16:39] <till> 2 would obviously be much more desirable, but > I'm not sure we can implement it > [2013-03-27 14:17:28] <Waldo> some of the self-hosted data we care about > sharing > [2013-03-27 14:17:32] <Waldo> some of it we don't > [2013-03-27 14:17:35] <till> Do you think there's any chance we might be able > to move deeply-frozen object trees into shared read-only memory or something > like that > [2013-03-27 14:17:42] <till> sure > [2013-03-27 14:18:40] <Waldo> what can we think of that would allow data to > only optionally be shared, somehow > [2013-03-27 14:18:45] <Waldo> s/$/?/ > [2013-03-27 14:19:03] <till> Object.freeze? > [2013-03-27 14:19:28] <Waldo> I'm not sure the right thing to do is think > about language-level primitives here > [2013-03-27 14:19:46] <till> probably true, yes > [2013-03-27 14:20:03] <Waldo> rather about intrinsics and such that could be > written to use any internal mechanism we want, maybe > [2013-03-27 14:20:19] <till> I'm trying to come up with something that'd be > applicable beyond self-hosting, but yeah: much harder > [2013-03-27 14:21:05] <Waldo> I think we restrict specifically to > self-hosting for now, and if something comes up we can expand however > [2013-03-27 14:21:46] <till> so maybe we could mark shareable objects as such > and construct special CCWs that allow access to those from all compartments? > [2013-03-27 14:22:28] <Waldo> that seems maybe possible -- something > wrapperish > [2013-03-27 14:22:45] <Waldo> and then the clone system would recognize that > and produce a cross-compartment wrapper or such > [2013-03-27 14:22:54] <till> yeah, that's what I mean > [2013-03-27 14:23:04] <Waldo> there is a question of perf, to be sure -- as > bz_away loves to remind me, proxies are bad for perf > [2013-03-27 14:23:28] <Waldo> that said, for this big data stuff, it's > unclear how much we'd actually be querying it > [2013-03-27 14:23:39] <Waldo> and we could maybe minimize the time it takes > to perform those queries somehow > [2013-03-27 14:24:11] <till> for the Intl stuff, it probably doesn't matter > at all. But yeah: for other things performance might be an issue > [2013-03-27 14:24:17] <Waldo> and maybe we'd just mark *helper methods* as > safe for sharing, ish > [2013-03-27 14:24:44] <till> Waldo: ah, you mean we don't ever access the > data itself from a client compartment? > [2013-03-27 14:25:06] <Waldo> till: possibly > [2013-03-27 14:25:16] <till> makes sense > [2013-03-27 14:25:27] <till> I should talk to bholley, I guess? > [2013-03-27 14:26:09] <Waldo> till: I'm not sure we need to rope him in, > actually -- this seems all reusing existing JS engine concepts to me > [2013-03-27 14:27:37] <till> Waldo: mmh, now that I think about it, I realize > that Gecko or the JS engine has something like that. Using > Components.utils.Sandbox, one can create a new global that can seamlessly > access objects from other globals with the same principal. > [2013-03-27 14:28:14] <till> Doing whatever that does with the correct > principals configuration should do what we need, I guess > [2013-03-27 14:29:20] <Waldo> var intlFunctions = (function() { var > sharedIntlData = { big table }; function intlIntrinsicOne() { stuff } > function intlIntrinsicTwo() { stuff } return { intlIntrinsicOne: > markAsSingleton(intlIntrinsicOne), intlIntrinsicTwo: > markAsSingleton(intlIntrinsicTwo) }; }; })(); > Object.keys(intlFunctions).map(function(key) { global[key] = > intlFunctions[key]; }); > [2013-03-27 14:29:34] <Waldo> till: ^ is very vaguely what I had in mind > [2013-03-27 14:29:51] <Waldo> till: with markAsSingleton doing something to > indicate a wrapper should be created > [2013-03-27 14:30:03] <till> Waldo: let me quickly pretty print that ;) > [2013-03-27 14:30:12] <Waldo> word :-) > [2013-03-27 14:30:29] <Waldo> also correct any thinkos I may have made ;-) > [2013-03-27 14:33:22] <Waldo> till: now you have me thinking a little > [2013-03-27 14:33:32] <till> Waldo: why not just mark the functions we don't > want cloned with markAsSingleton, without the entire intlFunctions and > Object.keys thing? > [2013-03-27 14:33:47] <Waldo> till: what if we made self-hosted code more > pythonic, almost, and had it declare its exports somehow? > [2013-03-27 14:33:57] <till> ah > [2013-03-27 14:34:15] <till> so only exports get cloned, the rest stays in > the self-hosting compartment? > [2013-03-27 14:34:15] <Waldo> till: and then only the contents of EXPORTS, > say, were actually not wrapped, or something? > [2013-03-27 14:34:24] <till> I like it! > [2013-03-27 14:34:25] <Waldo> yes, something like that > [2013-03-27 14:34:38] <Waldo> there's a question how much extra work this > creates, timing-wise > [2013-03-27 14:34:47] <till> yeah > [2013-03-27 14:34:58] <Waldo> but that aside, this seems like an actual clean > idea > [2013-03-27 14:35:20] <Waldo> s/actually not wrapped/actually not cloned/ > [2013-03-27 14:36:16] <till> Now you broke it > [2013-03-27 14:36:41] <till> EXPORTS should be cloned, not not cloned, no? > [2013-03-27 14:36:47] <till> Anyway > [2013-03-27 14:37:13] <till> Here's another approach, which is a refinement > of something I had in mind for a while > [2013-03-27 14:37:42] <Waldo> er > [2013-03-27 14:37:57] <Waldo> yeah, you're right, actually not wrapped was > correct :-) > [2013-03-27 14:38:05] <till> :) > [2013-03-27 14:38:40] <till> How about we initialize all builtins in the > self-hosting global, as we do now, then, during interpretation of the > self-hosting script itself, install the self-hosted methods on those > builtins, and then use those objects as, well, prototypes we clone into all > other compartments upon creation? > [2013-03-27 14:38:51] <Waldo> the right terminology for the splitting is > cloning versus wrapping -- if I keep that in mind firmly I won't get confused > [2013-03-27 14:40:05] <till> Crucially, we'd only clone those methods > installed on builtins, no others > [2013-03-27 14:40:13] <Waldo> that could be interesting as well > [2013-03-27 14:40:36] * Waldo tries to think about how to break that, or > something > [2013-03-27 14:41:15] <till> It might be desirable to explicitly clone some > helper functions that should deal with per-compartment data. Seems doable, > though.
That would cover functions such as getInternals, InitializeCollator, InitializeNumberFormat, InitializeDateTimeFormat in Intl.js, I assume. What happens when these then call other functions that haven't been cloned? > [2013-03-27 14:43:05] <Waldo> you'd definitely have some ordering issues as > regards cloning Function/Object as one coherent whole, before anything else > [2013-03-27 14:43:25] <Waldo> perhaps those two, at least the initial steps, > should remain primordial, and implemented in C++ as now > [2013-03-27 14:44:48] <Waldo> there's also the issue of setting all the > original [[Prototype]] objects in the new global/compartment, so that things > like [] always work right > [2013-03-27 14:45:10] <till> true, yeah > [2013-03-27 14:45:11] <Waldo> but that seems like just a hurdle to leap, not > a fundamental issue > [2013-03-27 14:45:43] <till> V8 has a neat thing that's somewhat related > [2013-03-27 14:46:01] <Waldo> you've been stealing concepts from them? > [2013-03-27 14:46:03] <Waldo> good man > [2013-03-27 14:46:15] <till> :D > [2013-03-27 14:46:27] <Waldo> WARNING: Great Artists at work > [2013-03-27 14:47:07] <till> They somehow serialize an entire global after > first creating it and then, instead of initializing new globals, they just > deserialize the stored one and fix up some addresses. > [2013-03-27 14:47:29] <Waldo> ah, yes, that -- saw that in d8 commandline > options sometime > [2013-03-27 14:48:18] <till> Seems like it'd be nice to have. Both for the > self-hosting that might not need its initialization to run at each startup, > anymore, and for all globals, in general. > [2013-03-27 14:49:06] <Waldo> chunk'o'work, but something that may be doable > without too much grunge > [2013-03-27 14:49:49] <till> That's my impression, too > [2013-03-27 14:50:33] <till> My impression is not, however, that we can > realistically get any of these ideas working - and proven to be safe - in > time for FF22. > [2013-03-27 14:51:40] <Waldo> till: I think we could get the > markAsSingleton-implies-wrap-not-clone bit working pretty quickly > [2013-03-27 14:52:00] <Waldo> till: the rest of the ideas seem a bit beyond > that, of course -- but not all ridiculously so > [2013-03-27 14:52:28] <till> Waldo: ok, that's certainly the easiest one. > I'll dig into it and see how far I get. > [2013-03-27 14:52:40] <Waldo> excellent > [2013-03-27 14:53:17] <Waldo> for the first time I feel like our self-hosting > stuff is progressing beyond expedient pile'o'hacks and into clean-design > territory :-D > _______________________________________________ > dev-tech-js-engine-internals mailing list > [email protected] > https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals _______________________________________________ dev-tech-js-engine-internals mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

