<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[20719] branches/js-collector-tweaks/WebCore</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/20719">20719</a></dd>
<dt>Author</dt> <dd>mjs</dd>
<dt>Date</dt> <dd>2007-04-05 03:08:55 -0700 (Thu, 05 Apr 2007)</dd>
</dl>
<h3>Log Message</h3>
<pre> Not reviewed - experimental work.
- move most of Window's data members into a separate private object, to avoid needing
to use the oversize allocator for it
It was the only remaining JSObject subclass to use the ocersize
allocator on 32-bit platforms, and having oversize objects around
makes garbage collection slower so this would hurt performance
with many tabs/windows open.
No significant effect on JS iBench.
* bindings/js/kjs_events.cpp:
(KJS::JSUnprotectedEventListener::JSUnprotectedEventListener):
(KJS::JSUnprotectedEventListener::~JSUnprotectedEventListener):
(KJS::JSEventListener::JSEventListener):
(KJS::JSEventListener::~JSEventListener):
(KJS::JSLazyEventListener::parseCode):
* bindings/js/kjs_window.cpp:
(KJS::WindowPrivate::WindowPrivate):
(KJS::Window::Window):
(KJS::Window::~Window):
(KJS::Window::location):
(KJS::Window::selection):
(KJS::Window::locationbar):
(KJS::Window::menubar):
(KJS::Window::personalbar):
(KJS::Window::statusbar):
(KJS::Window::toolbar):
(KJS::Window::scrollbars):
(KJS::Window::mark):
(KJS::Window::getValueProperty):
(KJS::Window::findJSEventListener):
(KJS::Window::findJSUnprotectedEventListener):
(KJS::Window::clearHelperObjectProperties):
(KJS::Window::clear):
(KJS::Window::setCurrentEvent):
(KJS::Window::setReturnValueSlot):
(KJS::Window::clearAllTimeouts):
(KJS::Window::installTimeout):
(KJS::Window::pauseTimeouts):
(KJS::Window::resumeTimeouts):
(KJS::Window::clearTimeout):
(KJS::Window::timerFired):
(KJS::Window::disconnectFrame):
(KJS::Window::jsEventListeners):
(KJS::Window::jsHTMLEventListeners):
(KJS::Window::jsUnprotectedEventListeners):
(KJS::Window::jsUnprotectedHTMLEventListeners):
* bindings/js/kjs_window.h:</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesjscollectortweaksWebCoreChangeLog">branches/js-collector-tweaks/WebCore/ChangeLog</a></li>
<li><a href="#branchesjscollectortweaksWebCorebindingsjskjs_eventscpp">branches/js-collector-tweaks/WebCore/bindings/js/kjs_events.cpp</a></li>
<li><a href="#branchesjscollectortweaksWebCorebindingsjskjs_windowcpp">branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.cpp</a></li>
<li><a href="#branchesjscollectortweaksWebCorebindingsjskjs_windowh">branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesjscollectortweaksWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/js-collector-tweaks/WebCore/ChangeLog (20718 => 20719)</h4>
<pre class="diff"><span>
<span class="info">--- branches/js-collector-tweaks/WebCore/ChangeLog        2007-04-05 10:03:02 UTC (rev 20718)
+++ branches/js-collector-tweaks/WebCore/ChangeLog        2007-04-05 10:08:55 UTC (rev 20719)
</span><span class="lines">@@ -1,3 +1,56 @@
</span><ins>+2007-04-05 Maciej Stachowiak <mjs@apple.com>
+
+ Not reviewed - experimental work.
+
+ - move most of Window's data members into a separate private object, to avoid needing
+ to use the oversize allocator for it
+
+ It was the only remaining JSObject subclass to use the ocersize
+ allocator on 32-bit platforms, and having oversize objects around
+ makes garbage collection slower so this would hurt performance
+ with many tabs/windows open.
+
+ No significant effect on JS iBench.
+
+ * bindings/js/kjs_events.cpp:
+ (KJS::JSUnprotectedEventListener::JSUnprotectedEventListener):
+ (KJS::JSUnprotectedEventListener::~JSUnprotectedEventListener):
+ (KJS::JSEventListener::JSEventListener):
+ (KJS::JSEventListener::~JSEventListener):
+ (KJS::JSLazyEventListener::parseCode):
+ * bindings/js/kjs_window.cpp:
+ (KJS::WindowPrivate::WindowPrivate):
+ (KJS::Window::Window):
+ (KJS::Window::~Window):
+ (KJS::Window::location):
+ (KJS::Window::selection):
+ (KJS::Window::locationbar):
+ (KJS::Window::menubar):
+ (KJS::Window::personalbar):
+ (KJS::Window::statusbar):
+ (KJS::Window::toolbar):
+ (KJS::Window::scrollbars):
+ (KJS::Window::mark):
+ (KJS::Window::getValueProperty):
+ (KJS::Window::findJSEventListener):
+ (KJS::Window::findJSUnprotectedEventListener):
+ (KJS::Window::clearHelperObjectProperties):
+ (KJS::Window::clear):
+ (KJS::Window::setCurrentEvent):
+ (KJS::Window::setReturnValueSlot):
+ (KJS::Window::clearAllTimeouts):
+ (KJS::Window::installTimeout):
+ (KJS::Window::pauseTimeouts):
+ (KJS::Window::resumeTimeouts):
+ (KJS::Window::clearTimeout):
+ (KJS::Window::timerFired):
+ (KJS::Window::disconnectFrame):
+ (KJS::Window::jsEventListeners):
+ (KJS::Window::jsHTMLEventListeners):
+ (KJS::Window::jsUnprotectedEventListeners):
+ (KJS::Window::jsUnprotectedHTMLEventListeners):
+ * bindings/js/kjs_window.h:
+
</ins><span class="cx"> 2007-04-04 Alexey Proskuryakov <ap@webkit.org>
</span><span class="cx">
</span><span class="cx"> Reviewed by Darin.
</span></span></pre></div>
<a id="branchesjscollectortweaksWebCorebindingsjskjs_eventscpp"></a>
<div class="modfile"><h4>Modified: branches/js-collector-tweaks/WebCore/bindings/js/kjs_events.cpp (20718 => 20719)</h4>
<pre class="diff"><span>
<span class="info">--- branches/js-collector-tweaks/WebCore/bindings/js/kjs_events.cpp        2007-04-05 10:03:02 UTC (rev 20718)
+++ branches/js-collector-tweaks/WebCore/bindings/js/kjs_events.cpp        2007-04-05 10:08:55 UTC (rev 20719)
</span><span class="lines">@@ -165,8 +165,8 @@
</span><span class="cx"> , win(_win)
</span><span class="cx"> {
</span><span class="cx"> if (_listener) {
</span><del>- Window::UnprotectedListenersMap& listeners = _html
- ? _win->jsUnprotectedHTMLEventListeners : _win->jsUnprotectedEventListeners;
</del><ins>+ Window::UnprotectedListenersMap& listeners = _html
+ ? _win->jsUnprotectedHTMLEventListeners() : _win->jsUnprotectedEventListeners();
</ins><span class="cx"> listeners.set(_listener, this);
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -175,7 +175,7 @@
</span><span class="cx"> {
</span><span class="cx"> if (listener && win) {
</span><span class="cx"> Window::UnprotectedListenersMap& listeners = isHTMLEventListener()
</span><del>- ? win->jsUnprotectedHTMLEventListeners : win->jsUnprotectedEventListeners;
</del><ins>+ ? win->jsUnprotectedHTMLEventListeners() : win->jsUnprotectedEventListeners();
</ins><span class="cx"> listeners.remove(listener);
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -228,7 +228,7 @@
</span><span class="cx"> {
</span><span class="cx"> if (_listener) {
</span><span class="cx"> Window::ListenersMap& listeners = _html
</span><del>- ? _win->jsHTMLEventListeners : _win->jsEventListeners;
</del><ins>+ ? _win->jsHTMLEventListeners() : _win->jsEventListeners();
</ins><span class="cx"> listeners.set(_listener, this);
</span><span class="cx"> }
</span><span class="cx"> #ifndef NDEBUG
</span><span class="lines">@@ -240,7 +240,7 @@
</span><span class="cx"> {
</span><span class="cx"> if (listener && win) {
</span><span class="cx"> Window::ListenersMap& listeners = isHTMLEventListener()
</span><del>- ? win->jsHTMLEventListeners : win->jsEventListeners;
</del><ins>+ ? win->jsHTMLEventListeners() : win->jsEventListeners();
</ins><span class="cx"> listeners.remove(listener);
</span><span class="cx"> }
</span><span class="cx"> #ifndef NDEBUG
</span><span class="lines">@@ -342,7 +342,7 @@
</span><span class="cx">
</span><span class="cx"> if (listener) {
</span><span class="cx"> Window::ListenersMap& listeners = isHTMLEventListener()
</span><del>- ? windowObj()->jsHTMLEventListeners : windowObj()->jsEventListeners;
</del><ins>+ ? windowObj()->jsHTMLEventListeners() : windowObj()->jsEventListeners();
</ins><span class="cx"> listeners.set(listener, const_cast<JSLazyEventListener*>(this));
</span><span class="cx"> }
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchesjscollectortweaksWebCorebindingsjskjs_windowcpp"></a>
<div class="modfile"><h4>Modified: branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.cpp (20718 => 20719)</h4>
<pre class="diff"><span>
<span class="info">--- branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.cpp        2007-04-05 10:03:02 UTC (rev 20718)
+++ branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.cpp        2007-04-05 10:08:55 UTC (rev 20719)
</span><span class="lines">@@ -79,6 +79,45 @@
</span><span class="cx"> const int cMaxTimerNestingLevel = 5;
</span><span class="cx"> const double cMinimumTimerInterval = 0.010;
</span><span class="cx">
</span><ins>+struct WindowPrivate {
+ WindowPrivate()
+ : screen(0)
+ , history(0)
+ , frames(0)
+ , loc(0)
+ , m_selection(0)
+ , m_locationbar(0)
+ , m_menubar(0)
+ , m_personalbar(0)
+ , m_scrollbars(0)
+ , m_statusbar(0)
+ , m_toolbar(0)
+ , m_evt(0)
+ , m_returnValueSlot(0)
+ {
+ }
+
+ Window::ListenersMap jsEventListeners;
+ Window::ListenersMap jsHTMLEventListeners;
+ Window::UnprotectedListenersMap jsUnprotectedEventListeners;
+ Window::UnprotectedListenersMap jsUnprotectedHTMLEventListeners;
+ mutable Screen* screen;
+ mutable History* history;
+ mutable FrameArray* frames;
+ mutable Location* loc;
+ mutable Selection* m_selection;
+ mutable BarInfo* m_locationbar;
+ mutable BarInfo* m_menubar;
+ mutable BarInfo* m_personalbar;
+ mutable BarInfo* m_scrollbars;
+ mutable BarInfo* m_statusbar;
+ mutable BarInfo* m_toolbar;
+ WebCore::Event *m_evt;
+ JSValue **m_returnValueSlot;
+ typedef HashMap<int, DOMWindowTimer*> TimeoutsMap;
+ TimeoutsMap m_timeouts;
+};
+
</ins><span class="cx"> class DOMWindowTimer : public TimerBase {
</span><span class="cx"> public:
</span><span class="cx"> DOMWindowTimer(int timeoutId, int nestingLevel, Window* o, ScheduledAction* a)
</span><span class="lines">@@ -331,19 +370,7 @@
</span><span class="cx">
</span><span class="cx"> Window::Window(DOMWindow* window)
</span><span class="cx"> : m_frame(window->frame())
</span><del>- , screen(0)
- , history(0)
- , frames(0)
- , loc(0)
- , m_selection(0)
- , m_locationbar(0)
- , m_menubar(0)
- , m_personalbar(0)
- , m_scrollbars(0)
- , m_statusbar(0)
- , m_toolbar(0)
- , m_evt(0)
- , m_returnValueSlot(0)
</del><ins>+ , d(new WindowPrivate)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -353,21 +380,21 @@
</span><span class="cx">
</span><span class="cx"> // Clear any backpointers to the window
</span><span class="cx">
</span><del>- ListenersMap::iterator i2 = jsEventListeners.begin();
- ListenersMap::iterator e2 = jsEventListeners.end();
</del><ins>+ ListenersMap::iterator i2 = d->jsEventListeners.begin();
+ ListenersMap::iterator e2 = d->jsEventListeners.end();
</ins><span class="cx"> for (; i2 != e2; ++i2)
</span><span class="cx"> i2->second->clearWindowObj();
</span><del>- i2 = jsHTMLEventListeners.begin();
- e2 = jsHTMLEventListeners.end();
</del><ins>+ i2 = d->jsHTMLEventListeners.begin();
+ e2 = d->jsHTMLEventListeners.end();
</ins><span class="cx"> for (; i2 != e2; ++i2)
</span><span class="cx"> i2->second->clearWindowObj();
</span><span class="cx">
</span><del>- UnprotectedListenersMap::iterator i1 = jsUnprotectedEventListeners.begin();
- UnprotectedListenersMap::iterator e1 = jsUnprotectedEventListeners.end();
</del><ins>+ UnprotectedListenersMap::iterator i1 = d->jsUnprotectedEventListeners.begin();
+ UnprotectedListenersMap::iterator e1 = d->jsUnprotectedEventListeners.end();
</ins><span class="cx"> for (; i1 != e1; ++i1)
</span><span class="cx"> i1->second->clearWindowObj();
</span><del>- i1 = jsUnprotectedHTMLEventListeners.begin();
- e1 = jsUnprotectedHTMLEventListeners.end();
</del><ins>+ i1 = d->jsUnprotectedHTMLEventListeners.begin();
+ e1 = d->jsUnprotectedHTMLEventListeners.end();
</ins><span class="cx"> for (; i1 != e1; ++i1)
</span><span class="cx"> i1->second->clearWindowObj();
</span><span class="cx"> }
</span><span class="lines">@@ -408,16 +435,16 @@
</span><span class="cx">
</span><span class="cx"> Location *Window::location() const
</span><span class="cx"> {
</span><del>- if (!loc)
- loc = new Location(m_frame);
- return loc;
</del><ins>+ if (!d->loc)
+ d->loc = new Location(m_frame);
+ return d->loc;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> Selection *Window::selection() const
</span><span class="cx"> {
</span><del>- if (!m_selection)
- m_selection = new Selection(m_frame);
- return m_selection;
</del><ins>+ if (!d->m_selection)
+ d->m_selection = new Selection(m_frame);
+ return d->m_selection;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> bool Window::find(const String& string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) const
</span><span class="lines">@@ -428,72 +455,72 @@
</span><span class="cx">
</span><span class="cx"> BarInfo *Window::locationbar(ExecState *exec) const
</span><span class="cx"> {
</span><del>- if (!m_locationbar)
- m_locationbar = new BarInfo(exec, m_frame, BarInfo::Locationbar);
- return m_locationbar;
</del><ins>+ if (!d->m_locationbar)
+ d->m_locationbar = new BarInfo(exec, m_frame, BarInfo::Locationbar);
+ return d->m_locationbar;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> BarInfo *Window::menubar(ExecState *exec) const
</span><span class="cx"> {
</span><del>- if (!m_menubar)
- m_menubar = new BarInfo(exec, m_frame, BarInfo::Menubar);
- return m_menubar;
</del><ins>+ if (!d->m_menubar)
+ d->m_menubar = new BarInfo(exec, m_frame, BarInfo::Menubar);
+ return d->m_menubar;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> BarInfo *Window::personalbar(ExecState *exec) const
</span><span class="cx"> {
</span><del>- if (!m_personalbar)
- m_personalbar = new BarInfo(exec, m_frame, BarInfo::Personalbar);
- return m_personalbar;
</del><ins>+ if (!d->m_personalbar)
+ d->m_personalbar = new BarInfo(exec, m_frame, BarInfo::Personalbar);
+ return d->m_personalbar;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> BarInfo *Window::statusbar(ExecState *exec) const
</span><span class="cx"> {
</span><del>- if (!m_statusbar)
- m_statusbar = new BarInfo(exec, m_frame, BarInfo::Statusbar);
- return m_statusbar;
</del><ins>+ if (!d->m_statusbar)
+ d->m_statusbar = new BarInfo(exec, m_frame, BarInfo::Statusbar);
+ return d->m_statusbar;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> BarInfo *Window::toolbar(ExecState *exec) const
</span><span class="cx"> {
</span><del>- if (!m_toolbar)
- m_toolbar = new BarInfo(exec, m_frame, BarInfo::Toolbar);
- return m_toolbar;
</del><ins>+ if (!d->m_toolbar)
+ d->m_toolbar = new BarInfo(exec, m_frame, BarInfo::Toolbar);
+ return d->m_toolbar;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> BarInfo *Window::scrollbars(ExecState *exec) const
</span><span class="cx"> {
</span><del>- if (!m_scrollbars)
- m_scrollbars = new BarInfo(exec, m_frame, BarInfo::Scrollbars);
- return m_scrollbars;
</del><ins>+ if (!d->m_scrollbars)
+ d->m_scrollbars = new BarInfo(exec, m_frame, BarInfo::Scrollbars);
+ return d->m_scrollbars;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // reference our special objects during garbage collection
</span><span class="cx"> void Window::mark()
</span><span class="cx"> {
</span><span class="cx"> JSObject::mark();
</span><del>- if (screen && !screen->marked())
- screen->mark();
- if (history && !history->marked())
- history->mark();
- if (frames && !frames->marked())
- frames->mark();
- if (loc && !loc->marked())
- loc->mark();
- if (m_selection && !m_selection->marked())
- m_selection->mark();
- if (m_locationbar && !m_locationbar->marked())
- m_locationbar->mark();
- if (m_menubar && !m_menubar->marked())
- m_menubar->mark();
- if (m_personalbar && !m_personalbar->marked())
- m_personalbar->mark();
- if (m_scrollbars && !m_scrollbars->marked())
- m_scrollbars->mark();
- if (m_statusbar && !m_statusbar->marked())
- m_statusbar->mark();
- if (m_toolbar && !m_toolbar->marked())
- m_toolbar->mark();
</del><ins>+ if (d->screen && !d->screen->marked())
+ d->screen->mark();
+ if (d->history && !d->history->marked())
+ d->history->mark();
+ if (d->frames && !d->frames->marked())
+ d->frames->mark();
+ if (d->loc && !d->loc->marked())
+ d->loc->mark();
+ if (d->m_selection && !d->m_selection->marked())
+ d->m_selection->mark();
+ if (d->m_locationbar && !d->m_locationbar->marked())
+ d->m_locationbar->mark();
+ if (d->m_menubar && !d->m_menubar->marked())
+ d->m_menubar->mark();
+ if (d->m_personalbar && !d->m_personalbar->marked())
+ d->m_personalbar->mark();
+ if (d->m_scrollbars && !d->m_scrollbars->marked())
+ d->m_scrollbars->mark();
+ if (d->m_statusbar && !d->m_statusbar->marked())
+ d->m_statusbar->mark();
+ if (d->m_toolbar && !d->m_toolbar->marked())
+ d->m_toolbar->mark();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> UString Window::toString(ExecState *) const
</span><span class="lines">@@ -712,17 +739,17 @@
</span><span class="cx"> case Status:
</span><span class="cx"> return jsString(UString(m_frame->jsStatusBarText()));
</span><span class="cx"> case Frames:
</span><del>- if (!frames)
- frames = new FrameArray(exec, m_frame);
- return frames;
</del><ins>+ if (!d->frames)
+ d->frames = new FrameArray(exec, m_frame);
+ return d->frames;
</ins><span class="cx"> case History_:
</span><del>- if (!history)
- history = new History(exec, m_frame);
- return history;
</del><ins>+ if (!d->history)
+ d->history = new History(exec, m_frame);
+ return d->history;
</ins><span class="cx"> case Event_:
</span><del>- if (!m_evt)
</del><ins>+ if (!d->m_evt)
</ins><span class="cx"> return jsUndefined();
</span><del>- return toJS(exec, m_evt);
</del><ins>+ return toJS(exec, d->m_evt);
</ins><span class="cx"> case InnerHeight:
</span><span class="cx"> if (!m_frame->view())
</span><span class="cx"> return jsUndefined();
</span><span class="lines">@@ -803,9 +830,9 @@
</span><span class="cx"> case Top:
</span><span class="cx"> return retrieve(m_frame->page()->mainFrame());
</span><span class="cx"> case Screen_:
</span><del>- if (!screen)
- screen = new Screen(exec, m_frame);
- return screen;
</del><ins>+ if (!d->screen)
+ d->screen = new Screen(exec, m_frame);
+ return d->screen;
</ins><span class="cx"> case Image:
</span><span class="cx"> // FIXME: this property (and the few below) probably shouldn't create a new object every
</span><span class="cx"> // time
</span><span class="lines">@@ -1315,7 +1342,7 @@
</span><span class="cx"> if (!val->isObject())
</span><span class="cx"> return 0;
</span><span class="cx"> JSObject* object = static_cast<JSObject*>(val);
</span><del>- ListenersMap& listeners = html ? jsHTMLEventListeners : jsEventListeners;
</del><ins>+ ListenersMap& listeners = html ? d->jsHTMLEventListeners : d->jsEventListeners;
</ins><span class="cx"> return listeners.get(object);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1338,7 +1365,7 @@
</span><span class="cx"> if (!val->isObject())
</span><span class="cx"> return 0;
</span><span class="cx"> JSObject* object = static_cast<JSObject*>(val);
</span><del>- UnprotectedListenersMap& listeners = html ? jsUnprotectedHTMLEventListeners : jsUnprotectedEventListeners;
</del><ins>+ UnprotectedListenersMap& listeners = html ? d->jsUnprotectedHTMLEventListeners : d->jsUnprotectedEventListeners;
</ins><span class="cx"> return listeners.get(object);
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -1358,26 +1385,26 @@
</span><span class="cx">
</span><span class="cx"> void Window::clearHelperObjectProperties()
</span><span class="cx"> {
</span><del>- screen = 0;
- history = 0;
- frames = 0;
- loc = 0;
- m_selection = 0;
- m_locationbar = 0;
- m_menubar = 0;
- m_personalbar = 0;
- m_scrollbars = 0;
- m_statusbar = 0;
- m_toolbar = 0;
- m_evt = 0;
</del><ins>+ d->screen = 0;
+ d->history = 0;
+ d->frames = 0;
+ d->loc = 0;
+ d->m_selection = 0;
+ d->m_locationbar = 0;
+ d->m_menubar = 0;
+ d->m_personalbar = 0;
+ d->m_scrollbars = 0;
+ d->m_statusbar = 0;
+ d->m_toolbar = 0;
+ d->m_evt = 0;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void Window::clear()
</span><span class="cx"> {
</span><span class="cx"> JSLock lock;
</span><span class="cx">
</span><del>- if (m_returnValueSlot && !*m_returnValueSlot)
- *m_returnValueSlot = getDirect("returnValue");
</del><ins>+ if (d->m_returnValueSlot && !*d->m_returnValueSlot)
+ *d->m_returnValueSlot = getDirect("returnValue");
</ins><span class="cx">
</span><span class="cx"> clearAllTimeouts();
</span><span class="cx"> clearProperties();
</span><span class="lines">@@ -1395,7 +1422,7 @@
</span><span class="cx">
</span><span class="cx"> void Window::setCurrentEvent(Event *evt)
</span><span class="cx"> {
</span><del>- m_evt = evt;
</del><ins>+ d->m_evt = evt;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> static void setWindowFeature(const String& keyString, const String& valueString, WindowFeatures& windowFeatures)
</span><span class="lines">@@ -1856,6 +1883,11 @@
</span><span class="cx"> docimpl->updateLayoutIgnorePendingStylesheets();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void Window::setReturnValueSlot(JSValue **slot)
+{
+ d->m_returnValueSlot = slot;
+}
+
</ins><span class="cx"> ////////////////////// ScheduledAction ////////////////////////
</span><span class="cx">
</span><span class="cx"> void ScheduledAction::execute(Window* window)
</span><span class="lines">@@ -1909,8 +1941,8 @@
</span><span class="cx">
</span><span class="cx"> void Window::clearAllTimeouts()
</span><span class="cx"> {
</span><del>- deleteAllValues(m_timeouts);
- m_timeouts.clear();
</del><ins>+ deleteAllValues(d->m_timeouts);
+ d->m_timeouts.clear();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> int Window::installTimeout(ScheduledAction* a, int t, bool singleShot)
</span><span class="lines">@@ -1918,8 +1950,8 @@
</span><span class="cx"> int timeoutId = ++lastUsedTimeoutId;
</span><span class="cx"> int nestLevel = timerNestingLevel + 1;
</span><span class="cx"> DOMWindowTimer* timer = new DOMWindowTimer(timeoutId, nestLevel, this, a);
</span><del>- ASSERT(!m_timeouts.get(timeoutId));
- m_timeouts.set(timeoutId, timer);
</del><ins>+ ASSERT(!d->m_timeouts.get(timeoutId));
+ d->m_timeouts.set(timeoutId, timer);
</ins><span class="cx"> // Use a minimum interval of 10 ms to match other browsers, but only once we've
</span><span class="cx"> // nested enough to notice that we're repeating.
</span><span class="cx"> // Faster timers might be "better", but they're incompatible.
</span><span class="lines">@@ -1945,14 +1977,14 @@
</span><span class="cx">
</span><span class="cx"> PausedTimeouts* Window::pauseTimeouts()
</span><span class="cx"> {
</span><del>- size_t count = m_timeouts.size();
</del><ins>+ size_t count = d->m_timeouts.size();
</ins><span class="cx"> if (count == 0)
</span><span class="cx"> return 0;
</span><span class="cx">
</span><span class="cx"> PausedTimeout* t = new PausedTimeout [count];
</span><span class="cx"> PausedTimeouts* result = new PausedTimeouts(t, count);
</span><span class="cx">
</span><del>- TimeoutsMap::iterator it = m_timeouts.begin();
</del><ins>+ WindowPrivate::TimeoutsMap::iterator it = d->m_timeouts.begin();
</ins><span class="cx"> for (size_t i = 0; i != count; ++i, ++it) {
</span><span class="cx"> int timeoutId = it->first;
</span><span class="cx"> DOMWindowTimer* timer = it->second;
</span><span class="lines">@@ -1962,10 +1994,10 @@
</span><span class="cx"> t[i].repeatInterval = timer->repeatInterval();
</span><span class="cx"> t[i].action = timer->takeAction();
</span><span class="cx"> }
</span><del>- ASSERT(it == m_timeouts.end());
</del><ins>+ ASSERT(it == d->m_timeouts.end());
</ins><span class="cx">
</span><del>- deleteAllValues(m_timeouts);
- m_timeouts.clear();
</del><ins>+ deleteAllValues(d->m_timeouts);
+ d->m_timeouts.clear();
</ins><span class="cx">
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="lines">@@ -1979,7 +2011,7 @@
</span><span class="cx"> for (size_t i = 0; i != count; ++i) {
</span><span class="cx"> int timeoutId = array[i].timeoutId;
</span><span class="cx"> DOMWindowTimer* timer = new DOMWindowTimer(timeoutId, array[i].nestingLevel, this, array[i].action);
</span><del>- m_timeouts.set(timeoutId, timer);
</del><ins>+ d->m_timeouts.set(timeoutId, timer);
</ins><span class="cx"> timer->start(array[i].nextFireInterval, array[i].repeatInterval);
</span><span class="cx"> }
</span><span class="cx"> delete [] array;
</span><span class="lines">@@ -1987,11 +2019,11 @@
</span><span class="cx">
</span><span class="cx"> void Window::clearTimeout(int timeoutId, bool delAction)
</span><span class="cx"> {
</span><del>- TimeoutsMap::iterator it = m_timeouts.find(timeoutId);
- if (it == m_timeouts.end())
</del><ins>+ WindowPrivate::TimeoutsMap::iterator it = d->m_timeouts.find(timeoutId);
+ if (it == d->m_timeouts.end())
</ins><span class="cx"> return;
</span><span class="cx"> DOMWindowTimer* timer = it->second;
</span><del>- m_timeouts.remove(it);
</del><ins>+ d->m_timeouts.remove(it);
</ins><span class="cx"> delete timer;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -2002,7 +2034,7 @@
</span><span class="cx"> int timeoutId = timer->timeoutId();
</span><span class="cx">
</span><span class="cx"> timer->action()->execute(this);
</span><del>- if (m_timeouts.contains(timeoutId) && timer->repeatInterval() && timer->repeatInterval() < cMinimumTimerInterval) {
</del><ins>+ if (d->m_timeouts.contains(timeoutId) && timer->repeatInterval() && timer->repeatInterval() < cMinimumTimerInterval) {
</ins><span class="cx"> timer->setNestingLevel(timer->nestingLevel() + 1);
</span><span class="cx"> if (timer->nestingLevel() >= cMaxTimerNestingLevel)
</span><span class="cx"> timer->augmentRepeatInterval(cMinimumTimerInterval - timer->repeatInterval());
</span><span class="lines">@@ -2012,7 +2044,7 @@
</span><span class="cx">
</span><span class="cx"> // Delete timer before executing the action for one-shot timers.
</span><span class="cx"> ScheduledAction* action = timer->takeAction();
</span><del>- m_timeouts.remove(timer->timeoutId());
</del><ins>+ d->m_timeouts.remove(timer->timeoutId());
</ins><span class="cx"> delete timer;
</span><span class="cx"> action->execute(this);
</span><span class="cx">
</span><span class="lines">@@ -2024,28 +2056,48 @@
</span><span class="cx"> {
</span><span class="cx"> clearAllTimeouts();
</span><span class="cx"> m_frame = 0;
</span><del>- if (loc)
- loc->m_frame = 0;
- if (m_selection)
- m_selection->m_frame = 0;
- if (m_locationbar)
- m_locationbar->m_frame = 0;
- if (m_menubar)
- m_menubar->m_frame = 0;
- if (m_personalbar)
- m_personalbar->m_frame = 0;
- if (m_statusbar)
- m_statusbar->m_frame = 0;
- if (m_toolbar)
- m_toolbar->m_frame = 0;
- if (m_scrollbars)
- m_scrollbars->m_frame = 0;
- if (frames)
- frames->disconnectFrame();
- if (history)
- history->disconnectFrame();
</del><ins>+ if (d->loc)
+ d->loc->m_frame = 0;
+ if (d->m_selection)
+ d->m_selection->m_frame = 0;
+ if (d->m_locationbar)
+ d->m_locationbar->m_frame = 0;
+ if (d->m_menubar)
+ d->m_menubar->m_frame = 0;
+ if (d->m_personalbar)
+ d->m_personalbar->m_frame = 0;
+ if (d->m_statusbar)
+ d->m_statusbar->m_frame = 0;
+ if (d->m_toolbar)
+ d->m_toolbar->m_frame = 0;
+ if (d->m_scrollbars)
+ d->m_scrollbars->m_frame = 0;
+ if (d->frames)
+ d->frames->disconnectFrame();
+ if (d->history)
+ d->history->disconnectFrame();
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+Window::ListenersMap& Window::jsEventListeners()
+{
+ return d->jsEventListeners;
+}
+
+Window::ListenersMap& Window::jsHTMLEventListeners()
+{
+ return d->jsHTMLEventListeners;
+}
+
+Window::UnprotectedListenersMap& Window::jsUnprotectedEventListeners()
+{
+ return d->jsUnprotectedEventListeners;
+}
+
+Window::UnprotectedListenersMap& Window::jsUnprotectedHTMLEventListeners()
+{
+ return d->jsUnprotectedHTMLEventListeners;
+}
+
</ins><span class="cx"> const ClassInfo FrameArray::info = { "FrameArray", 0, &FrameArrayTable, 0 };
</span><span class="cx">
</span><span class="cx"> /*
</span></span></pre></div>
<a id="branchesjscollectortweaksWebCorebindingsjskjs_windowh"></a>
<div class="modfile"><h4>Modified: branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.h (20718 => 20719)</h4>
<pre class="diff"><span>
<span class="info">--- branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.h        2007-04-05 10:03:02 UTC (rev 20718)
+++ branches/js-collector-tweaks/WebCore/bindings/js/kjs_window.h        2007-04-05 10:08:55 UTC (rev 20719)
</span><span class="lines">@@ -80,6 +80,8 @@
</span><span class="cx"> WebCore::Frame* m_frame;
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+ class WindowPrivate;
+
</ins><span class="cx"> class Window : public DOMObject {
</span><span class="cx"> friend class Location;
</span><span class="cx"> friend class WindowFunc;
</span><span class="lines">@@ -156,14 +158,16 @@
</span><span class="cx"> void setCurrentEvent(WebCore::Event*);
</span><span class="cx">
</span><span class="cx"> // Set a place to put a dialog return value when the window is cleared.
</span><del>- void setReturnValueSlot(JSValue **slot) { m_returnValueSlot = slot; }
</del><ins>+ void setReturnValueSlot(JSValue **slot);
</ins><span class="cx">
</span><span class="cx"> typedef HashMap<JSObject*, JSEventListener*> ListenersMap;
</span><span class="cx"> typedef HashMap<JSObject*, JSUnprotectedEventListener*> UnprotectedListenersMap;
</span><del>- ListenersMap jsEventListeners;
- ListenersMap jsHTMLEventListeners;
- UnprotectedListenersMap jsUnprotectedEventListeners;
- UnprotectedListenersMap jsUnprotectedHTMLEventListeners;
</del><ins>+
+ ListenersMap& jsEventListeners();
+ ListenersMap& jsHTMLEventListeners();
+ UnprotectedListenersMap& jsUnprotectedEventListeners();
+ UnprotectedListenersMap& jsUnprotectedHTMLEventListeners();
+
</ins><span class="cx"> virtual const ClassInfo* classInfo() const { return &info; }
</span><span class="cx"> static const ClassInfo info;
</span><span class="cx"> enum { AToB, BToA, Closed, Crypto, DefaultStatus, Status, DOMException, Frames, History_, Event_, InnerHeight,
</span><span class="lines">@@ -198,21 +202,7 @@
</span><span class="cx"> int installTimeout(ScheduledAction*, int interval, bool singleShot);
</span><span class="cx">
</span><span class="cx"> WebCore::Frame* m_frame;
</span><del>- mutable Screen* screen;
- mutable History* history;
- mutable FrameArray* frames;
- mutable Location* loc;
- mutable Selection* m_selection;
- mutable BarInfo* m_locationbar;
- mutable BarInfo* m_menubar;
- mutable BarInfo* m_personalbar;
- mutable BarInfo* m_scrollbars;
- mutable BarInfo* m_statusbar;
- mutable BarInfo* m_toolbar;
- WebCore::Event *m_evt;
- JSValue **m_returnValueSlot;
- typedef HashMap<int, DOMWindowTimer*> TimeoutsMap;
- TimeoutsMap m_timeouts;
</del><ins>+ OwnPtr<WindowPrivate> d;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> /**
</span></span></pre>
</div>
</div>
</body>
</html>