Title: [98747] trunk/Source
Revision
98747
Author
[email protected]
Date
2011-10-28 12:08:24 -0700 (Fri, 28 Oct 2011)

Log Message

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

Reviewed by Geoffrey Garen.

Source/_javascript_Core: 

* 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:
* _javascript_Core.exp:
* _javascript_Core.vcproj/_javascript_Core/_javascript_Core.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):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/API/JSCallbackObject.cpp (98746 => 98747)


--- trunk/Source/_javascript_Core/API/JSCallbackObject.cpp	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/API/JSCallbackObject.cpp	2011-10-28 19:08:24 UTC (rev 98747)
@@ -39,6 +39,18 @@
 template <> const ClassInfo JSCallbackObject<JSNonFinalObject>::s_info = { "CallbackObject", &JSNonFinalObject::s_info, 0, 0, CREATE_METHOD_TABLE(JSCallbackObject) };
 template <> const ClassInfo JSCallbackObject<JSGlobalObject>::s_info = { "CallbackGlobalObject", &JSGlobalObject::s_info, 0, 0, CREATE_METHOD_TABLE(JSCallbackObject) };
 
+template <>
+Structure* JSCallbackObject<JSNonFinalObject>::createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto)
+{ 
+    return Structure::create(globalData, globalObject, proto, TypeInfo(ObjectType, StructureFlags), &s_info); 
+}
+    
+template <>
+Structure* JSCallbackObject<JSGlobalObject>::createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto)
+{ 
+    return Structure::create(globalData, globalObject, proto, TypeInfo(GlobalObjectType, StructureFlags), &s_info); 
+}
+
 void JSCallbackObjectData::finalize(Handle<Unknown> handle, void* context)
 {
     JSClassRef jsClass = static_cast<JSClassRef>(context);

Modified: trunk/Source/_javascript_Core/API/JSCallbackObject.h (98746 => 98747)


--- trunk/Source/_javascript_Core/API/JSCallbackObject.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/API/JSCallbackObject.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -152,10 +152,7 @@
     JSClassRef classRef() const { return m_callbackObjectData->jsClass; }
     bool inherits(JSClassRef) const;
 
-    static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto) 
-    { 
-        return Structure::create(globalData, globalObject, proto, TypeInfo(ObjectType, StructureFlags), &s_info); 
-    }
+    static Structure* createStructure(JSGlobalData&, JSGlobalObject*, JSValue);
     
     JSValue getPrivateProperty(const Identifier& propertyName) const
     {

Modified: trunk/Source/_javascript_Core/ChangeLog (98746 => 98747)


--- trunk/Source/_javascript_Core/ChangeLog	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-10-28 19:08:24 UTC (rev 98747)
@@ -1,3 +1,35 @@
+2011-10-28  Mark Hahnenberg  <[email protected]>
+
+        De-virtualize isGlobalObject, isVariableObject, isActivationObject, and isErrorInstance in JSObject
+        https://bugs.webkit.org/show_bug.cgi?id=70968
+
+        Reviewed by Geoffrey Garen.
+
+        * 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:
+        * _javascript_Core.exp:
+        * _javascript_Core.vcproj/_javascript_Core/_javascript_Core.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):
+
 2011-10-28  Pavel Feldman  <[email protected]>
 
         Reset line numbers for scripts generated with document.write.

Modified: trunk/Source/_javascript_Core/_javascript_Core.exp (98746 => 98747)


--- trunk/Source/_javascript_Core/_javascript_Core.exp	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/_javascript_Core.exp	2011-10-28 19:08:24 UTC (rev 98747)
@@ -533,7 +533,6 @@
 __ZNK3JSC11Interpreter18retrieveLastCallerEPNS_9ExecStateERiRlRNS_7UStringERNS_7JSValueE
 __ZNK3JSC12PropertySlot14functionGetterEPNS_9ExecStateE
 __ZNK3JSC14JSGlobalObject14isDynamicScopeERb
-__ZNK3JSC16JSVariableObject16isVariableObjectEv
 __ZNK3JSC17DebuggerCallFrame10thisObjectEv
 __ZNK3JSC17DebuggerCallFrame12functionNameEv
 __ZNK3JSC17DebuggerCallFrame22calculatedFunctionNameEv

Modified: trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def (98746 => 98747)


--- trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/_javascript_Core.vcproj/_javascript_Core/_javascript_Core.def	2011-10-28 19:08:24 UTC (rev 98747)
@@ -233,7 +233,6 @@
     ?isTerminatedExecutionException@JSC@@YA_NVJSValue@1@@Z
     ?isValidAllocation@Heap@JSC@@AAE_NI@Z
     ?isValidCallee@JSValue@JSC@@QAE_NXZ
-    ?isVariableObject@JSVariableObject@JSC@@UBE_NXZ
     ?jsOwnedString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z
     ?jsString@JSC@@YAPAVJSString@1@PAVJSGlobalData@1@ABVUString@1@@Z
     ?length@CString@WTF@@QBEIXZ

Modified: trunk/Source/_javascript_Core/runtime/ErrorInstance.h (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/ErrorInstance.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/ErrorInstance.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -33,7 +33,7 @@
 
         static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
         {
-            return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
+            return Structure::create(globalData, globalObject, prototype, TypeInfo(ErrorInstanceType, StructureFlags), &s_info);
         }
 
         static ErrorInstance* create(JSGlobalData& globalData, Structure* structure, const UString& message)
@@ -56,8 +56,6 @@
         void setAppendSourceToMessage() { m_appendSourceToMessage = true; }
         void clearAppendSourceToMessage() { m_appendSourceToMessage = false; }
 
-        virtual bool isErrorInstance() const { return true; }
-
     protected:
         explicit ErrorInstance(JSGlobalData&, Structure*);
 

Modified: trunk/Source/_javascript_Core/runtime/ErrorPrototype.h (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/ErrorPrototype.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/ErrorPrototype.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -42,7 +42,7 @@
 
         static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
         {
-            return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
+            return Structure::create(globalData, globalObject, prototype, TypeInfo(ErrorInstanceType, StructureFlags), &s_info);
         }
 
     protected:

Modified: trunk/Source/_javascript_Core/runtime/JSActivation.h (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/JSActivation.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/JSActivation.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -59,8 +59,6 @@
 
         virtual bool isDynamicScope(bool& requiresDynamicChecks) const;
 
-        virtual bool isActivationObject() const { return true; }
-
         static bool getOwnPropertySlot(JSCell*, ExecState*, const Identifier&, PropertySlot&);
         virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode);
 
@@ -75,7 +73,7 @@
         
         static const ClassInfo s_info;
 
-        static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto) { return Structure::create(globalData, globalObject, proto, TypeInfo(ObjectType, StructureFlags), &s_info); }
+        static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto) { return Structure::create(globalData, globalObject, proto, TypeInfo(ActivationObjectType, StructureFlags), &s_info); }
 
     protected:
         void finishCreation(CallFrame*);

Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.h (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -267,8 +267,6 @@
 
         ScopeChainNode* globalScopeChain() { return m_globalScopeChain.get(); }
 
-        virtual bool isGlobalObject() const { return true; }
-
         ExecState* globalExec();
 
         virtual bool shouldInterruptScript() const { return true; }
@@ -288,7 +286,7 @@
 
         static Structure* createStructure(JSGlobalData& globalData, JSValue prototype)
         {
-            return Structure::create(globalData, 0, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
+            return Structure::create(globalData, 0, prototype, TypeInfo(GlobalObjectType, StructureFlags), &s_info);
         }
 
         void registerWeakMap(OpaqueJSWeakObjectMap* map)

Modified: trunk/Source/_javascript_Core/runtime/JSObject.h (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/JSObject.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/JSObject.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -191,10 +191,10 @@
         virtual JSValue lookupSetter(ExecState*, const Identifier& propertyName);
         virtual bool defineOwnProperty(ExecState*, const Identifier& propertyName, PropertyDescriptor&, bool shouldThrow);
 
-        virtual bool isGlobalObject() const { return false; }
-        virtual bool isVariableObject() const { return false; }
-        virtual bool isActivationObject() const { return false; }
-        virtual bool isErrorInstance() const { return false; }
+        bool isGlobalObject() const;
+        bool isVariableObject() const;
+        bool isActivationObject() const;
+        bool isErrorInstance() const;
 
         void seal(JSGlobalData&);
         void freeze(JSGlobalData&);
@@ -404,6 +404,26 @@
     return OBJECT_OFFSETOF(JSObject, m_inheritorID);
 }
 
+inline bool JSObject::isGlobalObject() const
+{
+    return structure()->typeInfo().type() == GlobalObjectType;
+}
+
+inline bool JSObject::isVariableObject() const
+{
+    return structure()->typeInfo().type() >= VariableObjectType;
+}
+
+inline bool JSObject::isActivationObject() const
+{
+    return structure()->typeInfo().type() == ActivationObjectType;
+}
+
+inline bool JSObject::isErrorInstance() const
+{
+    return structure()->typeInfo().type() == ErrorInstanceType;
+}
+
 inline JSObject* constructEmptyObject(ExecState* exec, Structure* structure)
 {
     return JSFinalObject::create(exec, structure);

Modified: trunk/Source/_javascript_Core/runtime/JSType.h (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/JSType.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/JSType.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -42,6 +42,12 @@
     FinalObjectType     = 11,
     JSFunctionType      = 12,
     NumberObjectType    = 13,
+    ErrorInstanceType   = 14,
+
+    // VariableObjectType must be less than all of the types of its subclasses and only its subclasses.
+    VariableObjectType  = 15,
+    GlobalObjectType    = 16,
+    ActivationObjectType = 17,
 };
 
 } // namespace JSC

Modified: trunk/Source/_javascript_Core/runtime/JSVariableObject.cpp (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/JSVariableObject.cpp	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/JSVariableObject.cpp	2011-10-28 19:08:24 UTC (rev 98747)
@@ -54,11 +54,6 @@
     JSObject::getOwnPropertyNames(exec, propertyNames, mode);
 }
 
-bool JSVariableObject::isVariableObject() const
-{
-    return true;
-}
-
 bool JSVariableObject::symbolTableGet(const Identifier& propertyName, PropertyDescriptor& descriptor)
 {
     SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl());

Modified: trunk/Source/_javascript_Core/runtime/JSVariableObject.h (98746 => 98747)


--- trunk/Source/_javascript_Core/runtime/JSVariableObject.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/_javascript_Core/runtime/JSVariableObject.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -53,7 +53,6 @@
         static bool deleteProperty(JSCell*, ExecState*, const Identifier&);
         virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
         
-        virtual bool isVariableObject() const;
         virtual bool isDynamicScope(bool& requiresDynamicChecks) const = 0;
 
         WriteBarrier<Unknown>& registerAt(int index) const { return m_registers[index]; }
@@ -63,7 +62,7 @@
 
         static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype)
         {
-            return Structure::create(globalData, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), &s_info);
+            return Structure::create(globalData, globalObject, prototype, TypeInfo(VariableObjectType, StructureFlags), &s_info);
         }
         
     protected:

Modified: trunk/Source/WebCore/ChangeLog (98746 => 98747)


--- trunk/Source/WebCore/ChangeLog	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/WebCore/ChangeLog	2011-10-28 19:08:24 UTC (rev 98747)
@@ -1,3 +1,23 @@
+2011-10-28  Mark Hahnenberg  <[email protected]>
+
+        De-virtualize isGlobalObject, isVariableObject, isActivationObject, and isErrorInstance in JSObject
+        https://bugs.webkit.org/show_bug.cgi?id=70968
+
+        Reviewed by Geoffrey Garen.
+
+        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):
+
 2011-10-28  Sheriff Bot  <[email protected]>
 
         Unreviewed, rolling out r98736.

Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h (98746 => 98747)


--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -75,7 +75,7 @@
 
         static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSValue prototype)
         {
-            return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);
+            return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);
         }
 
     protected:

Modified: trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h (98746 => 98747)


--- trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -53,7 +53,7 @@
 
         static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSValue prototype)
         {
-            return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);
+            return JSC::Structure::create(globalData, 0, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);
         }
 
         virtual bool supportsProfiling() const;

Modified: trunk/Source/WebCore/bindings/js/JSWorkerContextBase.h (98746 => 98747)


--- trunk/Source/WebCore/bindings/js/JSWorkerContextBase.h	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/WebCore/bindings/js/JSWorkerContextBase.h	2011-10-28 19:08:24 UTC (rev 98747)
@@ -50,7 +50,7 @@
 
         static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
         {
-            return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);
+            return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);
         }
 
     protected:

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (98746 => 98747)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm	2011-10-28 18:57:35 UTC (rev 98746)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm	2011-10-28 19:08:24 UTC (rev 98747)
@@ -808,11 +808,14 @@
     if ($interfaceName eq "DOMWindow") {
         $structureFlags{"JSC::ImplementsHasInstance"} = 1;
     }
-    push(@headerContent,
-        "    static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)\n" .
-        "    {\n" .
-        "        return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);\n" .
-        "    }\n\n");
+    push(@headerContent, "    static JSC::Structure* createStructure(JSC::JSGlobalData& globalData, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)\n");
+    push(@headerContent, "    {\n");
+    if ($interfaceName eq "DOMWindow" || $dataNode->extendedAttributes->{"IsWorkerContext"}) {
+        push(@headerContent, "        return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::GlobalObjectType, StructureFlags), &s_info);\n");
+    } else {
+        push(@headerContent, "        return JSC::Structure::create(globalData, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), &s_info);\n");
+    }
+    push(@headerContent, "    }\n\n");
 
     # Custom pushEventHandlerScope function
     push(@headerContent, "    virtual JSC::ScopeChainNode* pushEventHandlerScope(JSC::ExecState*, JSC::ScopeChainNode*) const;\n\n") if $dataNode->extendedAttributes->{"CustomPushEventHandlerScope"};
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to