Changeset 98747 in webkit


Ignore:
Timestamp:
Oct 28, 2011, 12:08:24 PM (14 years ago)
Author:
mhahnenberg@apple.com
Message:

De-virtualize isGlobalObject, isVariableObject, isActivationObject, and isErrorInstance in JSObject
https://bugs.webkit.org/show_bug.cgi?id=70968

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

  • API/JSCallbackObject.cpp: Added two specializations for createStructure that use different JSTypes in their

TypeInfo. Had to also create a specialization for JSNonFinalObject, even JSGlobalObject was the only that
needed it because Windows wouldn't build without it.
(JSC::::createStructure):

  • API/JSCallbackObject.h:
  • JavaScriptCore.exp:
  • JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
  • runtime/ErrorInstance.h: Removed virtual function and changed JSType provided to TypeInfo in createStructure.

(JSC::ErrorInstance::createStructure):

  • runtime/ErrorPrototype.h: Ditto

(JSC::ErrorPrototype::createStructure):

  • runtime/JSActivation.h: Ditto

(JSC::JSActivation::createStructure):

  • runtime/JSGlobalObject.h: Ditto

(JSC::JSGlobalObject::createStructure):

  • runtime/JSObject.h: De-virtualized functions. They now check the JSType of the object for the corresponding type.

(JSC::JSObject::isGlobalObject):
(JSC::JSObject::isVariableObject):
(JSC::JSObject::isActivationObject):
(JSC::JSObject::isErrorInstance):

  • runtime/JSType.h: Added new types for GlobalObject, VariableObject, ActivationObject, and ErrorInstance.
  • runtime/JSVariableObject.cpp: Removed virtual function.
  • runtime/JSVariableObject.h: Changed JSType provided to TypeInfo in createStructure.

(JSC::JSVariableObject::createStructure):

Source/WebCore:

No new tests.

  • bindings/js/JSDOMGlobalObject.h: Changed JSType provided to TypeInfo in createStructure since this

class inherits from JSGlobalObject.
(WebCore::JSDOMGlobalObject::createStructure):

  • bindings/js/JSDOMWindowBase.h: Ditto

(WebCore::JSDOMWindowBase::createStructure):

  • bindings/js/JSWorkerContextBase.h: Ditto

(WebCore::JSWorkerContextBase::createStructure):

  • bindings/scripts/CodeGeneratorJS.pm: Added extra check to make sure subclasses of JSGlobalObject,

namely JSDOMWindow and JSWorkerContext, get their special JSType in their createStructure function.
(GenerateHeader):

