I notice that this is a fairly common idiom in the WebKit JS bindings:<div><br></div><div>1) Storing away a pointer to the JSDOMGlobalObject in the constructor</div><div><br></div><div><div>JSOptionConstructor::JSOptionConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)</div>
<div>    : DOMObject(JSOptionConstructor::createStructure(exec-&gt;lexicalGlobalObject()-&gt;objectPrototype()))</div><div><b>    , m_globalObject(globalObject)</b></div><div>{</div><div><br></div><div>2) Manually marking that JSDOMGlobalObject as in-use:</div>
<div><br></div><div><div>void JSOptionConstructor::mark()</div><div>{</div><div>    DOMObject::mark();</div><div>    if (!m_globalObject-&gt;marked())</div><div>        m_globalObject-&gt;mark();</div><div>}</div><div><br>
</div><div>3) Using that stored-away JSDOMGlobalObject to get a reference to the parent ScriptExecutionContext/Document:</div><div><br></div><div><div>Document* JSOptionConstructor::document() const</div><div>{</div><div>
    return static_cast&lt;Document*&gt;(m_globalObject-&gt;scriptExecutionContext());</div><div>}</div><div>static JSObject* constructHTMLOptionElement(ExecState* exec, JSObject* constructor, const ArgList&amp; args)</div>
<div>{</div><div><b>    Document* document = static_cast&lt;JSOptionConstructor*&gt;(constructor)-&gt;document();</b></div><div><b><br></b></div><div><b><br></b></div></div></div><div><br></div><div>I&#39;m trying to understand why this is necessary - an alternative would be to just do the following, as JSWorkerConstructor does:</div>
<div><br></div><div><div>static JSObject* constructHTMLOptionElement(ExecState* exec, JSObject* constructor, const ArgList&amp; args)</div><div>{</div><div><b>    DOMWindow* window = asJSDOMWindow(exec-&gt;lexicalGlobalObject())-&gt;impl();</b></div>
<div><b>    Document* document = window-&gt;document();</b></div><div><b><br></b></div><div>This avoids having to keep around a reference, have a custom mark() function, etc. This also tightly ties a given constructor to a specific Document object - in this particular example, my javascript code could pass a reference to window.Option into a child iframe, but executing the constructor within that iframe would still reference the original Document object.</div>
<div><br></div><div>What&#39;s the motivation for storing away the original Document object in these constructors? I&#39;m writing a constructor for SharedWorker now and I&#39;m trying to figure out which is the correct behavior...</div>
<div><br></div><div>-atw</div></div></div>