https://bugs.webkit.org/show_bug.cgi?id=68839
Reviewed by Geoffrey Garen.
Source/JavaScriptCore:
Removed the remaining visitChildrenVirtual methods. This patch completes the process of
de-virtualizing visitChildren.
* API/JSCallbackObject.h:
* JavaScriptCore.exp:
* JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
* debugger/DebuggerActivation.cpp:
* debugger/DebuggerActivation.h:
* runtime/Arguments.cpp:
* runtime/Arguments.h:
* runtime/Executable.cpp:
* runtime/Executable.h:
* runtime/GetterSetter.cpp:
* runtime/GetterSetter.h:
* runtime/JSActivation.cpp:
* runtime/JSActivation.h:
* runtime/JSArray.cpp:
* runtime/JSArray.h:
* runtime/JSFunction.cpp:
* runtime/JSFunction.h:
* runtime/JSGlobalObject.cpp:
* runtime/JSGlobalObject.h:
* runtime/JSObject.cpp:
* runtime/JSPropertyNameIterator.cpp:
* runtime/JSPropertyNameIterator.h:
* runtime/JSStaticScopeObject.cpp:
* runtime/JSStaticScopeObject.h:
* runtime/JSValue.h:
* runtime/NativeErrorConstructor.cpp:
* runtime/NativeErrorConstructor.h:
* runtime/RegExpObject.cpp:
* runtime/RegExpObject.h:
* runtime/Structure.cpp:
* runtime/Structure.h:
* runtime/StructureChain.cpp:
* runtime/StructureChain.h:
Inlined the method table access and call to the visitChildren function (the only call sites
to visitChildren are here).
* heap/MarkStack.cpp:
(JSC::SlotVisitor::visitChildren):
Changed the field name for the visitChildren function pointer to visitChildren (from
visitChildrenFunctionPtr) to make call sites less verbose.
* runtime/ClassInfo.h:
Discovered JSBoundFunction doesn't have its own ClassInfo (it used JSFunction's ClassInfo) but
overrides visitChildren, so it needs to have its own ClassInfo.
* runtime/JSBoundFunction.cpp:
* runtime/JSBoundFunction.h:
Had to move className up to make sure that the virtual destructor in JSObject wasn't
the first non-inline virtual method in JSObject (as per the comment in the file).
Also moved JSCell::visitChildrenVirtual into JSObject.h in order for it be inline-able
to mitigate the cost of an extra method call.
Also added a convenience accessor function methodTable() to JSCell to return the MethodTable to make
call sites more concise. Implementation is inline in JSObject.h.
* runtime/JSObject.h:
(JSC::JSCell::methodTable):
* runtime/JSCell.h:
Added an out of line virtual destructor to JSWrapperObject and ScopeChainNode to
appease the vtable gods. It refused to compile if there were no virtual methods in
both of these classes due to the presence of a weak vtable pointer.
* runtime/JSWrapperObject.cpp:
(JSC::JSWrapperObject::~JSWrapperObject):
* runtime/JSWrapperObject.h:
* runtime/ScopeChain.cpp:
(JSC::ScopeChainNode::~ScopeChainNode):
* runtime/ScopeChain.h:
Source/JavaScriptGlue:
Removed the remaining visitChildrenVirtual methods. This patch completes the process of
de-virtualizing visitChildren.
* UserObjectImp.cpp:
* UserObjectImp.h:
Source/WebCore:
No new tests.
Removed the remaining visitChildrenVirtual methods. This patch completes the process of
de-virtualizing visitChildren.
* WebCore.exp.in:
* bindings/js/JSAttrCustom.cpp:
* bindings/js/JSAudioContextCustom.cpp:
* bindings/js/JSCSSRuleCustom.cpp:
* bindings/js/JSCSSStyleDeclarationCustom.cpp:
* bindings/js/JSCanvasRenderingContextCustom.cpp:
* bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::~JSDOMGlobalObject):
(WebCore::JSDOMGlobalObject::finishCreation):
* bindings/js/JSDOMGlobalObject.h:
* bindings/js/JSDOMWindowCustom.cpp:
* bindings/js/JSDOMWindowShell.cpp:
* bindings/js/JSDOMWindowShell.h:
* bindings/js/JSJavaScriptAudioNodeCustom.cpp:
* bindings/js/JSMessageChannelCustom.cpp:
* bindings/js/JSMessagePortCustom.cpp:
* bindings/js/JSNamedNodeMapCustom.cpp:
* bindings/js/JSNodeCustom.cpp:
* bindings/js/JSNodeFilterCustom.cpp:
* bindings/js/JSNodeIteratorCustom.cpp:
* bindings/js/JSSVGElementInstanceCustom.cpp:
* bindings/js/JSSharedWorkerCustom.cpp:
* bindings/js/JSStyleSheetCustom.cpp:
* bindings/js/JSTreeWalkerCustom.cpp:
* bindings/js/JSWebGLRenderingContextCustom.cpp:
* bindings/js/JSWorkerContextCustom.cpp:
* bindings/js/JSXMLHttpRequestCustom.cpp:
* bindings/js/JSXPathResultCustom.cpp:
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateHeader):
(GenerateImplementation):
* bridge/qt/qt_instance.cpp:
* bridge/qt/qt_runtime.cpp:
* bridge/qt/qt_runtime.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@96346
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
virtual CallType getCallDataVirtual(CallData&);
static CallType getCallData(JSCell*, CallData&);
- virtual void visitChildrenVirtual(SlotVisitor& visitor)
- {
- visitChildren(this, visitor);
- }
-
static void visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSCallbackObject* thisObject = static_cast<JSCallbackObject*>(cell);
+2011-09-29 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ De-virtualize JSCell::visitChildrenVirtual and remove all other visitChildrenVirtual methods
+ https://bugs.webkit.org/show_bug.cgi?id=68839
+
+ Reviewed by Geoffrey Garen.
+
+ Removed the remaining visitChildrenVirtual methods. This patch completes the process of
+ de-virtualizing visitChildren.
+
+ * API/JSCallbackObject.h:
+ * JavaScriptCore.exp:
+ * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def:
+ * debugger/DebuggerActivation.cpp:
+ * debugger/DebuggerActivation.h:
+ * runtime/Arguments.cpp:
+ * runtime/Arguments.h:
+ * runtime/Executable.cpp:
+ * runtime/Executable.h:
+ * runtime/GetterSetter.cpp:
+ * runtime/GetterSetter.h:
+ * runtime/JSActivation.cpp:
+ * runtime/JSActivation.h:
+ * runtime/JSArray.cpp:
+ * runtime/JSArray.h:
+ * runtime/JSFunction.cpp:
+ * runtime/JSFunction.h:
+ * runtime/JSGlobalObject.cpp:
+ * runtime/JSGlobalObject.h:
+ * runtime/JSObject.cpp:
+ * runtime/JSPropertyNameIterator.cpp:
+ * runtime/JSPropertyNameIterator.h:
+ * runtime/JSStaticScopeObject.cpp:
+ * runtime/JSStaticScopeObject.h:
+ * runtime/JSValue.h:
+ * runtime/NativeErrorConstructor.cpp:
+ * runtime/NativeErrorConstructor.h:
+ * runtime/RegExpObject.cpp:
+ * runtime/RegExpObject.h:
+ * runtime/Structure.cpp:
+ * runtime/Structure.h:
+ * runtime/StructureChain.cpp:
+ * runtime/StructureChain.h:
+
+ Inlined the method table access and call to the visitChildren function (the only call sites
+ to visitChildren are here).
+ * heap/MarkStack.cpp:
+ (JSC::SlotVisitor::visitChildren):
+
+ Changed the field name for the visitChildren function pointer to visitChildren (from
+ visitChildrenFunctionPtr) to make call sites less verbose.
+ * runtime/ClassInfo.h:
+
+ Discovered JSBoundFunction doesn't have its own ClassInfo (it used JSFunction's ClassInfo) but
+ overrides visitChildren, so it needs to have its own ClassInfo.
+ * runtime/JSBoundFunction.cpp:
+ * runtime/JSBoundFunction.h:
+
+ Had to move className up to make sure that the virtual destructor in JSObject wasn't
+ the first non-inline virtual method in JSObject (as per the comment in the file).
+ Also moved JSCell::visitChildrenVirtual into JSObject.h in order for it be inline-able
+ to mitigate the cost of an extra method call.
+
+ Also added a convenience accessor function methodTable() to JSCell to return the MethodTable to make
+ call sites more concise. Implementation is inline in JSObject.h.
+ * runtime/JSObject.h:
+ (JSC::JSCell::methodTable):
+ * runtime/JSCell.h:
+
+ Added an out of line virtual destructor to JSWrapperObject and ScopeChainNode to
+ appease the vtable gods. It refused to compile if there were no virtual methods in
+ both of these classes due to the presence of a weak vtable pointer.
+ * runtime/JSWrapperObject.cpp:
+ (JSC::JSWrapperObject::~JSWrapperObject):
+ * runtime/JSWrapperObject.h:
+ * runtime/ScopeChain.cpp:
+ (JSC::ScopeChainNode::~ScopeChainNode):
+ * runtime/ScopeChain.h:
+
2011-09-29 Yuqiang Xian <yuqiang.xian@intel.com>
Bug fixes for CreateThis, NewObject and GetByOffset in JSVALUE32_64 DFG JIT
__ZN3JSC14JSGlobalObject16addStaticGlobalsEPNS0_18GlobalPropertyInfoEi
__ZN3JSC14JSGlobalObject17putWithAttributesEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueEj
__ZN3JSC14JSGlobalObject18getOwnPropertySlotEPNS_9ExecStateERKNS_10IdentifierERNS_12PropertySlotE
-__ZN3JSC14JSGlobalObject20visitChildrenVirtualERNS_11SlotVisitorE
__ZN3JSC14JSGlobalObject24getOwnPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE
__ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierENS_7JSValueERNS_15PutPropertySlotE
__ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE
__ZN3JSC7JSArray14finishCreationERNS_12JSGlobalDataERKNS_7ArgListE
__ZN3JSC7JSArray15setSubclassDataEPv
__ZN3JSC7JSArray18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE
-__ZN3JSC7JSArray20visitChildrenVirtualERNS_11SlotVisitorE
__ZN3JSC7JSArray6s_infoE
__ZN3JSC7JSArray9setLengthEj
__ZN3JSC7JSArrayC1ERNS_12JSGlobalDataEPNS_9StructureE
__ZN3JSC8JSObject17putWithAttributesEPNS_9ExecStateEjNS_7JSValueEj
__ZN3JSC8JSObject18getOwnPropertySlotEPNS_9ExecStateEjRNS_12PropertySlotE
__ZN3JSC8JSObject19getOwnPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayENS_15EnumerationModeE
-__ZN3JSC8JSObject20visitChildrenVirtualERNS_11SlotVisitorE
__ZN3JSC8JSObject21getPropertyDescriptorEPNS_9ExecStateERKNS_10IdentifierERNS_18PropertyDescriptorE
__ZN3JSC8JSObject22fillGetterPropertySlotERNS_12PropertySlotEPNS_16WriteBarrierBaseINS_7UnknownEEE
__ZN3JSC8JSObject23allocatePropertyStorageERNS_12JSGlobalDataEmm
??1JSGlobalObject@JSC@@UAE@XZ
??1Mutex@WTF@@QAE@XZ
??1RefCountedLeakCounter@WTF@@QAE@XZ
+ ??1ScopeChainNode@JSC@@EAE@XZ
??1SourceProviderCache@JSC@@QAE@XZ
??1ThreadCondition@WTF@@QAE@XZ
??1WTFThreadData@WTF@@QAE@XZ
?vtableAnchor@InternalFunction@JSC@@EAEXXZ
?visitChildren@JSGlobalObject@JSC@@SAXPAVJSCell@2@AAVSlotVisitor@2@@Z
?visitChildren@JSObject@JSC@@SAXPAVJSCell@2@AAVSlotVisitor@2@@Z
- ?visitChildrenVirtual@JSGlobalObject@JSC@@UAEXAAVSlotVisitor@2@@Z
- ?visitChildrenVirtual@JSObject@JSC@@UAEXAAVSlotVisitor@2@@Z
- ?visitChildrenVirtual@ScopeChainNode@JSC@@UAEXAAVSlotVisitor@2@@Z
?wait@ThreadCondition@WTF@@QAEXAAVMutex@2@@Z
?waitForThreadCompletion@WTF@@YAHIPAPAX@Z
?writable@PropertyDescriptor@JSC@@QBE_NXZ
m_activation.set(globalData, this, static_cast<JSActivation*>(activation));
}
-void DebuggerActivation::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void DebuggerActivation::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
DebuggerActivation* thisObject = static_cast<DebuggerActivation*>(cell);
return activation;
}
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
virtual UString className() const;
virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
#else
ASSERT(!m_isCheckingForDefaultMarkViolation);
m_isCheckingForDefaultMarkViolation = true;
- cell->visitChildrenVirtual(*this);
+ cell->methodTable()->visitChildren(cell, *this);
ASSERT(m_isCheckingForDefaultMarkViolation);
m_isCheckingForDefaultMarkViolation = false;
#endif
asArray(cell)->visitChildrenDirect(*this);
return;
}
- cell->visitChildrenVirtual(*this);
+ cell->methodTable()->visitChildren(cell, *this);
}
void SlotVisitor::drain()
delete [] d->extraArguments;
}
-void Arguments::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void Arguments::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
Arguments* thisObject = static_cast<Arguments*>(cell);
static const ClassInfo s_info;
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
void fillArgList(ExecState*, MarkedArgumentBuffer&);
struct MethodTable {
typedef void (*VisitChildrenFunctionPtr)(JSCell*, SlotVisitor&);
- VisitChildrenFunctionPtr visitChildrenFunctionPtr;
+ VisitChildrenFunctionPtr visitChildren;
};
#define CREATE_METHOD_TABLE(ClassName) { \
}
#endif
-void EvalExecutable::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void EvalExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
EvalExecutable* thisObject = static_cast<EvalExecutable*>(cell);
#endif
}
-void ProgramExecutable::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void ProgramExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
ProgramExecutable* thisObject = static_cast<ProgramExecutable*>(cell);
}
#endif
-void FunctionExecutable::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void FunctionExecutable::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
FunctionExecutable* thisObject = static_cast<FunctionExecutable*>(cell);
EvalExecutable(ExecState*, const SourceCode&, bool);
JSObject* compileInternal(ExecState*, ScopeChainNode*, JITCode::JITType);
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
void unlinkCalls();
ProgramExecutable(ExecState*, const SourceCode&);
JSObject* compileInternal(ExecState*, ScopeChainNode*, JITCode::JITType);
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
void unlinkCalls();
SharedSymbolTable* symbolTable() const { return m_symbolTable; }
void discardCode();
- void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
static FunctionExecutable* fromGlobalCode(const Identifier&, ExecState*, Debugger*, const SourceCode&, JSObject** exception);
static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto)
const ClassInfo GetterSetter::s_info = { "GetterSetter", 0, 0, 0, CREATE_METHOD_TABLE(GetterSetter) };
-void GetterSetter::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void GetterSetter::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
GetterSetter* thisObject = static_cast<GetterSetter*>(cell);
return getterSetter;
}
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
JSObject* getter() const { return m_getter.get(); }
static_cast<SharedSymbolTable*>(m_symbolTable)->deref();
}
-void JSActivation::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSActivation::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSActivation* thisObject = static_cast<JSActivation*>(cell);
virtual ~JSActivation();
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
virtual bool isDynamicScope(bool& requiresDynamicChecks) const;
vector[i].clear();
}
-void JSArray::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSArray::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSArray* thisObject = static_cast<JSArray*>(cell);
virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
virtual bool deleteProperty(ExecState*, unsigned propertyName);
virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
void* subclassData() const;
ASSERT_CLASS_FITS_IN_CELL(JSBoundFunction);
+const ClassInfo JSBoundFunction::s_info = { "Function", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSBoundFunction) };
+
EncodedJSValue JSC_HOST_CALL boundFunctionCall(ExecState* exec)
{
JSBoundFunction* boundFunction = static_cast<JSBoundFunction*>(exec->callee());
ASSERT(inherits(&s_info));
}
-void JSBoundFunction::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSBoundFunction::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSBoundFunction* thisObject = static_cast<JSBoundFunction*>(cell);
return Structure::create(globalData, globalObject, prototype, TypeInfo(JSFunctionType, StructureFlags), &s_info);
}
+ static JS_EXPORTDATA const ClassInfo s_info;
+
protected:
- const static unsigned StructureFlags = OverridesHasInstance | Base::StructureFlags;
+ const static unsigned StructureFlags = OverridesHasInstance | OverridesVisitChildren | Base::StructureFlags;
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
private:
virtual UString toString(ExecState*) const;
virtual JSObject* toObject(ExecState*, JSGlobalObject*) const;
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
// Object operations, with the toObject operation included.
const ClassInfo* classInfo() const;
+ const MethodTable* methodTable() const;
virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
virtual void put(ExecState*, unsigned propertyName, JSValue);
virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
return m_structure.get();
}
- inline void JSCell::visitChildrenVirtual(SlotVisitor& visitor)
- {
- visitChildren(this, visitor);
- }
-
inline void JSCell::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSCell* thisObject = static_cast<JSCell*>(cell);
return name(exec);
}
-void JSFunction::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSFunction::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSFunction* thisObject = static_cast<JSFunction*>(cell);
virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode = ExcludeDontEnumProperties);
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
private:
oldLastInPrototypeChain->setPrototype(globalData, objectPrototype);
}
-void JSGlobalObject::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSGlobalObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSGlobalObject* thisObject = static_cast<JSGlobalObject*>(cell);
public:
virtual ~JSGlobalObject();
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
virtual bool getOwnPropertySlot(ExecState*, const Identifier&, PropertySlot&);
}
}
-void JSObject::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSObject* thisObject = static_cast<JSObject*>(cell);
public:
typedef JSCell Base;
- virtual void visitChildrenVirtual(SlotVisitor&);
ALWAYS_INLINE void visitChildrenDirect(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
+ virtual UString className() const;
+
// The inline virtual destructor cannot be the first virtual function declared
// in the class as it results in the vtable being generated as a weak symbol
virtual ~JSObject();
Structure* inheritorID(JSGlobalData&);
- virtual UString className() const;
-
JSValue get(ExecState*, const Identifier& propertyName) const;
JSValue get(ExecState*, unsigned propertyName) const;
return classInfo()->isSubClassOf(info);
}
+inline const MethodTable* JSCell::methodTable() const
+{
+ return &classInfo()->methodTable;
+}
+
// this method is here to be after the inline declaration of JSCell::inherits
inline bool JSValue::inherits(const ClassInfo* classInfo) const
{
return identifier;
}
-void JSPropertyNameIterator::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSPropertyNameIterator::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSPropertyNameIterator* thisObject = static_cast<JSPropertyNameIterator*>(cell);
return Structure::create(globalData, globalObject, prototype, TypeInfo(CompoundType, OverridesVisitChildren), &s_info);
}
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
bool getOffset(size_t i, int& offset)
namespace JSC {
ASSERT_CLASS_FITS_IN_CELL(JSStaticScopeObject);
-void JSStaticScopeObject::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSStaticScopeObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSStaticScopeObject* thisObject = static_cast<JSStaticScopeObject*>(cell);
return scopeObject;
}
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
bool isDynamicScope(bool& requiresDynamicChecks) const;
virtual JSObject* toThisObject(ExecState*) const;
struct ClassInfo;
struct Instruction;
+ struct MethodTable;
template <class T> class WriteBarrierBase;
ASSERT_CLASS_FITS_IN_CELL(JSWrapperObject);
-void JSWrapperObject::visitChildrenVirtual(SlotVisitor& visitor)
+JSWrapperObject::~JSWrapperObject()
{
- visitChildren(this, visitor);
}
void JSWrapperObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
explicit JSWrapperObject(JSGlobalData&, Structure*);
static const unsigned StructureFlags = OverridesVisitChildren | JSNonFinalObject::StructureFlags;
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
+
+ virtual ~JSWrapperObject();
private:
WriteBarrier<Unknown> m_internalValue;
{
}
-void NativeErrorConstructor::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void NativeErrorConstructor::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
NativeErrorConstructor* thisObject = static_cast<NativeErrorConstructor*>(cell);
virtual ConstructType getConstructData(ConstructData&);
virtual CallType getCallDataVirtual(CallData&);
static CallType getCallData(JSCell*, CallData&);
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
WriteBarrier<Structure> m_errorStructure;
{
}
-void RegExpObject::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void RegExpObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
RegExpObject* thisObject = static_cast<RegExpObject*>(cell);
void finishCreation(JSGlobalObject*);
static const unsigned StructureFlags = OverridesVisitChildren | OverridesGetOwnPropertySlot | Base::StructureFlags;
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
private:
namespace JSC {
+ScopeChainNode::~ScopeChainNode()
+{
+}
+
#ifndef NDEBUG
void ScopeChainNode::print()
return scopeDepth;
}
-void ScopeChainNode::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void ScopeChainNode::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
ScopeChainNode* thisObject = static_cast<ScopeChainNode*>(cell);
{
}
+ virtual ~ScopeChainNode();
+
protected:
void finishCreation(JSGlobalData* globalData, JSGlobalObject* globalObject)
{
#endif
static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue proto) { return Structure::create(globalData, globalObject, proto, TypeInfo(CompoundType, StructureFlags), &s_info); }
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
static JS_EXPORTDATA const ClassInfo s_info;
}
}
-void Structure::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void Structure::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
Structure* thisObject = static_cast<Structure*>(cell);
JSValue storedPrototype() const { return m_prototype.get(); }
JSValue prototypeForLookup(ExecState*) const;
StructureChain* prototypeChain(ExecState*) const;
- void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
Structure* previousID() const { ASSERT(structure()->classInfo() == &s_info); return m_previous.get(); }
{
}
-void StructureChain::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void StructureChain::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
StructureChain* thisObject = static_cast<StructureChain*>(cell);
return chain;
}
WriteBarrier<Structure>* head() { return m_vector.get(); }
- void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype) { return Structure::create(globalData, globalObject, prototype, TypeInfo(CompoundType, OverridesVisitChildren), &s_info); }
+2011-09-29 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ De-virtualize JSCell::visitChildrenVirtual and remove all other visitChildrenVirtual methods
+ https://bugs.webkit.org/show_bug.cgi?id=68839
+
+ Reviewed by Geoffrey Garen.
+
+ Removed the remaining visitChildrenVirtual methods. This patch completes the process of
+ de-virtualizing visitChildren.
+
+ * UserObjectImp.cpp:
+ * UserObjectImp.h:
+
2011-09-27 Mark Hahnenberg <mhahnenberg@apple.com>
Add static version of JSCell::getCallData
return result;
}
-void UserObjectImp::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void UserObjectImp::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
UserObjectImp* thisObject = static_cast<UserObjectImp*>(cell);
virtual double toNumber(ExecState *exec) const;
virtual UString toString(ExecState *exec) const;
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
JSUserObject *GetJSUserObject() const;
+2011-09-29 Mark Hahnenberg <mhahnenberg@apple.com>
+
+ De-virtualize JSCell::visitChildrenVirtual and remove all other visitChildrenVirtual methods
+ https://bugs.webkit.org/show_bug.cgi?id=68839
+
+ Reviewed by Geoffrey Garen.
+
+ No new tests.
+
+ Removed the remaining visitChildrenVirtual methods. This patch completes the process of
+ de-virtualizing visitChildren.
+
+ * WebCore.exp.in:
+ * bindings/js/JSAttrCustom.cpp:
+ * bindings/js/JSAudioContextCustom.cpp:
+ * bindings/js/JSCSSRuleCustom.cpp:
+ * bindings/js/JSCSSStyleDeclarationCustom.cpp:
+ * bindings/js/JSCanvasRenderingContextCustom.cpp:
+ * bindings/js/JSDOMGlobalObject.cpp:
+ (WebCore::JSDOMGlobalObject::~JSDOMGlobalObject):
+ (WebCore::JSDOMGlobalObject::finishCreation):
+ * bindings/js/JSDOMGlobalObject.h:
+ * bindings/js/JSDOMWindowCustom.cpp:
+ * bindings/js/JSDOMWindowShell.cpp:
+ * bindings/js/JSDOMWindowShell.h:
+ * bindings/js/JSJavaScriptAudioNodeCustom.cpp:
+ * bindings/js/JSMessageChannelCustom.cpp:
+ * bindings/js/JSMessagePortCustom.cpp:
+ * bindings/js/JSNamedNodeMapCustom.cpp:
+ * bindings/js/JSNodeCustom.cpp:
+ * bindings/js/JSNodeFilterCustom.cpp:
+ * bindings/js/JSNodeIteratorCustom.cpp:
+ * bindings/js/JSSVGElementInstanceCustom.cpp:
+ * bindings/js/JSSharedWorkerCustom.cpp:
+ * bindings/js/JSStyleSheetCustom.cpp:
+ * bindings/js/JSTreeWalkerCustom.cpp:
+ * bindings/js/JSWebGLRenderingContextCustom.cpp:
+ * bindings/js/JSWorkerContextCustom.cpp:
+ * bindings/js/JSXMLHttpRequestCustom.cpp:
+ * bindings/js/JSXPathResultCustom.cpp:
+ * bindings/scripts/CodeGeneratorJS.pm:
+ (GenerateHeader):
+ (GenerateImplementation):
+ * bridge/qt/qt_instance.cpp:
+ * bridge/qt/qt_runtime.cpp:
+ * bridge/qt/qt_runtime.h:
+
2011-09-23 Tor Arne Vestbø <tor.arne.vestbo@nokia.com>
[Qt] Fix build against Qt5 after refactor of widgets out of QtGUi
__ZN7WebCore6Editor7CommandC1Ev
__ZN7WebCore6Editor7commandERKN3WTF6StringE
__ZN7WebCore6Editor7outdentEv
-__ZN7WebCore6JSNode20visitChildrenVirtualERN3JSC11SlotVisitorE
__ZN7WebCore6JSNode3putEPN3JSC9ExecStateERKNS1_10IdentifierENS1_7JSValueERNS1_15PutPropertySlotE
__ZN7WebCore6JSNode6s_infoE
__ZN7WebCore6Region5uniteERKS0_
using namespace HTMLNames;
-void JSAttr::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSAttr::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSAttr* thisObject = static_cast<JSAttr*>(cell);
namespace WebCore {
-void JSAudioContext::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSAudioContext::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSAudioContext* thisObject = static_cast<JSAudioContext*>(cell);
namespace WebCore {
-void JSCSSRule::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSCSSRule::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSCSSRule* thisObject = static_cast<JSCSSRule*>(cell);
namespace WebCore {
-void JSCSSStyleDeclaration::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSCSSStyleDeclaration::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSCSSStyleDeclaration* thisObject = static_cast<JSCSSStyleDeclaration*>(cell);
namespace WebCore {
-void JSCanvasRenderingContext::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSCanvasRenderingContext::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSCanvasRenderingContext* thisObject = static_cast<JSCanvasRenderingContext*>(cell);
{
}
-void JSDOMGlobalObject::finishCreation(JSGlobalData& globalData, JSObject* thisValue)
+JSDOMGlobalObject::~JSDOMGlobalObject()
{
- Base::finishCreation(globalData, thisValue);
- ASSERT(inherits(&s_info));
}
-void JSDOMGlobalObject::visitChildrenVirtual(JSC::SlotVisitor& visitor)
+void JSDOMGlobalObject::finishCreation(JSGlobalData& globalData, JSObject* thisValue)
{
- visitChildren(this, visitor);
+ Base::finishCreation(globalData, thisValue);
+ ASSERT(inherits(&s_info));
}
void JSDOMGlobalObject::visitChildren(JSCell* cell, SlotVisitor& visitor)
struct JSDOMGlobalObjectData;
JSDOMGlobalObject(JSC::JSGlobalData&, JSC::Structure*, PassRefPtr<DOMWrapperWorld>);
+ virtual ~JSDOMGlobalObject();
void finishCreation(JSC::JSGlobalData&, JSC::JSObject* thisValue);
public:
void setInjectedScript(JSObject*);
JSObject* injectedScript() const;
- virtual void visitChildrenVirtual(JSC::SlotVisitor&);
static void visitChildren(JSC::JSCell*, JSC::SlotVisitor&);
DOMWrapperWorld* world() { return m_world.get(); }
namespace WebCore {
-void JSDOMWindow::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSDOMWindow::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSDOMWindow* thisObject = static_cast<JSDOMWindow*>(cell);
// JSObject methods
// ----
-void JSDOMWindowShell::visitChildrenVirtual(JSC::SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSDOMWindowShell::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSDOMWindowShell* thisObject = static_cast<JSDOMWindowShell*>(cell);
void* operator new(size_t);
static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::OverridesVisitChildren | JSC::OverridesGetPropertyNames | Base::StructureFlags;
- virtual void visitChildrenVirtual(JSC::SlotVisitor&);
static void visitChildren(JSC::JSCell*, JSC::SlotVisitor&);
virtual JSC::UString className() const;
virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
namespace WebCore {
-void JSJavaScriptAudioNode::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSJavaScriptAudioNode::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSJavaScriptAudioNode* thisObject = static_cast<JSJavaScriptAudioNode*>(cell);
namespace WebCore {
-void JSMessageChannel::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSMessageChannel::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSMessageChannel* thisObject = static_cast<JSMessageChannel*>(cell);
namespace WebCore {
-void JSMessagePort::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSMessagePort::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSMessagePort* thisObject = static_cast<JSMessagePort*>(cell);
namespace WebCore {
-void JSNamedNodeMap::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
bool JSNamedNodeMap::canGetItemsForName(ExecState*, NamedNodeMap* impl, const Identifier& propertyName)
{
return impl->getNamedItem(identifierToString(propertyName));
return node;
}
-void JSNode::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSNode::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSNode* thisObject = static_cast<JSNode*>(cell);
namespace WebCore {
-void JSNodeFilter::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSNodeFilter::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSNodeFilter* thisObject = static_cast<JSNodeFilter*>(cell);
namespace WebCore {
-void JSNodeIterator::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSNodeIterator::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSNodeIterator* thisObject = static_cast<JSNodeIterator*>(cell);
namespace WebCore {
-void JSSVGElementInstance::visitChildrenVirtual(JSC::SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSSVGElementInstance::visitChildren(JSC::JSCell* cell, JSC::SlotVisitor& visitor)
{
JSSVGElementInstance* thisObject = static_cast<JSSVGElementInstance*>(cell);
namespace WebCore {
-void JSSharedWorker::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSSharedWorker::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSSharedWorker* thisObject = static_cast<JSSharedWorker*>(cell);
namespace WebCore {
-void JSStyleSheet::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSStyleSheet::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSStyleSheet* thisObject = static_cast<JSStyleSheet*>(cell);
namespace WebCore {
-void JSTreeWalker::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSTreeWalker::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSTreeWalker* thisObject = static_cast<JSTreeWalker*>(cell);
return jsNull();
}
-void JSWebGLRenderingContext::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSWebGLRenderingContext::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSWebGLRenderingContext* thisObject = static_cast<JSWebGLRenderingContext*>(cell);
namespace WebCore {
-void JSWorkerContext::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSWorkerContext::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSWorkerContext* thisObject = static_cast<JSWorkerContext*>(cell);
namespace WebCore {
-void JSXMLHttpRequest::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSXMLHttpRequest::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSXMLHttpRequest* thisObject = static_cast<JSXMLHttpRequest*>(cell);
namespace WebCore {
-void JSXPathResult::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void JSXPathResult::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
JSXPathResult* thisObject = static_cast<JSXPathResult*>(cell);
# visit function
if ($needsMarkChildren) {
- push(@headerContent, " virtual void visitChildrenVirtual(JSC::SlotVisitor&);\n");
push(@headerContent, " static void visitChildren(JSCell*, JSC::SlotVisitor&);\n\n");
$structureFlags{"JSC::OverridesVisitChildren"} = 1;
}
}
if ($needsMarkChildren && !$dataNode->extendedAttributes->{"CustomMarkFunction"}) {
- push(@implContent, "void ${className}::visitChildrenVirtual(SlotVisitor& visitor)\n");
- push(@implContent, "{\n");
- push(@implContent, " visitChildren(this, visitor);\n");
- push(@implContent, "}\n\n");
-
push(@implContent, "void ${className}::visitChildren(JSCell* cell, SlotVisitor& visitor)\n");
push(@implContent, "{\n");
push(@implContent, " ${className}* thisObject = static_cast<${className}*>(cell);\n");
static const ClassInfo s_info;
- virtual void visitChildrenVirtual(SlotVisitor& visitor)
- {
- visitChildren(this, visitor);
- }
-
static void visitChildren(JSCell* cell, SlotVisitor& visitor)
{
QtRuntimeObject* thisObject = static_cast<QtRuntimeObject*>(cell);
d->m_allowPrivate = allowPrivate;
}
-void QtRuntimeMetaMethod::visitChildrenVirtual(SlotVisitor& visitor)
-{
- visitChildren(this, visitor);
-}
-
void QtRuntimeMetaMethod::visitChildren(JSCell* cell, SlotVisitor& visitor)
{
QtRuntimeMetaMethod* thisObject = static_cast<QtRuntimeMetaMethod*>(cell);
virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
- virtual void visitChildrenVirtual(SlotVisitor&);
static void visitChildren(JSCell*, SlotVisitor&);
protected: