JavaScriptCore:
authorggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Feb 2008 00:20:34 +0000 (00:20 +0000)
committerggaren@apple.com <ggaren@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 3 Feb 2008 00:20:34 +0000 (00:20 +0000)
        Reviewed by Geoff Garen.

        PLT speedup related to <rdar://problem/5659272> REGRESSION: PLT .4%
        slower due to r28884 (global variable symbol table optimization)

        Geoff's theory is that the slowdown was due to copying hash tables when
        putting things into the back/forward cache. If that's true, then this
        should fix the problem.

        (According to Geoff's measurements, in a PLT that exaggerates the
        importance of symbol table saving during cached page creation, this
        patch is a ~3X speedup in cached page creation, and a 9% speedup overall.)

        * JavaScriptCore.exp: Updated.

        * kjs/JSVariableObject.cpp:
        (KJS::JSVariableObject::saveLocalStorage): Updated for changes to SavedProperty,
        which has been revised to avoid initializing each SavedProperty twice when building
        the array. Store the property names too, so we don't have to store the symbol table
        separately. Do this by iterating the symbol table instead of the local storage vector.
        (KJS::JSVariableObject::restoreLocalStorage): Ditto. Restore the symbol table as
        well as the local storage vector.

        * kjs/JSVariableObject.h: Removed save/restoreSymbolTable and do that work inside
        save/restoreLocalStorage instead. Made restoreLocalStorage a non-const member function
        that takes a const reference to a SavedProperties object.

        * kjs/LocalStorage.h: Changed attributes to be unsigned instead of int to match
        other declarations of attributes elsewhere.

        * kjs/property_map.cpp:
        (KJS::SavedProperties::SavedProperties): Updated for data member name change.
        (KJS::PropertyMap::save): Updated for data member name change and to use the new
        inline init function instead of setting the fields directly. This allows us to
        skip initializing the SavedProperty objects when first allocating the array, and
        just do it when we're actually setting up the individual elements.
        (KJS::PropertyMap::restore): Updated for SavedProperty changes.

        * kjs/property_map.h: Changed SavedProperty from a struct to a class. Set it up so
        it does not get initialized at construction time to avoid initializing twice when
        creating an array of SavedProperty. Removed the m_ prefixes from the members of
        the SavedProperties struct. Generally we use m_ for class members and not struct.

WebCore:

        Reviewed by Geoff Garen.

        PLT speedup related to <rdar://problem/5659272> REGRESSION: PLT .4%
        slower due to r28884 (global variable symbol table optimization)

        * history/CachedPage.cpp:
        (WebCore::CachedPage::CachedPage): Removed saveSymbolTable call.
        (WebCore::CachedPage::restore): Removed restoreSymbolTable call.
        (WebCore::CachedPage::clear): Removed clear of m_windowSymbolTable.

        * history/CachedPage.h: Removed m_windowSymbolTable, since save/restoreLocalStorage
        now takes care of the symbol table. Also removed many unnecessary includes.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@29943 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.exp
JavaScriptCore/kjs/JSVariableObject.cpp
JavaScriptCore/kjs/JSVariableObject.h
JavaScriptCore/kjs/LocalStorage.h
JavaScriptCore/kjs/property_map.cpp
JavaScriptCore/kjs/property_map.h
WebCore/ChangeLog
WebCore/history/CachedPage.cpp
WebCore/history/CachedPage.h

