[webkit-dev] JavaScript bindings changed to call scriptExecutionContext virtual function?

Maciej Stachowiak mjs at apple.com
Sun Aug 2 08:44:44 PDT 2009


On Aug 2, 2009, at 2:44 AM, Adam Barth wrote:

> On Sun, Aug 2, 2009 at 2:09 AM, Darin Adler<darin at apple.com> wrote:
>> On Aug 2, 2009, at 2:05 AM, Adam Barth wrote:
>>
>>> In any case:
>>>
>>>    https://bugs.webkit.org/show_bug.cgi?id=27931
>>>
>>> I'll have a patch shortly. Please let me know if there are other  
>>> call
>>> sites you'd like changed.
>>
>> Thanks! Once you pointed out this was not due to a recent change, I  
>> had
>> resolved to fix it myself, but I’m glad you’re going to tackle it.
>>
>> Generally speaking no call site that has a Node* should call
>> scriptExecutionContext(). So rather than listing the call sites I  
>> want
>> changed, I’d instead suggest that we make  
>> Node::scriptExecutionContext()
>> private and then make sure no Node member functions or members  
>> functions of
>> friend classes call the function.
>
> I tried this, and it looks like there are a bunch of instances in the
> generated bindings that weren't found by cscope.  Basically, this line
> of CodeGeneartorJS needs to know whether impl is a subclass of Node*:
>
> push(@implContent, "    JSDOMGlobalObject* globalObject =
> toJSDOMGlobalObject(imp->scriptExecutionContext());\n");
>
> It's a bit too late at night for me to wrap my mind around the code
> generator, but that's a clear next step.

I think the code generator doesn't try to track the whole class  
hierarchy. Probably a simpler way to achieve the goal here would be  
with overloaded inline functions, so the C++ type system can do the  
work:

inline ScriptExecutionContext* scriptExecutionContext(EventTarget* et)
{
     return et->scriptExecutionContext();
}

inline Document* scriptExecutionContext(Node* n)
{
     return n->document();
}

Alternately, EventTarget could have an inline nonvirtual member  
function that calls the virtual member function, and Node could  
override it with one that calls document().

Regards,
Maciej




More information about the webkit-dev mailing list