mirror of
https://github.com/oven-sh/bun
synced 2026-02-11 03:18:53 +00:00
add GC output constraints
I don't fully understand what this does but it sounds good!
This commit is contained in:
@@ -66,7 +66,7 @@ void JSVMClientData::create(VM* vm)
|
||||
vm->clientData = clientData; // ~VM deletes this pointer.
|
||||
clientData->m_normalWorld = DOMWrapperWorld::create(*vm, DOMWrapperWorld::Type::Normal);
|
||||
|
||||
// vm->heap.addMarkingConstraint(makeUnique<WebCore::DOMGCOutputConstraint>(*vm, clientData->heapData()));
|
||||
vm->heap.addMarkingConstraint(makeUnique<WebCore::DOMGCOutputConstraint>(*vm, clientData->heapData()));
|
||||
|
||||
vm->m_typedArrayController = adoptRef(new WebCoreTypedArrayController(true));
|
||||
}
|
||||
|
||||
@@ -20,9 +20,7 @@ class DOMWrapperWorld;
|
||||
#include "wtf/Function.h"
|
||||
#include "wtf/HashSet.h"
|
||||
#include "wtf/RefPtr.h"
|
||||
#include "JavaScriptCore/WeakHandleOwner.h"
|
||||
#include "JavaScriptCore/WeakInlines.h"
|
||||
|
||||
#include "JavaScriptCore/IsoSubspacePerVM.h"
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
@@ -24,123 +24,121 @@
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "JavaScriptCore/WeakInlines.h"
|
||||
#include "JavaScriptCore/AbstractSlotVisitorInlines.h"
|
||||
|
||||
#include "JavaScriptCore/VM.h"
|
||||
#include "JavaScriptCore/MarkingConstraint.h"
|
||||
|
||||
namespace JSC {
|
||||
|
||||
class VisitCounter {
|
||||
public:
|
||||
VisitCounter() {}
|
||||
|
||||
VisitCounter(AbstractSlotVisitor& visitor)
|
||||
: m_visitor(&visitor)
|
||||
, m_initialVisitCount(visitor.visitCount())
|
||||
{
|
||||
}
|
||||
|
||||
AbstractSlotVisitor& visitor() const { return *m_visitor; }
|
||||
|
||||
size_t visitCount() const
|
||||
{
|
||||
return m_visitor->visitCount() - m_initialVisitCount;
|
||||
}
|
||||
|
||||
private:
|
||||
AbstractSlotVisitor* m_visitor { nullptr };
|
||||
size_t m_initialVisitCount { 0 };
|
||||
};
|
||||
|
||||
static constexpr bool verboseMarkingConstraint = false;
|
||||
|
||||
MarkingConstraint::MarkingConstraint(CString abbreviatedName, CString name, ConstraintVolatility volatility, ConstraintConcurrency concurrency, ConstraintParallelism parallelism)
|
||||
: m_abbreviatedName(abbreviatedName)
|
||||
, m_name(WTFMove(name))
|
||||
, m_volatility(volatility)
|
||||
, m_concurrency(concurrency)
|
||||
, m_parallelism(parallelism)
|
||||
{
|
||||
}
|
||||
|
||||
MarkingConstraint::~MarkingConstraint()
|
||||
{
|
||||
}
|
||||
|
||||
void MarkingConstraint::resetStats()
|
||||
{
|
||||
m_lastVisitCount = 0;
|
||||
}
|
||||
|
||||
void MarkingConstraint::execute(SlotVisitor& visitor)
|
||||
{
|
||||
ASSERT(!visitor.heap()->isMarkingForGCVerifier());
|
||||
VisitCounter visitCounter(visitor);
|
||||
executeImpl(visitor);
|
||||
m_lastVisitCount += visitCounter.visitCount();
|
||||
if (verboseMarkingConstraint && visitCounter.visitCount())
|
||||
dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in execute)");
|
||||
}
|
||||
|
||||
void MarkingConstraint::executeSynchronously(AbstractSlotVisitor& visitor)
|
||||
{
|
||||
prepareToExecuteImpl(NoLockingNecessary, visitor);
|
||||
executeImpl(visitor);
|
||||
}
|
||||
|
||||
double MarkingConstraint::quickWorkEstimate(SlotVisitor&)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
double MarkingConstraint::workEstimate(SlotVisitor& visitor)
|
||||
{
|
||||
return lastVisitCount() + quickWorkEstimate(visitor);
|
||||
}
|
||||
|
||||
void MarkingConstraint::prepareToExecute(const AbstractLocker& constraintSolvingLocker, SlotVisitor& visitor)
|
||||
{
|
||||
ASSERT(!visitor.heap()->isMarkingForGCVerifier());
|
||||
dataLogIf(Options::logGC(), abbreviatedName());
|
||||
VisitCounter visitCounter(visitor);
|
||||
prepareToExecuteImpl(constraintSolvingLocker, visitor);
|
||||
m_lastVisitCount = visitCounter.visitCount();
|
||||
if (verboseMarkingConstraint && visitCounter.visitCount())
|
||||
dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in prepareToExecute)");
|
||||
}
|
||||
|
||||
void MarkingConstraint::doParallelWork(SlotVisitor& visitor, SharedTask<void(SlotVisitor&)>& task)
|
||||
{
|
||||
ASSERT(!visitor.heap()->isMarkingForGCVerifier());
|
||||
VisitCounter visitCounter(visitor);
|
||||
task.run(visitor);
|
||||
if (verboseMarkingConstraint && visitCounter.visitCount())
|
||||
dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in doParallelWork)");
|
||||
{
|
||||
Locker locker { m_lock };
|
||||
m_lastVisitCount += visitCounter.visitCount();
|
||||
}
|
||||
}
|
||||
|
||||
void MarkingConstraint::prepareToExecuteImpl(const AbstractLocker&, AbstractSlotVisitor&)
|
||||
{
|
||||
}
|
||||
|
||||
} // namespace JSC
|
||||
|
||||
#include "BunGCOutputConstraint.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
#include "WebCoreJSClientData.h"
|
||||
#include "JavaScriptCore/BlockDirectoryInlines.h"
|
||||
#include "JavaScriptCore/HeapInlines.h"
|
||||
#include "JavaScriptCore/MarkedBlockInlines.h"
|
||||
#include "JavaScriptCore/SubspaceInlines.h"
|
||||
|
||||
// #include "JavaScriptCore/WeakInlines.h"
|
||||
// #include "JavaScriptCore/AbstractSlotVisitorInlines.h"
|
||||
|
||||
// #include "JavaScriptCore/VM.h"
|
||||
// #include "JavaScriptCore/MarkingConstraint.h"
|
||||
|
||||
// #include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
// namespace JSC {
|
||||
|
||||
// class VisitCounter {
|
||||
// public:
|
||||
// VisitCounter() {}
|
||||
|
||||
// VisitCounter(AbstractSlotVisitor& visitor)
|
||||
// : m_visitor(&visitor)
|
||||
// , m_initialVisitCount(visitor.visitCount())
|
||||
// {
|
||||
// }
|
||||
|
||||
// AbstractSlotVisitor& visitor() const { return *m_visitor; }
|
||||
|
||||
// size_t visitCount() const
|
||||
// {
|
||||
// return m_visitor->visitCount() - m_initialVisitCount;
|
||||
// }
|
||||
|
||||
// private:
|
||||
// AbstractSlotVisitor* m_visitor { nullptr };
|
||||
// size_t m_initialVisitCount { 0 };
|
||||
// };
|
||||
|
||||
// static constexpr bool verboseMarkingConstraint = false;
|
||||
|
||||
// MarkingConstraint::MarkingConstraint(CString abbreviatedName, CString name, ConstraintVolatility volatility, ConstraintConcurrency concurrency, ConstraintParallelism parallelism)
|
||||
// : m_abbreviatedName(abbreviatedName)
|
||||
// , m_name(WTFMove(name))
|
||||
// , m_volatility(volatility)
|
||||
// , m_concurrency(concurrency)
|
||||
// , m_parallelism(parallelism)
|
||||
// {
|
||||
// }
|
||||
|
||||
// MarkingConstraint::~MarkingConstraint()
|
||||
// {
|
||||
// }
|
||||
|
||||
// void MarkingConstraint::resetStats()
|
||||
// {
|
||||
// m_lastVisitCount = 0;
|
||||
// }
|
||||
|
||||
// void MarkingConstraint::execute(SlotVisitor& visitor)
|
||||
// {
|
||||
// ASSERT(!visitor.heap()->isMarkingForGCVerifier());
|
||||
// VisitCounter visitCounter(visitor);
|
||||
// executeImpl(visitor);
|
||||
// m_lastVisitCount += visitCounter.visitCount();
|
||||
// if (verboseMarkingConstraint && visitCounter.visitCount())
|
||||
// dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in execute)");
|
||||
// }
|
||||
|
||||
// void MarkingConstraint::executeSynchronously(AbstractSlotVisitor& visitor)
|
||||
// {
|
||||
// prepareToExecuteImpl(NoLockingNecessary, visitor);
|
||||
// executeImpl(visitor);
|
||||
// }
|
||||
|
||||
// double MarkingConstraint::quickWorkEstimate(SlotVisitor&)
|
||||
// {
|
||||
// return 0;
|
||||
// }
|
||||
|
||||
// double MarkingConstraint::workEstimate(SlotVisitor& visitor)
|
||||
// {
|
||||
// return lastVisitCount() + quickWorkEstimate(visitor);
|
||||
// }
|
||||
|
||||
// void MarkingConstraint::prepareToExecute(const AbstractLocker& constraintSolvingLocker, SlotVisitor& visitor)
|
||||
// {
|
||||
// ASSERT(!visitor.heap()->isMarkingForGCVerifier());
|
||||
// dataLogIf(Options::logGC(), abbreviatedName());
|
||||
// VisitCounter visitCounter(visitor);
|
||||
// prepareToExecuteImpl(constraintSolvingLocker, visitor);
|
||||
// m_lastVisitCount = visitCounter.visitCount();
|
||||
// if (verboseMarkingConstraint && visitCounter.visitCount())
|
||||
// dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in prepareToExecute)");
|
||||
// }
|
||||
|
||||
// void MarkingConstraint::doParallelWork(SlotVisitor& visitor, SharedTask<void(SlotVisitor&)>& task)
|
||||
// {
|
||||
// ASSERT(!visitor.heap()->isMarkingForGCVerifier());
|
||||
// VisitCounter visitCounter(visitor);
|
||||
// task.run(visitor);
|
||||
// if (verboseMarkingConstraint && visitCounter.visitCount())
|
||||
// dataLog("(", abbreviatedName(), " visited ", visitCounter.visitCount(), " in doParallelWork)");
|
||||
// {
|
||||
// Locker locker { m_lock };
|
||||
// m_lastVisitCount += visitCounter.visitCount();
|
||||
// }
|
||||
// }
|
||||
|
||||
// void MarkingConstraint::prepareToExecuteImpl(const AbstractLocker&, AbstractSlotVisitor&)
|
||||
// {
|
||||
// }
|
||||
|
||||
// } // namespace JSC
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
using namespace JSC;
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
#include "JavaScriptCore/JSMicrotask.h"
|
||||
#include "JavaScriptCore/ObjectConstructor.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
namespace WebCore {
|
||||
using JSGlobalObject = JSC::JSGlobalObject;
|
||||
using Exception = JSC::Exception;
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
#include "root.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "wtf/Forward.h"
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
#include "helpers.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
namespace JSC {
|
||||
|
||||
ALWAYS_INLINE GCDeferralContext::GCDeferralContext(VM& vm)
|
||||
|
||||
@@ -18,4 +18,3 @@
|
||||
#include "wtf/GetPtr.h"
|
||||
#include "wtf/Vector.h"
|
||||
#include <cstddef>
|
||||
#include "JavaScriptCore/WeakHandleOwner.h"
|
||||
@@ -25,8 +25,6 @@
|
||||
|
||||
#include "root.h"
|
||||
|
||||
#include "JavaScriptCore/WeakHandleOwner.h"
|
||||
|
||||
#include "ExceptionDetails.h"
|
||||
#include "ExceptionOr.h"
|
||||
#include "JavaScriptCore/ThrowScope.h"
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
|
||||
#include "JSDOMWrapperCache.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
namespace WebCore {
|
||||
using namespace JSC;
|
||||
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
|
||||
#include "BunClientData.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JavaScriptCore/JSFunction.h"
|
||||
#include "JavaScriptCore/JSMicrotask.h"
|
||||
#include "JavaScriptCore/ObjectConstructor.h"
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
#include "JavaScriptCore/JSMicrotask.h"
|
||||
#include "JavaScriptCore/ObjectConstructor.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#pragma mark - Node.js Process
|
||||
|
||||
namespace Zig {
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "wtf/text/WTFString.h"
|
||||
|
||||
#include "GCDefferalContext.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
using ScriptArguments = Inspector::ScriptArguments;
|
||||
using MessageType = JSC::MessageType;
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "JavaScriptCore/InitializeThreading.h"
|
||||
#include "JavaScriptCore/IteratorOperations.h"
|
||||
#include "JavaScriptCore/JSArray.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JavaScriptCore/JSCallbackConstructor.h"
|
||||
#include "JavaScriptCore/JSCallbackObject.h"
|
||||
#include "JavaScriptCore/JSCast.h"
|
||||
@@ -109,7 +109,6 @@ extern "C" void JSCInitialize()
|
||||
has_loaded_jsc = true;
|
||||
JSC::Config::enableRestrictedOptions();
|
||||
|
||||
// JSC::Options::useAtMethod() = true;
|
||||
std::set_terminate([]() { Zig__GlobalObject__onCrash(); });
|
||||
WTF::initializeMainThread();
|
||||
JSC::initialize();
|
||||
@@ -136,12 +135,12 @@ extern "C" JSC__JSGlobalObject* Zig__GlobalObject__create(JSClassRef* globalObje
|
||||
auto heapSize = JSC::HeapType::Large;
|
||||
|
||||
JSC::VM& vm = JSC::VM::create(heapSize).leakRef();
|
||||
JSC::Wasm::enableFastMemory();
|
||||
|
||||
WebCore::JSVMClientData::create(&vm);
|
||||
|
||||
// This must happen before JSVMClientData::create
|
||||
vm.heap.acquireAccess();
|
||||
|
||||
JSC::Wasm::enableFastMemory();
|
||||
WebCore::JSVMClientData::create(&vm);
|
||||
|
||||
JSC::JSLockHolder locker(vm);
|
||||
Zig::GlobalObject* globalObject = Zig::GlobalObject::create(vm, Zig::GlobalObject::createStructure(vm, JSC::JSGlobalObject::create(vm, JSC::JSGlobalObject::createStructure(vm, JSC::jsNull())), JSC::jsNull()));
|
||||
@@ -152,6 +151,7 @@ extern "C" JSC__JSGlobalObject* Zig__GlobalObject__create(JSClassRef* globalObje
|
||||
}
|
||||
|
||||
JSC::gcProtect(globalObject);
|
||||
|
||||
vm.ref();
|
||||
return globalObject;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#include "JavaScriptCore/JSArray.h"
|
||||
#include "JavaScriptCore/JSArrayBuffer.h"
|
||||
#include "JavaScriptCore/JSArrayInlines.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JavaScriptCore/JSCallbackObject.h"
|
||||
#include "JavaScriptCore/JSClassRef.h"
|
||||
#include "JavaScriptCore/JSInternalPromise.h"
|
||||
@@ -2409,7 +2409,7 @@ void JSC__JSValue__getNameProperty(JSC__JSValue JSValue0, JSC__JSGlobalObject* a
|
||||
{
|
||||
|
||||
JSC::JSObject* obj = JSC::JSValue::decode(JSValue0).getObject();
|
||||
JSC::VM &vm = arg1->vm();
|
||||
JSC::VM& vm = arg1->vm();
|
||||
|
||||
if (obj == nullptr) {
|
||||
arg2->len = 0;
|
||||
@@ -2417,10 +2417,9 @@ void JSC__JSValue__getNameProperty(JSC__JSValue JSValue0, JSC__JSGlobalObject* a
|
||||
}
|
||||
|
||||
JSC::JSValue name = obj->getDirect(vm, vm.propertyNames->toStringTagSymbol);
|
||||
if (name == JSC::JSValue{}) {
|
||||
if (name == JSC::JSValue {}) {
|
||||
name = obj->getDirect(vm, vm.propertyNames->name);
|
||||
}
|
||||
|
||||
|
||||
if (name && name.isString()) {
|
||||
auto str = name.toWTFString(arg1);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//-- AUTOGENERATED FILE -- 1648857986
|
||||
//-- AUTOGENERATED FILE -- 1649320745
|
||||
// clang-format off
|
||||
#pragma once
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// clang-format: off
|
||||
//-- AUTOGENERATED FILE -- 1648857986
|
||||
//-- AUTOGENERATED FILE -- 1649320745
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
// #include "headers.h"
|
||||
|
||||
// #include "JavaScriptCore/JSObject.h"
|
||||
// #include "JavaScriptCore/JSCInlines.h"
|
||||
//
|
||||
// #include "JavaScriptCore/InternalFunction.h"
|
||||
|
||||
// namespace Zig {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "wtf/FastMalloc.h"
|
||||
#include "wtf/Noncopyable.h"
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
#include "WebCoreJSClientData.h"
|
||||
#include "JavaScriptCore/FunctionPrototype.h"
|
||||
#include "JavaScriptCore/HeapAnalyzer.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
|
||||
#include "JavaScriptCore/SlotVisitorMacros.h"
|
||||
#include "JavaScriptCore/SubspaceInlines.h"
|
||||
|
||||
@@ -28,8 +28,6 @@
|
||||
#include "wtf/NeverDestroyed.h"
|
||||
#include "JSAbortSignal.h"
|
||||
|
||||
#include "JavaScriptCore/WeakHandleOwner.h"
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
bool JSAbortSignalOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::AbstractSlotVisitor& visitor, const char** reason)
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "config.h"
|
||||
#include "JSDOMConstructor.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
#include "WebCoreJSClientData.h"
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
#include "JSWebGLTransformFeedback.h"
|
||||
#include "JSWebGLVertexArrayObject.h"
|
||||
#include "JSWebGLVertexArrayObjectOES.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
namespace WebCore {
|
||||
using namespace JSC;
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#include "WebCoreJSClientData.h"
|
||||
#include "JavaScriptCore/FunctionPrototype.h"
|
||||
#include "JavaScriptCore/HeapAnalyzer.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
|
||||
#include "JavaScriptCore/SlotVisitorMacros.h"
|
||||
#include "JavaScriptCore/SubspaceInlines.h"
|
||||
|
||||
@@ -27,8 +27,6 @@
|
||||
#include "JavaScriptCore/ErrorPrototype.h"
|
||||
#include "wtf/NeverDestroyed.h"
|
||||
|
||||
#include "JavaScriptCore/WeakHandleOwner.h"
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
class JSDOMException : public JSDOMWrapper<DOMException> {
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
#include "WebCoreJSClientData.h"
|
||||
#include "JavaScriptCore/FunctionPrototype.h"
|
||||
#include "JavaScriptCore/HeapAnalyzer.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
|
||||
#include "JavaScriptCore/SlotVisitorMacros.h"
|
||||
#include "JavaScriptCore/SubspaceInlines.h"
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
#include "JavaScriptCore/FunctionPrototype.h"
|
||||
#include "JavaScriptCore/HeapAnalyzer.h"
|
||||
#include "JavaScriptCore/JSArray.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JavaScriptCore/JSDestructibleObjectHeapCellType.h"
|
||||
#include "JavaScriptCore/SlotVisitorMacros.h"
|
||||
#include "JavaScriptCore/SubspaceInlines.h"
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "root.h"
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "JSDOMWrapper.h"
|
||||
|
||||
// #include "wtf/IsoMalloc.h"
|
||||
|
||||
@@ -25,8 +25,6 @@
|
||||
|
||||
#include "root.h"
|
||||
|
||||
#include "JavaScriptCore/JSCInlines.h"
|
||||
|
||||
#include "WebCoreTypedArrayController.h"
|
||||
|
||||
#include "JSDOMConvertBufferSource.h"
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "config.h"
|
||||
#include "JavaScriptCore/WeakHandleOwner.h"
|
||||
|
||||
namespace JSC {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user