Location:
trunk/Source
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/JSCallbackObject.cpp

    r95936 r98747  
    4040template <> const ClassInfo JSCallbackObject<JSGlobalObject>::s_info = { "CallbackGlobalObject", &JSGlobalObject::s_info, 0, 0, CREATE_METHOD_TABLE(JSCallbackObject) };
    4141
     42template <>
     43Structure* JSCallbackObject<JSNonFinalObject>::createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto)
     44{
     45    return Structure::create(globalData, globalObject, proto, TypeInfo(ObjectType, StructureFlags), &s_info);
     46}
     47   
     48template <>
     49Structure* JSCallbackObject<JSGlobalObject>::createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto)
     50{
     51    return Structure::create(globalData, globalObject, proto, TypeInfo(GlobalObjectType, StructureFlags), &s_info);
     52}
     53
    4254void JSCallbackObjectData::finalize(Handle<Unknown> handle, void* context)
    4355{
  • trunk/Source/JavaScriptCore/API/JSCallbackObject.h

    r98501 r98747  
    153153    bool inherits(JSClassRef) const;
    154154
    155     static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto)
    156     {
    157         return Structure::create(globalData, globalObject, proto, TypeInfo(ObjectType, StructureFlags), &s_info);
    158     }
     155    static Structure* createStructure(JSGlobalData&, JSGlobalObject*, JSValue);
    159156   
    160157    JSValue getPrivateProperty(const Identifier& propertyName) const
  • trunk/Source/JavaScriptCore/ChangeLog

    r98724 r98747  
     12011-10-28  Mark Hahnenberg  <mhahnenberg@apple.com>
     2
     3        De-virtualize isGlobalObject, isVariableObject, isActivationObject, and isErrorInstance in JSObject
     4        https://bugs.webkit.org/show_bug.cgi?id=70968
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * API/JSCallbackObject.cpp: Added two specializations for createStructure that use different JSTypes in their
     9        TypeInfo.  Had to also create a specialization for JSNonFinalObject, even JSGlobalObject was the only that
     10        needed it because Windows wouldn't build without it.
     11        (JSC::::createStructure):
     12        * API/JSCallbackObject.h:
     13        * JavaScriptCore.exp:
     14        * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
     15        * runtime/ErrorInstance.h: Removed virtual function and changed JSType provided to TypeInfo in createStructure.
     16        (JSC::ErrorInstance::createStructure):
     17        * runtime/ErrorPrototype.h: Ditto
     18        (JSC::ErrorPrototype::createStructure):
     19        * runtime/JSActivation.h: Ditto
     20        (JSC::JSActivation::createStructure):
     21        * runtime/JSGlobalObject.h: Ditto
     22        (JSC::JSGlobalObject::createStructure):
     23        * runtime/JSObject.h: De-virtualized functions.  They now check the JSType of the object for the corresponding type.
     24        (JSC::JSObject::isGlobalObject):
     25        (JSC::JSObject::isVariableObject):
     26        (JSC::JSObject::isActivationObject):
     27        (JSC::JSObject::isErrorInstance):
     28        * runtime/JSType.h: Added new types for GlobalObject, VariableObject, ActivationObject, and ErrorInstance.
     29        * runtime/JSVariableObject.cpp: Removed virtual function.
     30        * runtime/JSVariableObject.h: Changed JSType provided to TypeInfo in createStructure.
     31        (JSC::JSVariableObject::createStructure):
     32
    1332011-10-28  Pavel Feldman  <pfeldman@google.com>
    234
  • trunk/Source/JavaScriptCore/JavaScriptCore.exp

    r98624 r98747  
    534534__ZNK3JSC12PropertySlot14functionGetterEPNS_9ExecStateE
    535535__ZNK3JSC14JSGlobalObject14isDynamicScopeERb
    536 __ZNK3JSC16JSVariableObject16isVariableObjectEv
    537536__ZNK3JSC17DebuggerCallFrame10thisObjectEv
    538537__ZNK3JSC17DebuggerCallFrame12functionNameEv
  • trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def

    r98624 r98747  
    234234    ?isValidAllocation@Heap@JSC@@AAE_NI@Z
    235235    ?isValidCallee@JSValue@JSC@@QAE_NXZ
    236     ?isVariableObject@JSVariableObject@JSC@@UBE_NXZ
    237236    ?jsOwnedString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z
    238237    ?jsString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z
  • trunk/Source/JavaScriptCore/runtime/ErrorInstance.h

    r94929 r98747  
    3434        static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
    3535        {
    36             return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
     36            return Structure::create(globalData, globalObject, prototype, TypeInfo(ErrorInstanceType, StructureFlags), &s_info);
    3737        }
    3838
     
    5757        void clearAppendSourceToMessage() { m_appendSourceToMessage = false; }
    5858
    59         virtual bool isErrorInstance() const { return true; }
    60 
    6159    protected:
    6260        explicit ErrorInstance(JSGlobalData&, Structure*);
  • trunk/Source/JavaScriptCore/runtime/ErrorPrototype.h

    r98501 r98747  
    4343        static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
    4444        {
    45             return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
     45            return Structure::create(globalData, globalObject, prototype, TypeInfo(ErrorInstanceType, StructureFlags), &s_info);
    4646        }
    4747
  • trunk/Source/JavaScriptCore/runtime/JSActivation.h

    r98593 r98747  
    6060        virtual bool isDynamicScope(bool& requiresDynamicChecks) const;
    6161
    62         virtual bool isActivationObject() const { return true; }
    63 
    6462        static bool getOwnPropertySlot(JSCell*, ExecState*, const Identifier&, PropertySlot&);
    6563        virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode);
     
    7674        static const ClassInfo s_info;
    7775
    78         static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto) { return Structure::create(globalData, globalObject, proto, TypeInfo(ObjectType, StructureFlags), &s_info); }
     76        static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto) { return Structure::create(globalData, globalObject, proto, TypeInfo(ActivationObjectType, StructureFlags), &s_info); }
    7977
    8078    protected:
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h

    r98501 r98747  
    268268        ScopeChainNode* globalScopeChain() { return m_globalScopeChain.get(); }
    269269
    270         virtual bool isGlobalObject() const { return true; }
    271 
    272270        ExecState* globalExec();
    273271
     
    289287        static Structure* createStructure(JSGlobalData& globalData, JSValue prototype)
    290288        {
    291             return Structure::create(globalData, 0, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
     289            return Structure::create(globalData, 0, prototype, TypeInfo(GlobalObjectType, StructureFlags), &s_info);
    292290        }
    293291
  • trunk/Source/JavaScriptCore/runtime/JSObject.h

    r98593 r98747  
    192192        virtual bool defineOwnProperty(ExecState*, const Identifier& propertyName, PropertyDescriptor&, bool shouldThrow);
    193193
    194         virtual bool isGlobalObject() const { return false; }
    195         virtual bool isVariableObject() const { return false; }
    196         virtual bool isActivationObject() const { return false; }
    197         virtual bool isErrorInstance() const { return false; }
     194        bool isGlobalObject() const;
     195        bool isVariableObject() const;
     196        bool isActivationObject() const;
     197        bool isErrorInstance() const;
    198198
    199199        void seal(JSGlobalData&);
     
    403403{
    404404    return OBJECT_OFFSETOF(JSObject, m_inheritorID);
     405}
     406
     407inline bool JSObject::isGlobalObject() const
     408{
     409    return structure()->typeInfo().type() == GlobalObjectType;
     410}
     411
     412inline bool JSObject::isVariableObject() const
     413{
     414    return structure()->typeInfo().type() >= VariableObjectType;
     415}
     416
     417inline bool JSObject::isActivationObject() const
     418{
     419    return structure()->typeInfo().type() == ActivationObjectType;
     420}
     421
     422inline bool JSObject::isErrorInstance() const
     423{
     424    return structure()->typeInfo().type() == ErrorInstanceType;
    405425}
    406426
  • trunk/Source/JavaScriptCore/runtime/JSType.h

    r95893 r98747  
    4343    JSFunctionType      = 12,
    4444    NumberObjectType    = 13,
     45    ErrorInstanceType   = 14,
     46
     47    // VariableObjectType must be less than all of the types of its subclasses and only its subclasses.
     48    VariableObjectType  = 15,
     49    GlobalObjectType    = 16,
     50    ActivationObjectType = 17,
    4551};
    4652
  • trunk/Source/JavaScriptCore/runtime/JSVariableObject.cpp

    r98422 r98747  
    5555}
    5656
    57 bool JSVariableObject::isVariableObject() const
    58 {
    59     return true;
    60 }
    61 
    6257bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertyDescriptor& descriptor)
    6358{
  • trunk/Source/JavaScriptCore/runtime/JSVariableObject.h

    r98422 r98747  
    5454        virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
    5555       
    56         virtual bool isVariableObject() const;
    5756        virtual bool isDynamicScope(bool& requiresDynamicChecks) const = 0;
    5857
     
    6463        static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
    6564        {
    66             return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
     65            return Structure::create(globalData, globalObject, prototype, TypeInfo(VariableObjectType, StructureFlags), &s_info);
    6766        }
    6867       
  • trunk/Source/WebCore/ChangeLog

    r98745 r98747  
     12011-10-28  Mark Hahnenberg  <mhahnenberg@apple.com>
     2
     3        De-virtualize isGlobalObject, isVariableObject, isActivationObject, and isErrorInstance in JSObject
     4        https://bugs.webkit.org/show_bug.cgi?id=70968
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        No new tests.
     9
     10        * bindings/js/JSDOMGlobalObject.h: Changed JSType provided to TypeInfo in createStructure since this
     11        class inherits from JSGlobalObject.
     12        (WebCore::JSDOMGlobalObject::createStructure):
     13        * bindings/js/JSDOMWindowBase.h: Ditto
     14        (WebCore::JSDOMWindowBase::createStructure):
     15        * bindings/js/JSWorkerContextBase.h: Ditto
     16        (WebCore::JSWorkerContextBase::createStructure):
     17        * bindings/scripts/CodeGeneratorJS.pm: Added extra check to make sure subclasses of JSGlobalObject,
     18        namely JSDOMWindow and JSWorkerContext, get their special JSType in their createStructure function.
     19        (GenerateHeader):
     20
    1212011-10-28  Sheriff Bot  <webkit.review.bot@gmail.com>
    222
  • trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h

    r96836 r98747  
    7676        static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSValue prototype)
    7777        {
    78             return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);
     78            return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);
    7979        }
    8080
  • trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h

    r98593 r98747  
    5454        static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSValue prototype)
    5555        {
    56             return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);
     56            return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);
    5757        }
    5858
  • trunk/Source/WebCore/bindings/js/JSWorkerContextBase.h

    r96836 r98747  
    5151        static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
    5252        {
    53             return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);
     53            return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);
    5454        }
    5555
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r98679 r98747  
    809809        $structureFlags{"JSC::ImplementsHasInstance"} = 1;
    810810    }
    811     push(@headerContent,
    812         "    static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)\n" .
    813         "    {\n" .
    814         "        return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);\n" .
    815         "    }\n\n");
     811    push(@headerContent, "    static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)\n");
     812    push(@headerContent, "    {\n");
     813    if ($interfaceName eq "DOMWindow" || $dataNode->extendedAttributes->{"IsWorkerContext"}) {
     814        push(@headerContent, "        return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);\n");
     815    } else {
     816        push(@headerContent, "        return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);\n");
     817    }
     818    push(@headerContent, "    }\n\n");
    816819
    817820    # Custom pushEventHandlerScope function
Note: See TracChangeset for help on using the changeset viewer.