WebKit is using separate headers (…Inlines.h) for some inline functions. There was a discussion on it. [webkit-dev] …Inlines.h vs …InlineMethods.h https://lists.webkit.org/pipermail/webkit-dev/2012-November/022703.html In certain condition of missing inlucing …Inlines.h, this may cause linkage errors only for Windows port. Bug 191626 – REGRESSION(r238039) WebCore::JSDOMGlobalObject::createStructure is using JSC::Structure::create without including StructureInlines.h Bug 155657 – JSDOMGlobalObject.h needs to #include StructureInlines.h To prevent such issues, I'd like to experiment using 'inline' specifier for declarations in this ticket.
Created attachment 359246 [details] WIP patch Added 'inline' specifiers for some declarations.
This WIP patch reports a lot of warnings such like following. This approach doesn't seem easy as I expected. > [12/454] Building CXX object Source\JavaScriptCore\CMakeFiles\JavaScriptCore.dir\API\JSStringRefCF.cpp.obj > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:25: > In file included from ..\..\Source\JavaScriptCore\interpreter\CallFrame.h:30: > In file included from ..\..\Source\JavaScriptCore\runtime/VM.h:34: > In file included from ..\..\Source\JavaScriptCore\runtime/ConcurrentJSLock.h:28: > In file included from ..\..\Source\JavaScriptCore\heap\DeferGC.h:29: > ..\..\Source\JavaScriptCore\heap\Heap.h(158,17): warning: inline function 'JSC::Heap::worldIsStopped' is not defined [-Wundefined-inline] > inline bool worldIsStopped() const; > ^ > ..\..\Source\JavaScriptCore\heap\Heap.h(159,43): note: used here > bool worldIsRunning() const { return !worldIsStopped(); } > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:27: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCast.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCell.h:34: > In file included from ..\..\Source\JavaScriptCore\heap\SlotVisitor.h:30: > In file included from ..\..\Source\JavaScriptCore\heap/MarkStack.h:28: > ..\..\Source\JavaScriptCore\heap/GCSegmentedArray.h(81,17): warning: inline function 'JSC::GCSegmentedArray<const JSC::JSCell *>::isEmpty' is not defined [-Wundefined-inline] > inline bool isEmpty(); > ^ > ..\..\Source\JavaScriptCore\heap\SlotVisitor.h(120,46): note: used here > bool isEmpty() { return m_collectorStack.isEmpty() && m_mutatorStack.isEmpty(); } > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/Structure.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime/InferredTypeTable.h:28: > ..\..\Source\JavaScriptCore\runtime/Identifier.h(117,30): warning: inline function 'JSC::Identifier::fromString' is not defined [-Wundefined-inline] > inline static Identifier fromString(VM*, const LChar*, int length); > ^ > ..\..\Source\JavaScriptCore\runtime/Identifier.h(124,84): note: used here > static Identifier fromString(VM* vm, const Vector<LChar>& characters) { return fromString(vm, characters.data(), characters.size()); } > ^ > ..\..\Source\JavaScriptCore\runtime/Identifier.h(126,30): warning: inline function 'JSC::Identifier::fromUid' is not defined [-Wundefined-inline] > inline static Identifier fromUid(VM*, UniquedStringImpl* uid); > ^ > ..\..\Source\JavaScriptCore\runtime/PropertyNameArray.h(106,53): note: used here > m_data->propertyNameVector().append(Identifier::fromUid(m_vm, identifier)); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/Structure.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime/InferredTypeTable.h:28: > ..\..\Source\JavaScriptCore\runtime/Identifier.h(121,30): warning: inline function 'JSC::Identifier::fromString' is not defined [-Wundefined-inline] > inline static Identifier fromString(ExecState*, const AtomicString&); > ^ > ..\..\Source\JavaScriptCore\runtime/JSString.h(533,24): note: used here > return Identifier::fromString(exec, toAtomicString(exec)); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/Structure.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime/InferredTypeTable.h:28: > ..\..\Source\JavaScriptCore\runtime/Identifier.h(119,30): warning: inline function 'JSC::Identifier::fromString' is not defined [-Wundefined-inline] > inline static Identifier fromString(VM*, const String&); > ^ > ..\..\Source\JavaScriptCore\runtime/JSObject.h(1593,24): note: used here > return Identifier::fromString(&vm, name); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:25: > In file included from ..\..\Source\JavaScriptCore\interpreter\CallFrame.h:30: > In file included from ..\..\Source\JavaScriptCore\runtime/VM.h:34: > In file included from ..\..\Source\JavaScriptCore\runtime/ConcurrentJSLock.h:28: > In file included from ..\..\Source\JavaScriptCore\heap\DeferGC.h:29: > ..\..\Source\JavaScriptCore\heap\Heap.h(139,23): warning: inline function 'JSC::Heap::vm' is not defined [-Wundefined-inline] > ALWAYS_INLINE VM* vm() const; > ^ > ..\..\Source\JavaScriptCore\heap\LocalAllocatorInlines.h(36,53): note: used here > sanitizeStackForVM(m_directory->heap()->vm()); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:27: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCast.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCell.h:34: > ..\..\Source\JavaScriptCore\heap\SlotVisitor.h(85,16): warning: inline function 'JSC::SlotVisitor::vm' is not defined [-Wundefined-inline] > inline VM& vm(); > ^ > ..\..\Source\JavaScriptCore\runtime/JSCellInlines.h(131,55): note: used here > visitor.appendUnbarriered(cell->structure(visitor.vm())); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:27: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCast.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCell.h:34: > ..\..\Source\JavaScriptCore\heap\SlotVisitor.h(108,24): warning: inline function 'JSC::SlotVisitor::appendUnbarriered' is not defined [-Wundefined-inline] > ALWAYS_INLINE void appendUnbarriered(JSCell*); > ^ > ..\..\Source\JavaScriptCore\runtime/JSCellInlines.h(131,13): note: used here > visitor.appendUnbarriered(cell->structure(visitor.vm())); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime\JSCJSValueInlines.h:29: > In file included from ..\..\Source\JavaScriptCore\runtime/Error.h:25: > In file included from ..\..\Source\JavaScriptCore\runtime/ErrorInstance.h:23: > In file included from ..\..\Source\JavaScriptCore\runtime/JSDestructibleObject.h:28: > ..\..\Source\JavaScriptCore\runtime/JSObject.h(196,31): warning: inline function 'JSC::JSObject::putInlineForJSObject' is not defined [-Wundefined-inline] > ALWAYS_INLINE static bool putInlineForJSObject(JSCell*, ExecState*, PropertyName, JSValue, PutPropertySlot&); > ^ > ..\..\Source\JavaScriptCore\runtime/JSCellInlines.h(408,26): note: used here > return JSObject::putInlineForJSObject(asObject(this), exec, propertyName, value, slot); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:25: > In file included from ..\..\Source\JavaScriptCore\interpreter\CallFrame.h:30: > In file included from ..\..\Source\JavaScriptCore\runtime/VM.h:34: > In file included from ..\..\Source\JavaScriptCore\runtime/ConcurrentJSLock.h:28: > In file included from ..\..\Source\JavaScriptCore\heap\DeferGC.h:29: > ..\..\Source\JavaScriptCore\heap\Heap.h(110,32): warning: inline function 'JSC::Heap::heap' is not defined [-Wundefined-inline] > static ALWAYS_INLINE Heap* heap(const HeapCell*); > ^ > ..\..\Source\JavaScriptCore\runtime\Protect.h(30,11): note: used here > Heap::heap(val)->protect(val); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime\JSCJSValueInlines.h:29: > In file included from ..\..\Source\JavaScriptCore\runtime/Error.h:25: > In file included from ..\..\Source\JavaScriptCore\runtime/ErrorInstance.h:23: > In file included from ..\..\Source\JavaScriptCore\runtime/JSDestructibleObject.h:28: > ..\..\Source\JavaScriptCore\runtime/JSObject.h(602,24): warning: inline function 'JSC::JSObject::hasOwnProperty' is not defined [-Wundefined-inline] > ALWAYS_INLINE bool hasOwnProperty(ExecState*, PropertyName) const; > ^ > ..\..\Source\JavaScriptCore\runtime\JSGlobalObject.h(543,14): note: used here > if (!hasOwnProperty(exec, propertyName)) > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime\JSCJSValueInlines.h:36: > ..\..\Source\JavaScriptCore\runtime/JSFunction.h(168,12): warning: inline function 'JSC::JSFunction::JSFunction' is not defined [-Wundefined-inline] > inline JSFunction(VM&, FunctionExecutable*, JSScope*, Structure*); > ^ > ..\..\Source\JavaScriptCore\runtime/JSFunction.h(186,81): note: used here > JSFunction* function = new (NotNull, allocateCell<JSFunction>(vm.heap)) JSFunction(vm, executable, scope, structure); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/Structure.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime/InferredTypeTable.h:28: > ..\..\Source\JavaScriptCore\runtime/Identifier.h(128,30): warning: inline function 'JSC::Identifier::fromUid' is not defined [-Wundefined-inline] > inline static Identifier fromUid(const PrivateName&); > ^ > ..\..\Source\JavaScriptCore\runtime\JSCJSValueInlines.h(655,47): note: used here > RELEASE_AND_RETURN(scope, Identifier::fromUid(asSymbol(primitive)->privateName())); > ^ > In file included from ..\..\Source\JavaScriptCore\API\JSStringRefCF.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:31: > In file included from ..\..\Source\JavaScriptCore\runtime\JSCJSValueInlines.h:29: > In file included from ..\..\Source\JavaScriptCore\runtime/Error.h:25: > In file included from ..\..\Source\JavaScriptCore\runtime/ErrorInstance.h:23: > In file included from ..\..\Source\JavaScriptCore\runtime/JSDestructibleObject.h:28: > ..\..\Source\JavaScriptCore\runtime/JSObject.h(175,17): warning: inline function 'JSC::JSObject::getOwnPropertySlotInline' is not defined [-Wundefined-inline] > inline bool getOwnPropertySlotInline(ExecState*, PropertyName, PropertySlot&); > ^ > ..\..\Source\JavaScriptCore\runtime\JSCJSValueInlines.h(896,51): note: used here > RELEASE_AND_RETURN(scope, asObject(asCell())->getOwnPropertySlotInline(exec, propertyName, slot)); > ^ > 15 warnings generated. > [13/454] Building CXX object Source\JavaScriptCore\CMakeFiles\JavaScriptCore.dir\__\__\DerivedSources\JavaScriptCore\unified-sources\UnifiedSource-d93d10ff-3.cpp.obj > In file included from DerivedSources\JavaScriptCore\unified-sources\UnifiedSource-d93d10ff-3.cpp:1: > In file included from ..\..\Source\JavaScriptCore\API/JSWeakPrivate.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:27: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCast.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/JSCell.h:34: > In file included from ..\..\Source\JavaScriptCore\heap/SlotVisitor.h:30: > In file included from ..\..\Source\JavaScriptCore\heap/MarkStack.h:28: > ..\..\Source\JavaScriptCore\heap/GCSegmentedArray.h(81,17): warning: inline function 'JSC::GCSegmentedArray<const JSC::JSCell *>::isEmpty' is not defined [-Wundefined-inline] > inline bool isEmpty(); > ^ > ..\..\Source\JavaScriptCore\heap/SlotVisitor.h(120,46): note: used here > bool isEmpty() { return m_collectorStack.isEmpty() && m_mutatorStack.isEmpty(); } > ^ > In file included from DerivedSources\JavaScriptCore\unified-sources\UnifiedSource-d93d10ff-3.cpp:1: > In file included from ..\..\Source\JavaScriptCore\API/JSWeakPrivate.cpp:29: > In file included from ..\..\Source\JavaScriptCore\API/APICast.h:29: > In file included from ..\..\Source\JavaScriptCore\API/JSAPIValueWrapper.h:25: > In file included from ..\..\Source\JavaScriptCore\interpreter/CallFrame.h:30: > In file included from ..\..\Source\JavaScriptCore\runtime/VM.h:43: > ..\..\Source\JavaScriptCore\heap\IsoCellSet.h(50,17): warning: inline function 'JSC::IsoCellSet::remove' is not defined [-Wundefined-inline] > inline bool remove(HeapCell* cell); // Returns true if the cell was previously present and got removed. > ^ > ..\..\Source\JavaScriptCore\bytecode\UnlinkedFunctionExecutable.h(118,61): note: used here > vm.unlinkedFunctionExecutableSpace.clearableCodeSet.remove(this); > ^ > In file included from DerivedSources\JavaScriptCore\unified-sources\UnifiedSource-d93d10ff-3.cpp:1: > In file included from ..\..\Source\JavaScriptCore\API/JSWeakPrivate.cpp:30: > In file included from ..\..\Source\JavaScriptCore\runtime\JSCInlines.h:46: > In file included from ..\..\Source\JavaScriptCore\runtime/JSFunctionInlines.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime\FunctionExecutable.h:29: > In file included from ..\..\Source\JavaScriptCore\runtime/ScriptExecutable.h:28: > In file included from ..\..\Source\JavaScriptCore\runtime/ExecutableBase.h:34: > In file included from ..\..\Source\JavaScriptCore\bytecode/UnlinkedCodeBlock.h:42: > ..\..\Source\JavaScriptCore\bytecode/UnlinkedMetadataTable.h(50,26): warning: inline function 'JSC::UnlinkedMetadataTable::sizeInBytes' is not defined [-Wundefined-inline] > ALWAYS_INLINE size_t sizeInBytes(); > ^ > ..\..\Source\JavaScriptCore\bytecode/UnlinkedCodeBlock.h(364,27): note: used here > return m_metadata.sizeInBytes(); > ^ > 3 warnings generated.
Another issue happens. Bug 202722 – [Win] error LNK2019: unresolved external symbol "public: __cdecl JSC::Strong<enum JSC::Unknown>::Strong<enum JSC::Unknown>(class JSC::VM &,class JSC::JSValue)"
Another issue: Bug 203483 – [Windows][Clang] error LNK2001: unresolved external symbol "void * __cdecl JSC::allocateCell<class JSC::JSGenericTypedArrayView<struct JSC::Float32Adaptor> >(class JSC::Heap &,unsigned __int64)"
Discussed in bug 203391 comment 14.
Pull request: https://github.com/WebKit/WebKit/pull/16822