Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (253499 => 253500)
--- trunk/Source/_javascript_Core/ChangeLog 2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/_javascript_Core/ChangeLog 2019-12-13 22:37:52 UTC (rev 253500)
@@ -1,3 +1,15 @@
+2019-12-13 Saam Barati <[email protected]>
+
+ Add a Heap::finalize function that takes WTF::Function<void()>
+ https://bugs.webkit.org/show_bug.cgi?id=205211
+
+ Reviewed by Geoffrey Garen.
+
+ * heap/Heap.cpp:
+ (JSC::Heap::addFinalizer):
+ (JSC::Heap::FinalizerOwner::finalize):
+ * heap/Heap.h:
+
2019-12-13 Jim Mason <[email protected]>
[GTK] WebKitGTK build hangs on g-ir-scanner
Modified: trunk/Source/_javascript_Core/heap/Heap.cpp (253499 => 253500)
--- trunk/Source/_javascript_Core/heap/Heap.cpp 2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/_javascript_Core/heap/Heap.cpp 2019-12-13 22:37:52 UTC (rev 253500)
@@ -2435,19 +2435,33 @@
return true;
}
-void Heap::addFinalizer(JSCell* cell, Finalizer finalizer)
+void Heap::addFinalizer(JSCell* cell, CFinalizer finalizer)
{
- WeakSet::allocate(cell, &m_finalizerOwner, reinterpret_cast<void*>(finalizer)); // Balanced by FinalizerOwner::finalize().
+ WeakSet::allocate(cell, &m_cFinalizerOwner, bitwise_cast<void*>(finalizer)); // Balanced by CFinalizerOwner::finalize().
}
-void Heap::FinalizerOwner::finalize(Handle<Unknown> handle, void* context)
+void Heap::addFinalizer(JSCell* cell, LambdaFinalizer function)
{
+ WeakSet::allocate(cell, &m_lambdaFinalizerOwner, function.leakImpl()); // Balanced by LambdaFinalizerOwner::finalize().
+}
+
+void Heap::CFinalizerOwner::finalize(Handle<Unknown> handle, void* context)
+{
HandleSlot slot = handle.slot();
- Finalizer finalizer = reinterpret_cast<Finalizer>(context);
+ CFinalizer finalizer = bitwise_cast<CFinalizer>(context);
finalizer(slot->asCell());
WeakSet::deallocate(WeakImpl::asWeakImpl(slot));
}
+void Heap::LambdaFinalizerOwner::finalize(Handle<Unknown> handle, void* context)
+{
+ LambdaFinalizer::Impl* impl = bitwise_cast<LambdaFinalizer::Impl*>(context);
+ LambdaFinalizer finalizer(impl);
+ HandleSlot slot = handle.slot();
+ finalizer(slot->asCell());
+ WeakSet::deallocate(WeakImpl::asWeakImpl(slot));
+}
+
void Heap::collectNowFullIfNotDoneRecently(Synchronousness synchronousness)
{
if (!m_fullActivityCallback) {
Modified: trunk/Source/_javascript_Core/heap/Heap.h (253499 => 253500)
--- trunk/Source/_javascript_Core/heap/Heap.h 2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/_javascript_Core/heap/Heap.h 2019-12-13 22:37:52 UTC (rev 253500)
@@ -171,8 +171,10 @@
// helping heap.
JS_EXPORT_PRIVATE bool isCurrentThreadBusy();
- typedef void (*Finalizer)(JSCell*);
- JS_EXPORT_PRIVATE void addFinalizer(JSCell*, Finalizer);
+ typedef void (*CFinalizer)(JSCell*);
+ JS_EXPORT_PRIVATE void addFinalizer(JSCell*, CFinalizer);
+ using LambdaFinalizer = WTF::Function<void(JSCell*)>;
+ JS_EXPORT_PRIVATE void addFinalizer(JSCell*, LambdaFinalizer);
void notifyIsSafeToCollect();
bool isSafeToCollect() const { return m_isSafeToCollect; }
@@ -431,10 +433,14 @@
static constexpr size_t minExtraMemory = 256;
- class FinalizerOwner : public WeakHandleOwner {
+ class CFinalizerOwner : public WeakHandleOwner {
void finalize(Handle<Unknown>, void* context) override;
};
+ class LambdaFinalizerOwner : public WeakHandleOwner {
+ void finalize(Handle<Unknown>, void* context) override;
+ };
+
JS_EXPORT_PRIVATE bool isValidAllocation(size_t);
JS_EXPORT_PRIVATE void reportExtraMemoryAllocatedSlowCase(size_t);
JS_EXPORT_PRIVATE void deprecatedReportExtraMemorySlowCase(size_t);
@@ -634,7 +640,8 @@
HandleSet m_handleSet;
std::unique_ptr<CodeBlockSet> m_codeBlocks;
std::unique_ptr<JITStubRoutineSet> m_jitStubRoutines;
- FinalizerOwner m_finalizerOwner;
+ CFinalizerOwner m_cFinalizerOwner;
+ LambdaFinalizerOwner m_lambdaFinalizerOwner;
Lock m_parallelSlotVisitorLock;
bool m_isSafeToCollect { false };
Modified: trunk/Source/WTF/ChangeLog (253499 => 253500)
--- trunk/Source/WTF/ChangeLog 2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/WTF/ChangeLog 2019-12-13 22:37:52 UTC (rev 253500)
@@ -1,3 +1,13 @@
+2019-12-13 Saam Barati <[email protected]>
+
+ Add a Heap::finalize function that takes WTF::Function<void()>
+ https://bugs.webkit.org/show_bug.cgi?id=205211
+
+ Reviewed by Geoffrey Garen.
+
+ * wtf/Function.h:
+ (WTF::Function<Out):
+
2019-12-13 Per Arne Vollan <[email protected]>
[iOS] Deny mach lookup access to "*.apple-extension-service" in the WebContent process
Modified: trunk/Source/WTF/wtf/Function.h (253499 => 253500)
--- trunk/Source/WTF/wtf/Function.h 2019-12-13 22:35:25 UTC (rev 253499)
+++ trunk/Source/WTF/wtf/Function.h 2019-12-13 22:37:52 UTC (rev 253500)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -62,8 +62,13 @@
class Function<Out(In...)> {
WTF_MAKE_FAST_ALLOCATED;
public:
+ using Impl = Detail::CallableWrapperBase<Out, In...>;
+
Function() = default;
Function(std::nullptr_t) { }
+ Function(Impl* impl)
+ : m_callableWrapper(impl)
+ { }
template<typename CallableType, class = typename std::enable_if<!(std::is_pointer<CallableType>::value && std::is_function<typename std::remove_pointer<CallableType>::type>::value) && std::is_rvalue_reference<CallableType&&>::value>::type>
Function(CallableType&& callable)
@@ -101,8 +106,13 @@
return *this;
}
+ Impl* leakImpl()
+ {
+ return m_callableWrapper.release();
+ }
+
private:
- std::unique_ptr<Detail::CallableWrapperBase<Out, In...>> m_callableWrapper;
+ std::unique_ptr<Impl> m_callableWrapper;
};
} // namespace WTF