On Thu, Nov 1, 2012 at 4:10 PM, Maciej Stachowiak <[email protected]> wrote:
> On Nov 1, 2012, at 6:36 PM, Adam Barth <[email protected]> wrote:
>> We currently use two different approaches for associating JavaScript
>> wrappers with DOM objects.  For some objects, we store the wrapper
>> inline in the object itself by making object inherit from
>> ScriptWrappable.  For other types of objects, we use a HashMap to
>> translate the object into a JavaScript wrapper.
>>
>> Whether to use ScriptWrappable or a HashMap is a trade-off that
>> depends on the workload.  For DOM objects that rarely have a
>> JavaScript wrapper, using a HashMap is more memory efficient because
>> we don't need to store a large number of null pointers in objects that
>> do not have wrappers.  By contrast, if an object almost always has a
>> JavaScript wrapper, using ScriptWrappable is both faster (because we
>> avoid the hash table lookup) and uses less memory (because we don't
>> need to store both the key and the value in the HashMap---we just need
>> to store the value in the object itself).
>>
>> Today, we use ScriptWrappable for Nodes only, but we would benefit by
>> making more use of ScriptWrappable, particularly for DOM objects that
>> almost always have JavaScript wrappers.  For example, XMLHttpRequest
>> objects exist only when created by script, which means that every
>> XMLHttpRequest object has a JavaScript wrapper.
>>
>> My plan is to introduce an interface-level IDL attribute named
>> something like [OftenHasJSWrapper] that informs the code generator
>> that the object inherits from ScriptWrappable and that we should make
>> use of the inline wrapper.  We can then deploy this attribute as
>> appropriate throughout WebCore to reduce memory usage and improve
>> performance.
>>
>> Please let me know if you have any feedback.
>
> Sounds like a good idea. Three additional thoughts:
>
> (1) It would be best to choose the objects to apply this to in some 
> data-driven way.
> (2) If we have an IDL attribute, I think it should be named by the effect it 
> has, not the possible conceptual-level reason for applying it. 
> [ScriptWrappable] or [InlineWrapper] or something. Because it's not a 
> judgment call, it is a statement about the code.
> (3) I suspect that we can handle this without adding an IDL attribute at all. 
> C++ overloaded functions could let the bindings do something different for 
> objects that inherit ScriptWrappable from ones that do not in a generic way, 
> without having to explicitly tell the bindings layer about the ways to do it. 
> Consider the ways unwrap() and toJS() are done. We don't have to say anything 
> special in the IDL or have any interface-specific knowledge in the bindings, 
> C++ overloading takes care of it.

That's a good idea.  I'll see if we can avoid the IDL attribute.

I wonder if we can do the same for the ActiveDOMObject IDL attribute,
which similarly announces the presence of a base class.

Adam
_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to