Commit 2aba562b authored by haraken@chromium.org's avatar haraken@chromium.org

Clean up the IDL compiler around [SetWrapperReferenceFrom/To]

- Rename node_reachable_function to set_wrapper_reference_from.

- Drop support for [SetWrapperReferenceTo=(...)] that takes more than one argument.
There is no use case at the moment.

- No change in the generated code.

BUG=

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

git-svn-id: svn://svn.chromium.org/blink/trunk@198038 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent a85c95a8
......@@ -885,9 +885,12 @@ def ext_attributes_node_to_extended_attributes(idl_name, node):
elif name == 'SetWrapperReferenceTo':
if not child:
raise ValueError('[SetWrapperReferenceTo] requires a child, but has none.')
children = child.GetChildren()
if len(children) != 1:
raise ValueError('[SetWrapperReferenceTo] supports only one child.')
if child_class != 'Arguments':
raise ValueError('[SetWrapperReferenceTo] only supports Arguments as child, but has child of class: %s' % child_class)
extended_attributes[name] = arguments_node_to_arguments(idl_name, child)
extended_attributes[name] = IdlArgument(idl_name, children[0])
elif name == 'Exposed':
if child_class and child_class != 'Arguments':
raise ValueError('[Exposed] only supports Arguments as child, but has child of class: %s' % child_class)
......
......@@ -127,30 +127,31 @@ def interface_context(interface):
includes.add('core/frame/UseCounter.h')
# [SetWrapperReferenceFrom]
reachable_node_function = extended_attributes.get('SetWrapperReferenceFrom')
if reachable_node_function:
set_wrapper_reference_from = extended_attributes.get('SetWrapperReferenceFrom')
if set_wrapper_reference_from:
includes.update(['bindings/core/v8/V8GCController.h',
'core/dom/Element.h'])
# [SetWrapperReferenceTo]
set_wrapper_reference_to_list = [{
'name': argument.name,
# FIXME: properly should be:
# 'cpp_type': argument.idl_type.cpp_type_args(raw_type=True),
# (if type is non-wrapper type like NodeFilter, normally RefPtr)
# Raw pointers faster though, and NodeFilter hacky anyway.
'cpp_type': argument.idl_type.implemented_as + '*',
'idl_type': argument.idl_type,
'v8_type': v8_types.v8_type(argument.idl_type.name),
} for argument in extended_attributes.get('SetWrapperReferenceTo', [])]
for set_wrapper_reference_to in set_wrapper_reference_to_list:
set_wrapper_reference_to_argument = extended_attributes.get('SetWrapperReferenceTo')
set_wrapper_reference_to = None
if set_wrapper_reference_to_argument:
set_wrapper_reference_to = {
'name': set_wrapper_reference_to_argument.name,
# FIXME: properly should be:
# 'cpp_type': set_wrapper_reference_to_argument.idl_type.cpp_type_args(raw_type=True),
# (if type is non-wrapper type like NodeFilter, normally RefPtr)
# Raw pointers faster though, and NodeFilter hacky anyway.
'cpp_type': set_wrapper_reference_to_argument.idl_type.implemented_as + '*',
'idl_type': set_wrapper_reference_to_argument.idl_type,
'v8_type': v8_types.v8_type(set_wrapper_reference_to_argument.idl_type.name),
}
set_wrapper_reference_to['idl_type'].add_includes_for_type()
# [SetWrapperReferenceFrom]
has_visit_dom_wrapper = (
has_extended_attribute_value(interface, 'Custom', 'VisitDOMWrapper') or
reachable_node_function or
set_wrapper_reference_to_list)
set_wrapper_reference_from or set_wrapper_reference_to)
this_gc_type = gc_type(interface)
......@@ -194,9 +195,9 @@ def interface_context(interface):
'pass_cpp_type': cpp_template_type(
cpp_ptr_type('PassRefPtr', 'RawPtr', this_gc_type),
cpp_name(interface)),
'reachable_node_function': reachable_node_function,
'runtime_enabled_function': runtime_enabled_function_name(interface), # [RuntimeEnabled]
'set_wrapper_reference_to_list': set_wrapper_reference_to_list,
'set_wrapper_reference_from': set_wrapper_reference_from,
'set_wrapper_reference_to': set_wrapper_reference_to,
'v8_class': v8_class_name,
'v8_class_or_partial': v8_class_name_or_partial,
'wrapper_class_id': wrapper_class_id,
......
......@@ -555,25 +555,23 @@ static void constructor(const v8::FunctionCallbackInfo<v8::Value>& info)
{##############################################################################}
{% block visit_dom_wrapper %}
{% if reachable_node_function or set_wrapper_reference_to_list %}
{% if set_wrapper_reference_from or set_wrapper_reference_to %}
void {{v8_class}}::visitDOMWrapper(v8::Isolate* isolate, ScriptWrappable* scriptWrappable, const v8::Persistent<v8::Object>& wrapper)
{
{{cpp_class}}* impl = scriptWrappable->toImpl<{{cpp_class}}>();
{% if set_wrapper_reference_to_list %}
{% if set_wrapper_reference_to %}
v8::Local<v8::Object> creationContext = v8::Local<v8::Object>::New(isolate, wrapper);
V8WrapperInstantiationScope scope(creationContext, isolate);
{% 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}}) {
if (!DOMDataStore::containsWrapper({{set_wrapper_reference_to.name}}, isolate))
{{set_wrapper_reference_to.name}}->wrap(isolate, creationContext);
DOMDataStore::setWrapperReference(wrapper, {{set_wrapper_reference_to.name}}, isolate);
}
{% endfor %}
{% endif %}
{% if reachable_node_function %}
// The {{reachable_node_function}}() method may return a reference or a pointer.
if (Node* owner = WTF::getPtr(impl->{{reachable_node_function}}())) {
{% if set_wrapper_reference_from %}
// The {{set_wrapper_reference_from}}() method may return a reference or a pointer.
if (Node* owner = WTF::getPtr(impl->{{set_wrapper_reference_from}}())) {
Node* root = V8GCController::opaqueRootForGC(isolate, owner);
isolate->SetReferenceFromGroup(v8::UniqueId(reinterpret_cast<intptr_t>(root)), wrapper);
return;
......
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