Index: Source/bindings/templates/interface.cpp |
diff --git a/Source/bindings/templates/interface.cpp b/Source/bindings/templates/interface.cpp |
index 7a52a835454614793d759fa1a00727b8ec181018..66a684a96a2d7fcab4c2f1d378322673f3a52dc5 100644 |
--- a/Source/bindings/templates/interface.cpp |
+++ b/Source/bindings/templates/interface.cpp |
@@ -678,7 +678,7 @@ static void constructor(const v8::FunctionCallbackInfo<v8::Value>& info) |
{##############################################################################} |
{% block visit_dom_wrapper %} |
-{% if reachable_node_function or reachable_node_reference_function or |
+{% if reachable_node_function or |
set_wrapper_reference_to_list %} |
void {{v8_class}}::visitDOMWrapper(void* object, const v8::Persistent<v8::Object>& wrapper, v8::Isolate* isolate) |
{ |
@@ -696,14 +696,13 @@ void {{v8_class}}::visitDOMWrapper(void* object, const v8::Persistent<v8::Object |
{% endfor %} |
{% endif %} |
{% if reachable_node_function %} |
- if (Node* owner = impl->{{reachable_node_function}}()) { |
- Node* root = V8GCController::opaqueRootForGC(owner, isolate); |
+ // The {{reachable_node_function}}() method may return a reference or a pointer but |
+ // RefPtr can be constructed from either. |
+ if (RefPtr<Node> owner = PassRefPtr<Node>(impl->{{reachable_node_function}}())) { |
+ Node* root = V8GCController::opaqueRootForGC(owner.get(), isolate); |
isolate->SetReferenceFromGroup(v8::UniqueId(reinterpret_cast<intptr_t>(root)), wrapper); |
return; |
} |
- {% elif reachable_node_reference_function %} |
- Node* root = V8GCController::opaqueRootForGC(&impl->{{reachable_node_reference_function}}(), isolate); |
- isolate->SetReferenceFromGroup(v8::UniqueId(reinterpret_cast<intptr_t>(root)), wrapper); |
{% endif %} |
{% if reachable_node_function or set_wrapper_reference_to_list %} |
setObjectGroup(object, wrapper, isolate); |