On Jun 8, 2011, at 11:48 AM, Peter Kasting wrote: > On Tue, Jun 7, 2011 at 11:18 PM, Maciej Stachowiak <[email protected]> wrote: > 1) We definitely have consensus to fix the broken non-logically-const > accessors by making them non-const; consensus on also adding const accessors > is less clear. > > There are a surprising number of places that actually do const traversals. > Simply making all these accessors non-const will require removing a lot of > valid const usage from the existing code. I'm really uncomfortable with that. > > 2) We like to do things incrementally and fixing bad use of const before > adding good use of const seems like this is a logical way to split the work > and make it less of a megapatch. > > Incremental fixes are absolutely the way to go. Reviewing megapatches sucks > and it's hard to catch subtle bugs like "you changed this function to be not > const, but there's no reason to do that". > > Perhaps a split that avoids removing existing, valid const usage would be to > first change few (or no) function signatures, and simply modify caller code > to be more consistent about type declarations. This would mean converting > some callers from "Node*" to "const Node*" when they're doing true const > traversals, and some the opposite direction when they're not. The goal would > be to make eventual API changes a no-op in terms of caller effect. It'd be > easy to make these sorts of patches arbitrarily small as well.
How about posting a reasonable-sized patch that handles a few related, representative methods so we can evaluate. > > (As a separate technical comment, I think it may be better to have the const > versions call non-const versions (casting away const on "this"), because the > non-const versions are likely to be called much more often so it's helpful to > have fewer levels of indirection to wade through before seeing the real code, > e.g. when inspecting code or debugging.) > > I totally agree that these sorts of indirections are suboptimal (especially > for common cases). > > The particular idea you propose isn't safe because there's no protection > against the non-const impl actually causing side effects. Even if current > implementations don't, it's easy to add a subtle bug like this in the future. > And while compilers won't enforce this perfectly, they'll do a better and > better job (better than nothing, for sure) as we change more APIs to enforce > logical constness. (I hate to keep referencing it, but the end of Effective > C++ Item 3 directly addresses this implementation idea in more detail. That > whole section is really worth reading for anyone deeply interested in this > issue.) If the best way to add const to the DOM is to add a level of indirection to all the non-const methods, then I'd probably think that is a reason to drop const entirely. But I'm not really convinced that casting away const from a return value is intrinsically safer than casting away const from "this". > > However, I think we should at least try to limit the number of accessor pairs > to only those cases which really need them. What about this plan: > > * I'll post a patch that just addresses the caller-side constness issues I've > found from my work so far. > * Then in my local checkout I'll start trying to see which accessor pairs I > can collapse back to one accessor, be it const or non-const. I'll post > patches to make any necessary caller-side changes here, too. > * Finally I'll post a patch to change method signatures and add accessor > pairs where necessary. > * Then rinse and repeat with another class, e.g. Element. > > I'll go ahead and file a bug and start posting real diffs to look at unless > this plan has fatal flaws. Hard to say without seeing the patches but I'd be glad to look at anything you post. - Maciej
_______________________________________________ webkit-dev mailing list [email protected] http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

