Commit 1a0d7748 authored by kouhei@chromium.org's avatar kouhei@chromium.org

Revert of Forbid creating new wrapper from SetWrapperReferenceTo...

Revert of Forbid creating new wrapper from SetWrapperReferenceTo (https://codereview.chromium.org/332643003/)

Reason for revert:
There seems to be an existing bug which hits this callpath. Reverting the change until the bug is fixed.

Original issue's description:
> Forbid creating new wrapper from SetWrapperReferenceTo
> 
> SetWrapperReferenceTo IDL attribute is a hack to use V8 wrapper reference
> to avoid reference cycles in Blink. The |visitDOMWrapper| callback is
> used to create a temporary strong reference between the wrappers in GC
> prologue.
> 
> Before this patch, |visitDOMWrapper| was allowed to create a new wrapper
> if the wrapper for target object didn't exist. However this is dangerous,
> as the target object may be already destructed. The target wrapper must
> already exist for this reference hack to work correctly.
> 
> This patch forbids creating a new wrapper from |visitDOMWrapper| callback,
> and adds an ASSERT that checks that the target object wrapper already
> exists.
> 
> BUG=None
> 
> Committed: https://src.chromium.org/viewvc/blink?view=rev&revision=175998

TBR=nbarth@chromium.org,haraken@chromium.org
BUG=384459

Review URL: https://codereview.chromium.org/332183008

git-svn-id: svn://svn.chromium.org/blink/trunk@176281 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 89c53c9f
......@@ -709,7 +709,8 @@ void {{v8_class}}::visitDOMWrapper(void* object, const v8::Persistent<v8::Object
{% for set_wrapper_reference_to in set_wrapper_reference_to_list %}
{{set_wrapper_reference_to.cpp_type}} {{set_wrapper_reference_to.name}} = impl->{{set_wrapper_reference_to.name}}();
if ({{set_wrapper_reference_to.name}}) {
ASSERT(DOMDataStore::containsWrapper<{{set_wrapper_reference_to.v8_type}}>({{set_wrapper_reference_to.name}}, isolate));
if (!DOMDataStore::containsWrapper<{{set_wrapper_reference_to.v8_type}}>({{set_wrapper_reference_to.name}}, isolate))
wrap({{set_wrapper_reference_to.name}}, creationContext, isolate);
DOMDataStore::setWrapperReference<{{set_wrapper_reference_to.v8_type}}>(wrapper, {{set_wrapper_reference_to.name}}, isolate);
}
{% endfor %}
......
......@@ -1308,7 +1308,8 @@ void V8TestInterface::visitDOMWrapper(void* object, const v8::Persistent<v8::Obj
V8WrapperInstantiationScope scope(creationContext, isolate);
TestInterfaceImplementation* referencedName = impl->referencedName();
if (referencedName) {
ASSERT(DOMDataStore::containsWrapper<V8TestInterface>(referencedName, isolate));
if (!DOMDataStore::containsWrapper<V8TestInterface>(referencedName, isolate))
wrap(referencedName, creationContext, isolate);
DOMDataStore::setWrapperReference<V8TestInterface>(wrapper, referencedName, isolate);
}
setObjectGroup(object, wrapper, isolate);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment