[webkit-reviews] review granted: [Bug 233878] Split IsoSubspace into a GCClient allocator used by VM and a backend managed by Heap. : [Attachment 452461] proposed patch.

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Thu Feb 17 20:38:49 PST 2022


Yusuke Suzuki <ysuzuki at apple.com> has granted Mark Lam <mark.lam at apple.com>'s
request for review:
Bug 233878: Split IsoSubspace into a GCClient allocator used by VM and a
backend managed by Heap.
https://bugs.webkit.org/show_bug.cgi?id=233878

Attachment 452461: proposed patch.

https://bugs.webkit.org/attachment.cgi?id=452461&action=review




--- Comment #8 from Yusuke Suzuki <ysuzuki at apple.com> ---
Comment on attachment 452461
  --> https://bugs.webkit.org/attachment.cgi?id=452461
proposed patch.

View in context: https://bugs.webkit.org/attachment.cgi?id=452461&action=review

r=me

> Source/JavaScriptCore/heap/Heap.cpp:3484
> +#undef DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER_SLOW

Can we avoid repeating this list? I think we have the same kind of thing in VM,
is it correct?

> Source/JavaScriptCore/heap/Heap.h:1244
> +class Heap {
> +    WTF_MAKE_NONCOPYABLE(Heap);
> +public:
> +    Heap(JSC::Heap&);
> +    ~Heap();
> +
> +    VM& vm() const;
> +    JSC::Heap& server() { return m_server; }
> +
> +    // FIXME GlobalGC: need a GCClient::Heap::lastChanceToFinalize() and in
there,
> +    // relinquish memory from the IsoSubspace LocalAllocators back to the
server.
> +    // Currently, this is being handled by
BlockDirectory::stopAllocatingForGood().
> +
> +private:
> +    JSC::Heap& m_server;
> +
> +    IsoSubspace arraySpace;
> +    IsoSubspace bigIntSpace;
> +    IsoSubspace calleeSpace;
> +    IsoSubspace clonedArgumentsSpace;
> +    IsoSubspace customGetterSetterSpace;
> +    IsoSubspace dateInstanceSpace;
> +    IsoSubspace domAttributeGetterSetterSpace;
> +    IsoSubspace exceptionSpace;
> +    IsoSubspace executableToCodeBlockEdgeSpace;
> +    IsoSubspace functionSpace;
> +    IsoSubspace getterSetterSpace;
> +    IsoSubspace globalLexicalEnvironmentSpace;
> +    IsoSubspace internalFunctionSpace;
> +    IsoSubspace jsProxySpace;
> +    IsoSubspace nativeExecutableSpace;
> +    IsoSubspace numberObjectSpace;
> +    IsoSubspace plainObjectSpace;
> +    IsoSubspace promiseSpace;
> +    IsoSubspace propertyNameEnumeratorSpace;
> +    IsoSubspace propertyTableSpace;
> +    IsoSubspace regExpSpace;
> +    IsoSubspace regExpObjectSpace;
> +    IsoSubspace ropeStringSpace;
> +    IsoSubspace scopedArgumentsSpace;
> +    IsoSubspace sparseArrayValueMapSpace;
> +    IsoSubspace stringSpace;
> +    IsoSubspace stringObjectSpace;
> +    IsoSubspace structureChainSpace;
> +    IsoSubspace structureRareDataSpace;
> +    IsoSubspace structureSpace;
> +    IsoSubspace brandedStructureSpace;
> +    IsoSubspace symbolTableSpace;
> +
> +#define DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(name) \
> +    template<SubspaceAccess mode> \
> +    IsoSubspace* name() \
> +    { \
> +	   if (m_##name || mode == SubspaceAccess::Concurrently) \
> +	       return m_##name.get(); \
> +	   return name##Slow(); \
> +    } \
> +    JS_EXPORT_PRIVATE IsoSubspace* name##Slow(); \
> +    std::unique_ptr<IsoSubspace> m_##name;
> +
> +#if JSC_OBJC_API_ENABLED
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(apiWrapperObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(objCCallbackFunctionSpace)
> +#endif
> +#ifdef JSC_GLIB_API_ENABLED
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(apiWrapperObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(jscCallbackFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(callbackAPIWrapperGlobalObjectSpace)
> +#endif
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(apiGlobalObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(apiValueWrapperSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(arrayBufferSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(arrayIteratorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(asyncGeneratorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(bigInt64ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(bigIntObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(bigUint64ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(booleanObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(boundFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(callbackConstructorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(callbackGlobalObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(callbackFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(callbackObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(customGetterFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(customSetterFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(dataViewSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(debuggerScopeSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(errorInstanceSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(float32ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(float64ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(functionRareDataSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(generatorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(globalObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(injectedScriptHostSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(int8ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(int16ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(int32ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(javaScriptCallFrameSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(jsModuleRecordSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(mapBucketSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(mapIteratorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(mapSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(moduleNamespaceObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(nativeStdFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(proxyObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(proxyRevokeSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(remoteFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(scopedArgumentsTableSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(scriptFetchParametersSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(scriptFetcherSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(setBucketSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(setIteratorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(setSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(shadowRealmSpace);
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(strictEvalActivationSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(stringIteratorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(sourceCodeSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(symbolSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(symbolObjectSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(templateObjectDescriptorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(temporalCalendarSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(temporalDurationSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(temporalInstantSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(temporalPlainTimeSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(temporalTimeZoneSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(uint8ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(uint8ClampedArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(uint16ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(uint32ArraySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(unlinkedEvalCodeBlockSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(unlinkedFunctionCodeBlockSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(unlinkedModuleProgramCodeBlockSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(unlinkedProgramCodeBlockSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(finalizationRegistrySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(weakObjectRefSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(weakSetSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(weakMapSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(withScopeSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlCollatorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlDateTimeFormatSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlDisplayNamesSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlListFormatSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlLocaleSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlNumberFormatSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlPluralRulesSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlRelativeTimeFormatSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlSegmentIteratorSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlSegmenterSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(intlSegmentsSpace)
> +#if ENABLE(WEBASSEMBLY)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(jsToWasmICCalleeSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyExceptionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyFunctionSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyGlobalSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyInstanceSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyMemorySpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyModuleSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyModuleRecordSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyTableSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyTagSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(webAssemblyWrapperFunctionSpace)
> +#endif
> +
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(evalExecutableSpace)
> +    DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER(moduleProgramExecutableSpace)
> +
> +#undef DYNAMIC_ISO_SUBSPACE_DEFINE_MEMBER
> +
> +    IsoSubspace codeBlockSpace;
> +    IsoSubspace functionExecutableSpace;
> +    IsoSubspace programExecutableSpace;
> +    IsoSubspace unlinkedFunctionExecutableSpace;
> +
> +    Vector<IsoSubspacePerVM*> perVMIsoSubspaces;
> +
> +    friend class JSC::VM;
> +    friend class JSC::IsoSubspacePerVM;

Can we avoid repeating this list? I think we have the same kind of thing in VM,
is it correct?


More information about the webkit-reviews mailing list