2008-09-12 Cameron Zwarich <cwzwarich@uwaterloo.ca>
authorcwzwarich@webkit.org <cwzwarich@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 13 Sep 2008 04:57:35 +0000 (04:57 +0000)
committercwzwarich@webkit.org <cwzwarich@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 13 Sep 2008 04:57:35 +0000 (04:57 +0000)
        Reviewed by Maciej Stachowiak.

        Bug 20819: JSValue::isObject() is slow
        <https://bugs.webkit.org/show_bug.cgi?id=20819>

        Optimize JSCell::isObject() and JSCell::isString() by making them
        non-virtual calls that rely on the StructureID type information.

        This is a 0.7% speedup on SunSpider and a 1.0% speedup on the V8
        benchmark suite.

        * JavaScriptCore.exp:
        * kjs/JSCell.cpp:
        * kjs/JSCell.h:
        (JSC::JSCell::isObject):
        (JSC::JSCell::isString):
        * kjs/JSObject.cpp:
        * kjs/JSObject.h:
        * kjs/JSString.cpp:
        * kjs/JSString.h:
        (JSC::JSString::JSString):
        * kjs/StructureID.h:
        (JSC::StructureID::type):

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

JavaScriptCore/ChangeLog
JavaScriptCore/JavaScriptCore.exp
JavaScriptCore/kjs/JSCell.cpp
JavaScriptCore/kjs/JSCell.h
JavaScriptCore/kjs/JSObject.cpp
JavaScriptCore/kjs/JSObject.h
JavaScriptCore/kjs/JSString.cpp
JavaScriptCore/kjs/JSString.h
JavaScriptCore/kjs/StructureID.h

index d85cf42354e1b3f6716039dbc4f801b1e82512b6..cb82422d7b3da769acdaecb3b857ad8781e90f63 100644 (file)
@@ -1,3 +1,29 @@
+2008-09-12  Cameron Zwarich  <cwzwarich@uwaterloo.ca>
+
+        Reviewed by Maciej Stachowiak.
+
+        Bug 20819: JSValue::isObject() is slow
+        <https://bugs.webkit.org/show_bug.cgi?id=20819>
+
+        Optimize JSCell::isObject() and JSCell::isString() by making them
+        non-virtual calls that rely on the StructureID type information.
+
+        This is a 0.7% speedup on SunSpider and a 1.0% speedup on the V8
+        benchmark suite.
+
+        * JavaScriptCore.exp:
+        * kjs/JSCell.cpp:
+        * kjs/JSCell.h:
+        (JSC::JSCell::isObject):
+        (JSC::JSCell::isString):
+        * kjs/JSObject.cpp:
+        * kjs/JSObject.h:
+        * kjs/JSString.cpp:
+        * kjs/JSString.h:
+        (JSC::JSString::JSString):
+        * kjs/StructureID.h:
+        (JSC::StructureID::type):
+
 2008-09-11  Stephanie Lewis  <slewis@apple.com>
 
         Reviewed by Oliver Hunt.
index bf4c0f1563d8ffb301b738712dfeae23d4c67c23..2823641e822e7d42ef424b9d51b16de0e22fb810 100644 (file)
@@ -298,8 +298,6 @@ __ZNK3JSC6JSCell12toThisStringEPNS_9ExecStateE
 __ZNK3JSC6JSCell14isGetterSetterEv
 __ZNK3JSC6JSCell17getTruncatedInt32ERi
 __ZNK3JSC6JSCell18getTruncatedUInt32ERj
-__ZNK3JSC6JSCell8isObjectEv
-__ZNK3JSC6JSCell8isStringEv
 __ZNK3JSC6JSCell9classInfoEv
 __ZNK3JSC6JSCell9getNumberEv
 __ZNK3JSC6JSCell9getStringERNS_7UStringE
@@ -325,7 +323,6 @@ __ZNK3JSC8JSObject12toThisObjectEPNS_9ExecStateE
 __ZNK3JSC8JSObject14toGlobalObjectEPNS_9ExecStateE
 __ZNK3JSC8JSObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj
 __ZNK3JSC8JSObject21implementsHasInstanceEv