index 1e364e9..d87e4fb 100644 (file)
@@ -1,3 +1,48 @@
+2008-02-02  Darin Adler  <darin@apple.com>
+
+        Reviewed by Geoff Garen.
+
+        PLT speedup related to <rdar://problem/5659272> REGRESSION: PLT .4%
+        slower due to r28884 (global variable symbol table optimization)
+
+        Geoff's theory is that the slowdown was due to copying hash tables when
+        putting things into the back/forward cache. If that's true, then this
+        should fix the problem.
+        
+        (According to Geoff's measurements, in a PLT that exaggerates the
+        importance of symbol table saving during cached page creation, this
+        patch is a ~3X speedup in cached page creation, and a 9% speedup overall.)
+
+        * JavaScriptCore.exp: Updated.
+
+        * kjs/JSVariableObject.cpp:
+        (KJS::JSVariableObject::saveLocalStorage): Updated for changes to SavedProperty,
+        which has been revised to avoid initializing each SavedProperty twice when building
+        the array. Store the property names too, so we don't have to store the symbol table
+        separately. Do this by iterating the symbol table instead of the local storage vector.
+        (KJS::JSVariableObject::restoreLocalStorage): Ditto. Restore the symbol table as
+        well as the local storage vector.
+
+        * kjs/JSVariableObject.h: Removed save/restoreSymbolTable and do that work inside
+        save/restoreLocalStorage instead. Made restoreLocalStorage a non-const member function
+        that takes a const reference to a SavedProperties object.
+
+        * kjs/LocalStorage.h: Changed attributes to be unsigned instead of int to match
+        other declarations of attributes elsewhere.
+
+        * kjs/property_map.cpp:
+        (KJS::SavedProperties::SavedProperties): Updated for data member name change.
+        (KJS::PropertyMap::save): Updated for data member name change and to use the new
+        inline init function instead of setting the fields directly. This allows us to
+        skip initializing the SavedProperty objects when first allocating the array, and
+        just do it when we're actually setting up the individual elements.
+        (KJS::PropertyMap::restore): Updated for SavedProperty changes.
+
+        * kjs/property_map.h: Changed SavedProperty from a struct to a class. Set it up so
+        it does not get initialized at construction time to avoid initializing twice when
+        creating an array of SavedProperty. Removed the m_ prefixes from the members of
+        the SavedProperties struct. Generally we use m_ for class members and not struct.
+
 2008-02-02  Tony Chang  <idealisms@gmail.com>
 
         Reviewed by darin.  Landed by eseidel.
index 63ce4a2..fa0b193 100644 (file)
@@ -156,6 +156,7 @@ __ZN3KJS15SavedPropertiesC1Ev
 __ZN3KJS15SavedPropertiesD1Ev
 __ZN3KJS16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE
 __ZN3KJS16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE
+__ZN3KJS16JSVariableObject19restoreLocalStorageERKNS_15SavedPropertiesE
 __ZN3KJS16ParserRefCounted3refEv
 __ZN3KJS16ParserRefCounted5derefEv
 __ZN3KJS16RuntimeObjectImp4infoE
@@ -245,10 +246,7 @@ __ZNK3KJS11PropertyMap4saveERNS_15SavedPropertiesE
 __ZNK3KJS12DateInstance7getTimeERdRi
 __ZNK3KJS13ArrayInstance7getItemEj
 __ZNK3KJS14JSGlobalObject12saveBuiltinsERNS_13SavedBuiltinsE
-__ZNK3KJS16JSVariableObject15saveSymbolTableERN3WTF7HashMapINS1_6RefPtrINS_7UString3RepEEEmNS_17IdentifierRepHashENS_23IdentifierRepHashTraitsENS_26SymbolTableIndexHashTraitsEEE
 __ZNK3KJS16JSVariableObject16saveLocalStorageERNS_15SavedPropertiesE
-__ZNK3KJS16JSVariableObject18restoreSymbolTableERN3WTF7HashMapINS1_6RefPtrINS_7UString3RepEEEmNS_17IdentifierRepHashENS_23IdentifierRepHashTraitsENS_26SymbolTableIndexHashTraitsEEE
-__ZNK3KJS16JSVariableObject19restoreLocalStorageERNS_15SavedPropertiesE
 __ZNK3KJS19InternalFunctionImp14implementsCallEv
 __ZNK3KJS19InternalFunctionImp21implementsHasInstanceEv
 __ZNK3KJS4List8getSliceEiRS0_
