diff options
author | 2022-11-20 07:02:14 -0800 | |
---|---|---|
committer | 2022-11-20 07:02:14 -0800 | |
commit | dfa62b660d6bde4dc210158920b4bf397ca8cd45 (patch) | |
tree | 898942178ca45d4db23e6f9fb7e1b60e6d416ea2 | |
parent | 5ff2cd3418c339409c33c63f7777ee9a93837414 (diff) | |
download | bun-dfa62b660d6bde4dc210158920b4bf397ca8cd45.tar.gz bun-dfa62b660d6bde4dc210158920b4bf397ca8cd45.tar.zst bun-dfa62b660d6bde4dc210158920b4bf397ca8cd45.zip |
[internal] Implement `visitAdditionalChildren`
-rw-r--r-- | src/bun.js/bindings/ZigGeneratedClasses.cpp | 225 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGeneratedClasses.h | 72 | ||||
-rw-r--r-- | src/bun.js/scripts/generate-classes.ts | 94 |
3 files changed, 326 insertions, 65 deletions
diff --git a/src/bun.js/bindings/ZigGeneratedClasses.cpp b/src/bun.js/bindings/ZigGeneratedClasses.cpp index 926bca81c..cdff44ee0 100644 --- a/src/bun.js/bindings/ZigGeneratedClasses.cpp +++ b/src/bun.js/bindings/ZigGeneratedClasses.cpp @@ -489,9 +489,9 @@ extern "C" EncodedJSValue TCPSocket__getConstructor(Zig::GlobalObject* globalObj } extern "C" bool TCPSocket__hasPendingActivity(void* ptr); -bool JSTCPSocket::internalHasPendingActivity() +bool JSTCPSocket::hasPendingActivity(void* ctx) { - return TCPSocket__hasPendingActivity(m_ctx); + return TCPSocket__hasPendingActivity(ctx); } JSTCPSocket::~JSTCPSocket() @@ -575,9 +575,33 @@ void JSTCPSocket::visitChildrenImpl(JSCell* cell, Visitor& visitor) visitor.append(thisObject->m_data); visitor.append(thisObject->m_remoteAddress); + visitor.addOpaqueRoot(thisObject->wrapped()); } DEFINE_VISIT_CHILDREN(JSTCPSocket); + +template<typename Visitor> +void JSTCPSocket::visitAdditionalChildren(Visitor& visitor) +{ + JSTCPSocket* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_data); + visitor.append(thisObject->m_remoteAddress); + visitor.addOpaqueRoot(this->wrapped()); +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSTCPSocket); + +template<typename Visitor> +void JSTCPSocket::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSTCPSocket* thisObject = jsCast<JSTCPSocket*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSTCPSocket); class JSTLSSocketPrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -1040,9 +1064,9 @@ extern "C" EncodedJSValue TLSSocket__getConstructor(Zig::GlobalObject* globalObj } extern "C" bool TLSSocket__hasPendingActivity(void* ptr); -bool JSTLSSocket::internalHasPendingActivity() +bool JSTLSSocket::hasPendingActivity(void* ctx) { - return TLSSocket__hasPendingActivity(m_ctx); + return TLSSocket__hasPendingActivity(ctx); } JSTLSSocket::~JSTLSSocket() @@ -1126,9 +1150,33 @@ void JSTLSSocket::visitChildrenImpl(JSCell* cell, Visitor& visitor) visitor.append(thisObject->m_data); visitor.append(thisObject->m_remoteAddress); + visitor.addOpaqueRoot(thisObject->wrapped()); } DEFINE_VISIT_CHILDREN(JSTLSSocket); + +template<typename Visitor> +void JSTLSSocket::visitAdditionalChildren(Visitor& visitor) +{ + JSTLSSocket* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_data); + visitor.append(thisObject->m_remoteAddress); + visitor.addOpaqueRoot(this->wrapped()); +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSTLSSocket); + +template<typename Visitor> +void JSTLSSocket::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSTLSSocket* thisObject = jsCast<JSTLSSocket*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSTLSSocket); class JSListenerPrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -1578,6 +1626,29 @@ void JSListener::visitChildrenImpl(JSCell* cell, Visitor& visitor) } DEFINE_VISIT_CHILDREN(JSListener); + +template<typename Visitor> +void JSListener::visitAdditionalChildren(Visitor& visitor) +{ + JSListener* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_hostname); + visitor.append(thisObject->m_unix); + ; +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSListener); + +template<typename Visitor> +void JSListener::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSListener* thisObject = jsCast<JSListener*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSListener); class JSSubprocessPrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -2047,9 +2118,9 @@ extern "C" EncodedJSValue Subprocess__getConstructor(Zig::GlobalObject* globalOb } extern "C" bool Subprocess__hasPendingActivity(void* ptr); -bool JSSubprocess::internalHasPendingActivity() +bool JSSubprocess::hasPendingActivity(void* ctx) { - return Subprocess__hasPendingActivity(m_ctx); + return Subprocess__hasPendingActivity(ctx); } JSSubprocess::~JSSubprocess() @@ -2134,9 +2205,34 @@ void JSSubprocess::visitChildrenImpl(JSCell* cell, Visitor& visitor) visitor.append(thisObject->m_stderr); visitor.append(thisObject->m_stdin); visitor.append(thisObject->m_stdout); + visitor.addOpaqueRoot(thisObject->wrapped()); } DEFINE_VISIT_CHILDREN(JSSubprocess); + +template<typename Visitor> +void JSSubprocess::visitAdditionalChildren(Visitor& visitor) +{ + JSSubprocess* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_stderr); + visitor.append(thisObject->m_stdin); + visitor.append(thisObject->m_stdout); + visitor.addOpaqueRoot(this->wrapped()); +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSSubprocess); + +template<typename Visitor> +void JSSubprocess::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSSubprocess* thisObject = jsCast<JSSubprocess*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSSubprocess); class JSSHA1Prototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -5264,6 +5360,29 @@ void JSServerWebSocket::visitChildrenImpl(JSCell* cell, Visitor& visitor) } DEFINE_VISIT_CHILDREN(JSServerWebSocket); + +template<typename Visitor> +void JSServerWebSocket::visitAdditionalChildren(Visitor& visitor) +{ + JSServerWebSocket* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_data); + visitor.append(thisObject->m_remoteAddress); + ; +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSServerWebSocket); + +template<typename Visitor> +void JSServerWebSocket::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSServerWebSocket* thisObject = jsCast<JSServerWebSocket*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSServerWebSocket); class JSExpectPrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -6301,6 +6420,29 @@ void JSExpect::visitChildrenImpl(JSCell* cell, Visitor& visitor) } DEFINE_VISIT_CHILDREN(JSExpect); + +template<typename Visitor> +void JSExpect::visitAdditionalChildren(Visitor& visitor) +{ + JSExpect* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + visitor.append(thisObject->m_capturedValue); + visitor.append(thisObject->m_resultValue); + + ; +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSExpect); + +template<typename Visitor> +void JSExpect::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSExpect* thisObject = jsCast<JSExpect*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSExpect); class JSTextDecoderPrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -6642,6 +6784,28 @@ void JSTextDecoder::visitChildrenImpl(JSCell* cell, Visitor& visitor) } DEFINE_VISIT_CHILDREN(JSTextDecoder); + +template<typename Visitor> +void JSTextDecoder::visitAdditionalChildren(Visitor& visitor) +{ + JSTextDecoder* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_encoding); + ; +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSTextDecoder); + +template<typename Visitor> +void JSTextDecoder::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSTextDecoder* thisObject = jsCast<JSTextDecoder*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSTextDecoder); class JSRequestPrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -7267,6 +7431,30 @@ void JSRequest::visitChildrenImpl(JSCell* cell, Visitor& visitor) } DEFINE_VISIT_CHILDREN(JSRequest); + +template<typename Visitor> +void JSRequest::visitAdditionalChildren(Visitor& visitor) +{ + JSRequest* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_body); + visitor.append(thisObject->m_headers); + visitor.append(thisObject->m_url); + ; +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSRequest); + +template<typename Visitor> +void JSRequest::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSRequest* thisObject = jsCast<JSRequest*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSRequest); class JSResponsePrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; @@ -7857,6 +8045,31 @@ void JSResponse::visitChildrenImpl(JSCell* cell, Visitor& visitor) } DEFINE_VISIT_CHILDREN(JSResponse); + +template<typename Visitor> +void JSResponse::visitAdditionalChildren(Visitor& visitor) +{ + JSResponse* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + + visitor.append(thisObject->m_body); + visitor.append(thisObject->m_headers); + visitor.append(thisObject->m_statusText); + visitor.append(thisObject->m_url); + ; +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(JSResponse); + +template<typename Visitor> +void JSResponse::visitOutputConstraintsImpl(JSCell* cell, Visitor& visitor) +{ + JSResponse* thisObject = jsCast<JSResponse*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(JSResponse); class JSBlobPrototype final : public JSC::JSNonFinalObject { public: using Base = JSC::JSNonFinalObject; diff --git a/src/bun.js/bindings/ZigGeneratedClasses.h b/src/bun.js/bindings/ZigGeneratedClasses.h index e94b33335..27665927f 100644 --- a/src/bun.js/bindings/ZigGeneratedClasses.h +++ b/src/bun.js/bindings/ZigGeneratedClasses.h @@ -66,21 +66,21 @@ public: void finishCreation(JSC::VM&); JSC::Weak<JSTCPSocket> m_weakThis; - bool internalHasPendingActivity(); - bool hasPendingActivity() - { - if (UNLIKELY(!m_ctx)) - return false; - return this->internalHasPendingActivity(); - } + static bool hasPendingActivity(void* ctx); class Owner final : public JSC::WeakHandleOwner { public: - bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor&, const char**) final + bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor& visitor, const char** reason) final { auto* controller = JSC::jsCast<JSTCPSocket*>(handle.slot()->asCell()); - return controller->hasPendingActivity(); + if (JSTCPSocket::hasPendingActivity(controller->wrapped())) { + if (UNLIKELY(reason)) + *reason = "has pending activity"; + return true; + } + + return visitor.containsOpaqueRoot(context); } void finalize(JSC::Handle<JSC::Unknown>, void* context) final {} }; @@ -92,6 +92,8 @@ public: } DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_data; mutable JSC::WriteBarrier<JSC::Unknown> m_remoteAddress; @@ -148,21 +150,21 @@ public: void finishCreation(JSC::VM&); JSC::Weak<JSTLSSocket> m_weakThis; - bool internalHasPendingActivity(); - bool hasPendingActivity() - { - if (UNLIKELY(!m_ctx)) - return false; - return this->internalHasPendingActivity(); - } + static bool hasPendingActivity(void* ctx); class Owner final : public JSC::WeakHandleOwner { public: - bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor&, const char**) final + bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor& visitor, const char** reason) final { auto* controller = JSC::jsCast<JSTLSSocket*>(handle.slot()->asCell()); - return controller->hasPendingActivity(); + if (JSTLSSocket::hasPendingActivity(controller->wrapped())) { + if (UNLIKELY(reason)) + *reason = "has pending activity"; + return true; + } + + return visitor.containsOpaqueRoot(context); } void finalize(JSC::Handle<JSC::Unknown>, void* context) final {} }; @@ -174,6 +176,8 @@ public: } DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_data; mutable JSC::WriteBarrier<JSC::Unknown> m_remoteAddress; @@ -229,6 +233,8 @@ public: void finishCreation(JSC::VM&); DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_hostname; mutable JSC::WriteBarrier<JSC::Unknown> m_unix; @@ -285,21 +291,21 @@ public: void finishCreation(JSC::VM&); JSC::Weak<JSSubprocess> m_weakThis; - bool internalHasPendingActivity(); - bool hasPendingActivity() - { - if (UNLIKELY(!m_ctx)) - return false; - return this->internalHasPendingActivity(); - } + static bool hasPendingActivity(void* ctx); class Owner final : public JSC::WeakHandleOwner { public: - bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor&, const char**) final + bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor& visitor, const char** reason) final { auto* controller = JSC::jsCast<JSSubprocess*>(handle.slot()->asCell()); - return controller->hasPendingActivity(); + if (JSSubprocess::hasPendingActivity(controller->wrapped())) { + if (UNLIKELY(reason)) + *reason = "has pending activity"; + return true; + } + + return visitor.containsOpaqueRoot(context); } void finalize(JSC::Handle<JSC::Unknown>, void* context) final {} }; @@ -311,6 +317,8 @@ public: } DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_stderr; mutable JSC::WriteBarrier<JSC::Unknown> m_stdin; @@ -767,6 +775,8 @@ public: void finishCreation(JSC::VM&); DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_data; mutable JSC::WriteBarrier<JSC::Unknown> m_remoteAddress; @@ -822,6 +832,8 @@ public: void finishCreation(JSC::VM&); DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_capturedValue; mutable JSC::WriteBarrier<JSC::Unknown> m_resultValue; @@ -877,6 +889,8 @@ public: void finishCreation(JSC::VM&); DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_encoding; }; @@ -931,6 +945,8 @@ public: void finishCreation(JSC::VM&); DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_body; mutable JSC::WriteBarrier<JSC::Unknown> m_headers; @@ -987,6 +1003,8 @@ public: void finishCreation(JSC::VM&); DECLARE_VISIT_CHILDREN; + template<typename Visitor> void visitAdditionalChildren(Visitor&); + DECLARE_VISIT_OUTPUT_CONSTRAINTS; mutable JSC::WriteBarrier<JSC::Unknown> m_body; mutable JSC::WriteBarrier<JSC::Unknown> m_headers; diff --git a/src/bun.js/scripts/generate-classes.ts b/src/bun.js/scripts/generate-classes.ts index 60d269894..5a30379d0 100644 --- a/src/bun.js/scripts/generate-classes.ts +++ b/src/bun.js/scripts/generate-classes.ts @@ -908,47 +908,48 @@ function generateClassHeader(typeName, obj: ClassDefinition) { const DECLARE_VISIT_CHILDREN = values.length || obj.estimatedSize || + obj.hasPendingActivity || [...Object.values(klass), ...Object.values(proto)].find((a) => !!a.cache) - ? "DECLARE_VISIT_CHILDREN;" + ? "DECLARE_VISIT_CHILDREN;\ntemplate<typename Visitor> void visitAdditionalChildren(Visitor&);\nDECLARE_VISIT_OUTPUT_CONSTRAINTS;\n" : ""; const sizeEstimator = obj.estimatedSize ? "static size_t estimatedSize(JSCell* cell, VM& vm);" : ""; var weakOwner = ""; - var weakInit = ""; - + var weakInit = ``; if (obj.hasPendingActivity) { + weakInit = `m_weakThis = JSC::Weak<${name}>(this, getOwner());`; weakOwner = ` - JSC::Weak<${name}> m_weakThis; - bool internalHasPendingActivity(); - bool hasPendingActivity() { - if (UNLIKELY(!m_ctx)) - return false; - - return this->internalHasPendingActivity(); + JSC::Weak<${name}> m_weakThis; + + + static bool hasPendingActivity(void* ctx); + + class Owner final : public JSC::WeakHandleOwner { + public: + bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor& visitor, const char** reason) final + { + auto* controller = JSC::jsCast<${name}*>(handle.slot()->asCell()); + if (${name}::hasPendingActivity(controller->wrapped())) { + if (UNLIKELY(reason)) + *reason = "has pending activity"; + return true; + } + + return visitor.containsOpaqueRoot(context); + } + void finalize(JSC::Handle<JSC::Unknown>, void* context) final {} + }; + + static JSC::WeakHandleOwner* getOwner() + { + static NeverDestroyed<Owner> m_owner; + return &m_owner.get(); } - - class Owner final : public JSC::WeakHandleOwner { - public: - bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor&, const char**) final - { - auto* controller = JSC::jsCast<${name}*>(handle.slot()->asCell()); - return controller->hasPendingActivity(); - } - void finalize(JSC::Handle<JSC::Unknown>, void* context) final {} - }; - - static JSC::WeakHandleOwner* getOwner() - { - static NeverDestroyed<Owner> m_owner; - return &m_owner.get(); - } `; - weakInit = ` - m_weakThis = JSC::Weak<${name}>(this, getOwner()); -`; } + return ` class ${name} final : public JSC::JSDestructibleObject { public: @@ -1046,7 +1047,12 @@ function generateClassImpl(typeName, obj: ClassDefinition) { }) .join("\n"); var DEFINE_VISIT_CHILDREN = ""; - if (DEFINE_VISIT_CHILDREN_LIST.length || estimatedSize || values.length) { + if ( + DEFINE_VISIT_CHILDREN_LIST.length || + estimatedSize || + values.length || + hasPendingActivity + ) { DEFINE_VISIT_CHILDREN = ` template<typename Visitor> void ${name}::visitChildrenImpl(JSCell* cell, Visitor& visitor) @@ -1063,9 +1069,33 @@ visitor.reportExtraMemoryVisited(${symbolName(obj.name, "estimatedSize")}(ptr)); : "" } ${DEFINE_VISIT_CHILDREN_LIST} +${hasPendingActivity ? `visitor.addOpaqueRoot(thisObject->wrapped());` : ""} } DEFINE_VISIT_CHILDREN(${name}); + +template<typename Visitor> +void ${name}::visitAdditionalChildren(Visitor& visitor) +{ + ${name}* thisObject = this; + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + ${values} + ${DEFINE_VISIT_CHILDREN_LIST} + ${hasPendingActivity ? "visitor.addOpaqueRoot(this->wrapped())" : ""}; +} + +DEFINE_VISIT_ADDITIONAL_CHILDREN(${name}); + +template<typename Visitor> +void ${name}::visitOutputConstraintsImpl(JSCell *cell, Visitor& visitor) +{ + ${name}* thisObject = jsCast<${name}*>(cell); + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); + thisObject->visitAdditionalChildren<Visitor>(visitor); +} + +DEFINE_VISIT_OUTPUT_CONSTRAINTS(${name}); + `.trim(); } @@ -1074,8 +1104,8 @@ DEFINE_VISIT_CHILDREN(${name}); if (hasPendingActivity) { output += ` extern "C" bool ${symbolName(typeName, "hasPendingActivity")}(void* ptr); - bool ${name}::internalHasPendingActivity() { - return ${symbolName(typeName, "hasPendingActivity")}(m_ctx); + bool ${name}::hasPendingActivity(void* ctx) { + return ${symbolName(typeName, "hasPendingActivity")}(ctx); } `; } |