-__ZNK3JSC8JSObject8isObjectEv
 __ZNK3JSC8JSObject8toNumberEPNS_9ExecStateE
 __ZNK3JSC8JSObject8toObjectEPNS_9ExecStateE
 __ZNK3JSC8JSObject8toStringEPNS_9ExecStateE
index 86cb3f277a8ffd694a7f9f1cf2beada7e7a1724a..544c27f6432d60d1164f31447e635ee6a39fd2ad 100644 (file)
@@ -215,19 +215,9 @@ JSValue* JSCell::getJSNumber()
     return 0;
 }
 
-bool JSCell::isString() const
-{
-    return false;
-}
-
 bool JSCell::isGetterSetter() const
 {
     return false;
 }
 
-bool JSCell::isObject() const
-{
-    return false;
-}
-
 } // namespace JSC
index 03ad11a24584e010f268b3c2d1f1a625e56d9437..3c9fbfbb1e941bc10e8938faa4935c087296c37a 100644 (file)
@@ -46,9 +46,9 @@ namespace JSC {
     public:
         // Querying the type.
         bool isNumber() const;
-        virtual bool isString() const;
+        bool isString() const;
+        bool isObject() const;
         virtual bool isGetterSetter() const;
-        virtual bool isObject() const;
         virtual bool isObject(const ClassInfo*) const;
 
         StructureID* structureID() const;
@@ -121,6 +121,16 @@ namespace JSC {
         return Heap::isNumber(const_cast<JSCell*>(this));
     }
 
+    inline bool JSCell::isObject() const
+    {
+        return m_structureID->type() == ObjectType;
+    }
+
+    inline bool JSCell::isString() const
+    {
+        return m_structureID->type() == StringType;
+    }
+
     inline StructureID* JSCell::structureID() const
     {
         return m_structureID;
index 2fa32acedf0c2460edf53e373f4b66713a070b1d..fad50ff83cbaf17edfb7b61d1b98d9719402f30b 100644 (file)
@@ -521,11 +521,6 @@ StructureID* JSObject::createInheritorID()
     return m_inheritorID.get();
 }
 
-bool JSObject::isObject() const
-{
-    return true;
-}
-
 void JSObject::allocatePropertyStorage(size_t oldSize, size_t newSize)
 {
     JSValue** oldPropertStorage = m_propertyStorage;
index cdab36842f3b6e1eb13d39f19c66e54928a9fdad..003fddce6661f2837ce53a6bb2f78d66ea7d71f4 100644 (file)
@@ -182,8 +182,6 @@ namespace JSC {
         bool getOwnPropertySlotForWrite(ExecState*, const Identifier&, PropertySlot&, bool& slotIsWriteable);
 
     private:
-        virtual bool isObject() const;
-
         const HashEntry* findPropertyHashEntry(ExecState*, const Identifier& propertyName) const;
         StructureID* createInheritorID();
 
index 2185371b32350d4e3c16e61f9b58cb976c1477cd..1d9a1343c56001e2878b9396aeef7db699c7e305 100644 (file)
@@ -109,12 +109,6 @@ bool JSString::getOwnPropertySlot(ExecState* exec, unsigned propertyName, Proper
     return JSString::getOwnPropertySlot(exec, Identifier::from(exec, propertyName), slot);
 }
 
-bool JSString::isString() const
-{
-    // FIXME: Change JSCell::isString to a non-virtual implementation like the one in Machine::isJSString.
-    return true;
-}
-
 JSString* jsString(ExecState* exec, const UString& s)
 {
     int size = s.size();
index 443994f505a54b6dc1b60f52c381a3ab8cc844fb..76cfe64578496d108e66ee49efe8783eb67a9143 100644 (file)
@@ -88,7 +88,6 @@ namespace JSC {
             : JSCell(0)
         {
         }
-        virtual bool isString() const;
 
         virtual JSValue* toPrimitive(ExecState*, PreferredPrimitiveType) const;
         virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue*& value);
index 7e224847e2558ac5c1613f31705fc5037a75f333..7637fa99ca002e83ba5b7100f8d41529a94c5def 100644 (file)
@@ -93,6 +93,8 @@ namespace JSC {
 
         bool isDictionary() const { return m_isDictionary; }
 
+        JSType type() const { return m_type; }
+
         JSValue* storedPrototype() const { return m_prototype; }
         JSValue* prototypeForLookup(ExecState*);