index a1820c5..76d563d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -36,43 +36,42 @@ namespace KJS {
 
 UString::Rep* IdentifierRepHashTraits::nullRepPtr = &UString::Rep::null; // Didn't want to make a whole source file for just this.
 
-void JSVariableObject::saveSymbolTable(SymbolTable& s) const
-{
-    s = *d->symbolTable;
-}
-
-void JSVariableObject::restoreSymbolTable(SymbolTable& s) const
-{
-    *d->symbolTable = s;
-}
-
 void JSVariableObject::saveLocalStorage(SavedProperties& p) const
 {
-    unsigned count = d->localStorage.size();
+    ASSERT(d->symbolTable);
+    ASSERT(static_cast<size_t>(d->symbolTable->size()) == d->localStorage.size());
 
-    p.m_properties.clear();
-    p.m_count = count;
+    unsigned count = d->symbolTable->size();
+
+    p.properties.clear();
+    p.count = count;
 
     if (!count)
         return;
 
-    p.m_properties.set(new SavedProperty[count]);
-    
-    SavedProperty* prop = p.m_properties.get();
-    for (size_t i = 0; i < count; ++i, ++prop) {
-        LocalStorageEntry& entry = d->localStorage[i];
-        prop->value = entry.value;
-        prop->attributes = entry.attributes;
+    p.properties.set(new SavedProperty[count]);
+
+    SymbolTable::const_iterator end = d->symbolTable->end();
+    for (SymbolTable::const_iterator it = d->symbolTable->begin(); it != end; ++it) {
+        size_t i = it->second;
+        const LocalStorageEntry& entry = d->localStorage[i];
+        p.properties[i].init(it->first.get(), entry.value, entry.attributes);
     }
 }
 
-void JSVariableObject::restoreLocalStorage(SavedProperties& p) const
+void JSVariableObject::restoreLocalStorage(const SavedProperties& p)
 {
-    unsigned count = p.m_count;
+    unsigned count = p.count;
+    d->symbolTable->clear();
     d->localStorage.resize(count);
-    SavedProperty* prop = p.m_properties.get();
-    for (size_t i = 0; i < count; ++i, ++prop)
-        d->localStorage[i] = LocalStorageEntry(prop->value, prop->attributes);
+    SavedProperty* property = p.properties.get();
+    for (size_t i = 0; i < count; ++i, ++property) {
+        ASSERT(!d->symbolTable->contains(property->name()));
+        LocalStorageEntry& entry = d->localStorage[i];
+        d->symbolTable->set(property->name(), i);
+        entry.value = property->value();
+        entry.attributes = property->attributes();
+    }
 }
 
 bool JSVariableObject::deleteProperty(ExecState* exec, const Identifier& propertyName)
index 37f7299..e82013b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -40,11 +40,8 @@ namespace KJS {
         SymbolTable& symbolTable() { return *d->symbolTable; }
         LocalStorage& localStorage() { return d->localStorage; }
         
-        void saveSymbolTable(SymbolTable& s) const;
-        void restoreSymbolTable(SymbolTable& s) const;
-
-        void saveLocalStorage(SavedProperties& s) const;
-        void restoreLocalStorage(SavedProperties& s) const;
+        void saveLocalStorage(SavedProperties&) const;
+        void restoreLocalStorage(const SavedProperties&);
         
         virtual bool deleteProperty(ExecState*, const Identifier&);
         virtual void getPropertyNames(ExecState*, PropertyNameArray&);
@@ -57,7 +54,6 @@ namespace KJS {
         // size of a JSCell).
         struct JSVariableObjectData {
             JSVariableObjectData() { }
-
             JSVariableObjectData(SymbolTable* s)
                 : symbolTable(s) // Subclass owns this pointer.
             {
@@ -65,7 +61,6 @@ namespace KJS {
 
             LocalStorage localStorage; // Storage for variables in the symbol table.
             SymbolTable* symbolTable; // Maps name -> index in localStorage.
-
         };
 
         JSVariableObject() { }
@@ -106,7 +101,6 @@ namespace KJS {
             slot.setValueSlot(this, &d->localStorage[index].value);
             return true;
         }
-
         return false;
     }
 
index bcd2112..87a54bb 100644 (file)
@@ -1,7 +1,7 @@
 // -*- mode: c++; c-basic-offset: 4 -*-
 /*
  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
- *  Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved.
+ *  Copyright (C) 2003, 2006, 2007, 2008 Apple Inc. All rights reserved.
  *  Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca)
  *  Copyright (C) 2007 Maks Orlovich
  *
@@ -36,14 +36,14 @@ namespace KJS {
         {
         }
     
-        LocalStorageEntry(JSValue* v, int a)
+        LocalStorageEntry(JSValue* v, unsigned a)
             : value(v)
             , attributes(a)
         {
         }
 
         JSValue* value;
-        int attributes;
+        unsigned attributes;
     };
 
     typedef Vector<LocalStorageEntry, 32> LocalStorage;
index 284cdff..1da4917 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+ *  Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Library General Public
@@ -126,7 +126,7 @@ static const unsigned emptyEntryIndex = 0;
 static const unsigned deletedSentinelIndex = 1;
 
 SavedProperties::SavedProperties()
-    : m_count(0)
+    : count(0)
 {
 }
 
@@ -716,7 +716,7 @@ void PropertyMap::getEnumerablePropertyNames(PropertyNameArray& propertyNames) c
         propertyNames.add(Identifier(q[0]->key));
 }
 
-void PropertyMap::save(SavedProperties &p) const
+void PropertyMap::save(SavedProperties& s) const
 {
     unsigned count = 0;
 
@@ -732,58 +732,52 @@ void PropertyMap::save(SavedProperties &p) const
                 ++count;
     }
 
-    p.m_properties.clear();
-    p.m_count = count;
+    s.properties.clear();
+    s.count = count;
 
     if (count == 0)
         return;
     
-    p.m_properties.set(new SavedProperty [count]);
+    s.properties.set(new SavedProperty[count]);
     
-    SavedProperty* prop = p.m_properties.get();
+    SavedProperty* prop = s.properties.get();
     
-    if (!m_usingTable) {
 #if USE_SINGLE_ENTRY
-        if (m_singleEntryKey && !(m_singleEntryAttributes & (ReadOnly | Function))) {
-            prop->key = Identifier(m_singleEntryKey);
-            prop->value = m_u.singleEntryValue;
-            prop->attributes = m_singleEntryAttributes;
-            ++prop;
-        }
+    if (!m_usingTable) {
+        prop->init(m_singleEntryKey, m_u.singleEntryValue, m_singleEntryAttributes);
+        return;
+    }
 #endif
-    } else {
-        // Save in the right order so we don't lose the order.
-        // Another possibility would be to save the indices.
 
-        // Allocate a buffer to use to sort the keys.
-        Vector<Entry*, smallMapThreshold> sortedEntries(count);
+    // Save in the right order so we don't lose the order.
+    // Another possibility would be to save the indices.
 
-        // Get pointers to the entries in the buffer.
-        Entry** p = sortedEntries.data();
-        unsigned entryCount = m_u.table->keyCount + m_u.table->deletedSentinelCount;
-        for (unsigned i = 1; i <= entryCount; ++i) {
-            if (m_u.table->entries()[i].key && !(m_u.table->entries()[i].attributes & (ReadOnly | Function)))
-                *p++ = &m_u.table->entries()[i];
-        }
-        ASSERT(p == sortedEntries.data() + count);
+    // Allocate a buffer to use to sort the keys.
+    Vector<Entry*, smallMapThreshold> sortedEntries(count);
+
+    // Get pointers to the entries in the buffer.
+    Entry** p = sortedEntries.data();
+    unsigned entryCount = m_u.table->keyCount + m_u.table->deletedSentinelCount;
+    for (unsigned i = 1; i <= entryCount; ++i) {
+        if (m_u.table->entries()[i].key && !(m_u.table->entries()[i].attributes & (ReadOnly | Function)))
+            *p++ = &m_u.table->entries()[i];
+    }
+    ASSERT(p == sortedEntries.data() + count);
 
-        // Sort the entries by index.
-        qsort(sortedEntries.data(), p - sortedEntries.data(), sizeof(Entry*), comparePropertyMapEntryIndices);
+    // Sort the entries by index.
+    qsort(sortedEntries.data(), p - sortedEntries.data(), sizeof(Entry*), comparePropertyMapEntryIndices);
 
-        // Put the sorted entries into the saved properties list.
-        for (Entry** q = sortedEntries.data(); q != p; ++q, ++prop) {
-            Entry* e = *q;
-            prop->key = Identifier(e->key);
-            prop->value = e->value;
-            prop->attributes = e->attributes;
-        }
+    // Put the sorted entries into the saved properties list.
+    for (Entry** q = sortedEntries.data(); q != p; ++q, ++prop) {
+        Entry* e = *q;
+        prop->init(e->key, e->value, e->attributes);
     }
 }
 
-void PropertyMap::restore(const SavedProperties &p)
+void PropertyMap::restore(const SavedPropertiesp)
 {
-    for (unsigned i = 0; i != p.m_count; ++i)
-        put(p.m_properties[i].key, p.m_properties[i].value, p.m_properties[i].attributes);
+    for (unsigned i = 0; i != p.count; ++i)
+        put(Identifier(p.properties[i].name()), p.properties[i].value(), p.properties[i].attributes());
 }
 
 #if DO_PROPERTYMAP_CONSTENCY_CHECK
index c07ebf1..269e911 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: c++; c-basic-offset: 4 -*-
 /*
- *  Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
+ *  Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Library General Public
@@ -34,19 +34,34 @@ namespace KJS {
     
     struct PropertyMapEntry;
     struct PropertyMapHashTable;
-    
-    struct SavedProperty {
-        Identifier key;
-        ProtectedPtr<JSValue> value;
-        unsigned attributes;
+
+    class SavedProperty : Noncopyable {
+    public:
+        // Since we use this in arrays, we allocate it uninitialized
+        // and then explicitly initialize. This means we can allocate
+        // the array without initializing every saved property in the
+        // array twice. To accomplish this, the class uses data members
+        // with types that don't have constructors.
+        SavedProperty();
+        void init(UString::Rep* name, JSValue*, unsigned attributes);
+        ~SavedProperty();
+
+        UString::Rep* name() const;
+        JSValue* value() const;
+        unsigned attributes() const;
+
+    private:
+        UString::Rep* m_name;
+        JSValue* m_value;
+        unsigned m_attributes;
     };
 
     struct SavedProperties {
         SavedProperties();
         ~SavedProperties();
         
-        unsigned m_count;
-        OwnArrayPtr<SavedProperty> m_properties;
+        unsigned count;
+        OwnArrayPtr<SavedProperty> properties;
     };
 
     class PropertyMap : Noncopyable {
@@ -106,6 +121,64 @@ namespace KJS {
     {
     }
 
+    inline SavedProperty::SavedProperty()
+#ifndef NDEBUG
+        : m_name(0)
+        , m_value(0)
+        , m_attributes(0)
+#endif
+    {
+    }
+
+    inline void SavedProperty::init(UString::Rep* name, JSValue* value, unsigned attributes)
+    {
+        ASSERT(name);
+        ASSERT(value);
+
+        ASSERT(!m_name);
+        ASSERT(!m_value);
+        ASSERT(!m_attributes);
+
+        m_name = name;
+        m_value = value;
+        m_attributes = attributes;
+        name->ref();
+        gcProtect(value);
+    }
+
+    inline SavedProperty::~SavedProperty()
+    {
+        ASSERT(m_name);
+        ASSERT(m_value);
+
+        m_name->deref();
+        gcUnprotect(m_value);
+    }
+
+    inline UString::Rep* SavedProperty::name() const
+    {
+        ASSERT(m_name);
+        ASSERT(m_value);
+
+        return m_name;
+    }
+
+    inline JSValue* SavedProperty::value() const
+    {
+        ASSERT(m_name);
+        ASSERT(m_value);
+
+        return m_value;
+    }
+
+    inline unsigned SavedProperty::attributes() const
+    {
+        ASSERT(m_name);
+        ASSERT(m_value);
+
+        return m_attributes;
+    }
+
 } // namespace
 
 #endif // _KJS_PROPERTY_MAP_H_
index 4eb254f..53adccc 100644 (file)
@@ -1,3 +1,18 @@
+2008-02-02  Darin Adler  <darin@apple.com>
+
+        Reviewed by Geoff Garen.
+
+        PLT speedup related to <rdar://problem/5659272> REGRESSION: PLT .4%
+        slower due to r28884 (global variable symbol table optimization)
+
+        * history/CachedPage.cpp:
+        (WebCore::CachedPage::CachedPage): Removed saveSymbolTable call.
+        (WebCore::CachedPage::restore): Removed restoreSymbolTable call.
+        (WebCore::CachedPage::clear): Removed clear of m_windowSymbolTable.
+
+        * history/CachedPage.h: Removed m_windowSymbolTable, since save/restoreLocalStorage
+        now takes care of the symbol table. Also removed many unnecessary includes.
+
 2008-02-02  Tony Chang  <idealisms@gmail.com>
 
         Reviewed by eseidel.
index b245b2b..008f2d6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -29,6 +29,7 @@
 #include "AnimationController.h"
 #include "CachedPagePlatformData.h"
 #include "Document.h"
+#include "DocumentLoader.h"
 #include "Element.h"
 #include "EventHandler.h"
 #include "FocusController.h"
@@ -102,7 +103,6 @@ CachedPage::CachedPage(Page* page)
     if (window) {
         window->saveBuiltins(*m_windowBuiltins.get());
         window->saveProperties(*m_windowProperties.get());
-        window->saveSymbolTable(m_windowSymbolTable);
         window->saveLocalStorage(*m_windowLocalStorage.get());
         window->location()->saveProperties(*m_locationProperties.get());
         m_pausedTimeouts.set(window->pauseTimeouts());
@@ -137,7 +137,6 @@ void CachedPage::restore(Page* page)
     if (window) {
         window->restoreBuiltins(*m_windowBuiltins.get());
         window->restoreProperties(*m_windowProperties.get());
-        window->restoreSymbolTable(m_windowSymbolTable);
         window->restoreLocalStorage(*m_windowLocalStorage.get());
         window->location()->restoreProperties(*m_locationProperties.get());
         window->resumeTimeouts(m_pausedTimeouts.get());
@@ -198,7 +197,6 @@ void CachedPage::clear()
     m_pausedTimeouts.clear();
     m_cachedPagePlatformData.clear();
     m_windowLocalStorage.clear();
-    m_windowSymbolTable.clear();
 
     gcController().garbageCollectSoon();
 }
index 2fe1b2e..9157b0b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
+ * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #ifndef CachedPage_h
 #define CachedPage_h
 
-#include "DocumentLoader.h"
-#include <kjs/SymbolTable.h>
-#include <wtf/RefCounted.h>
-#include <wtf/Forward.h>
-#include <wtf/RefPtr.h>
+#include "KURL.h"
 #include <wtf/OwnPtr.h>
 
-#if PLATFORM(MAC)
-#include <wtf/RetainPtr.h>
-typedef struct objc_object* id;
-#endif
-
-namespace KJS {
-    
+namespace KJS {    
     class SavedBuiltins;
     struct SavedProperties;
 }
@@ -48,6 +38,7 @@ namespace WebCore {
     
     class CachedPagePlatformData;
     class Document;
+    class DocumentLoader;
     class FrameView;
     class Node;
     class Page;
@@ -73,6 +64,7 @@ public:
 
     void setCachedPagePlatformData(CachedPagePlatformData*);
     CachedPagePlatformData* cachedPagePlatformData();
+
 private:
     CachedPage(Page*);
     RefPtr<DocumentLoader> m_documentLoader;
@@ -85,7 +77,6 @@ private:
     OwnPtr<KJS::SavedProperties> m_windowProperties;
     OwnPtr<KJS::SavedProperties> m_locationProperties;
     OwnPtr<KJS::SavedProperties> m_windowLocalStorage;
-    KJS::SymbolTable m_windowSymbolTable;
     OwnPtr<KJS::SavedBuiltins> m_windowBuiltins;
     OwnPtr<PausedTimeouts> m_pausedTimeouts;
     OwnPtr<CachedPagePlatformData> m_cachedPagePlatformData;