Commit 5b9c3219 authored by Hitoshi Yoshida's avatar Hitoshi Yoshida Committed by Commit Bot

CodeGen: Support [RuntimeEnabled] in dictionary

This CL does not prevent to access ditionary members that have
not-enabled [RuntimeEnabled] from C++ code.
Data conversions between Blink and V8 check the features' status.


Bug: 839389
Change-Id: If8986ce837ab92c536d7d27b262e15f220d4d4fc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1947612Reviewed-by: default avatarYuki Shiino <yukishiino@chromium.org>
Commit-Queue: Hitoshi Yoshida <peria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#721881}
parent dd7127bd
...@@ -16,6 +16,7 @@ from .code_node import SequenceNode ...@@ -16,6 +16,7 @@ from .code_node import SequenceNode
from .code_node import SymbolScopeNode from .code_node import SymbolScopeNode
from .code_node import TextNode from .code_node import TextNode
from .codegen_context import CodeGenContext from .codegen_context import CodeGenContext
from .codegen_expr import expr_from_exposure
from .codegen_format import format_template as _format from .codegen_format import format_template as _format
from .codegen_utils import enclose_with_namespace from .codegen_utils import enclose_with_namespace
from .codegen_utils import make_copyright_header from .codegen_utils import make_copyright_header
...@@ -258,7 +259,17 @@ if ({_1}()) {{ ...@@ -258,7 +259,17 @@ if ({_1}()) {{
}} }}
}}\ }}\
""") """)
body.append(T(_format(pattern, _1=_1, _2=_2, _3=_3))) node = T(_format(pattern, _1=_1, _2=_2, _3=_3))
conditional = expr_from_exposure(member.exposure)
if not conditional.is_always_true:
node = SequenceNode([
T(_format("if ({}) {{", conditional.to_text())),
node,
T("}"),
])
body.append(node)
body.append(T("return true;")) body.append(T("return true;"))
...@@ -411,38 +422,47 @@ def make_fill_own_dict_member(key_index, member): ...@@ -411,38 +422,47 @@ def make_fill_own_dict_member(key_index, member):
T = TextNode T = TextNode
member_set_func = _blink_member_name(member).set_api
node = SequenceNode()
pattern = """ pattern = """
if (!v8_dictionary->Get(current_context, member_names[{_1}].Get(${isolate})) if (!v8_dictionary->Get(current_context, member_names[{_1}].Get(${isolate}))
.ToLocal(&v8_memer)) {{ .ToLocal(&v8_memer)) {{
${exception_state}.RethrowV8Exception(try_block.Exception()); ${exception_state}.RethrowV8Exception(try_block.Exception());
return; return;
}}""" }}"""
node.append(T(_format(pattern, _1=key_index))) get_v8_value_node = T(_format(pattern, _1=key_index))
internal_node = SymbolScopeNode() api_call_node = SymbolScopeNode()
internal_node.register_code_symbol( api_call_node.register_code_symbol(
make_v8_to_blink_value("blink_value", "v8_value", member.idl_type)) make_v8_to_blink_value("blink_value", "v8_value", member.idl_type))
internal_node.append( _1 = _blink_member_name(member).set_api
T(_format("{_1}(${blink_value});", _1=member_set_func))) api_call_node.append(T(_format("{_1}(${blink_value});", _1=_1)))
node.extend([
throw_if_required_member_is_missing_node = None
if member.is_required:
pattern = """\
${exception_state}.ThrowTypeError(
ExceptionMessages::FailedToGet(
"{_1}", "${{dictionary.identifier}}",
"Required member is undefined."));
"""
throw_if_required_member_is_missing_node = T(
_format(pattern, _1=member.identifier))
node = SequenceNode([
get_v8_value_node,
T("if (!v8_value->IsUndefined()) {"), T("if (!v8_value->IsUndefined()) {"),
internal_node, api_call_node,
T("} else {") if throw_if_required_member_is_missing_node else None,
throw_if_required_member_is_missing_node,
T("}"), T("}"),
]) ])
if member.is_required: conditional = expr_from_exposure(member.exposure)
pattern = """\ if not conditional.is_always_true:
else {{ node = SequenceNode([
${exception_state}.ThrowTypeError( T(_format("if ({}) {{", conditional.to_text())),
ExceptionMessages::FailedToGet( node,
"{_1}", "${{dictionary.identifier}}", T("}"),
"Required member is undefined.")); ])
}}"""
node.append(T(_format(pattern, _1=member.identifier)))
return node return node
...@@ -481,7 +501,7 @@ def make_dict_trace_def(cg_context): ...@@ -481,7 +501,7 @@ def make_dict_trace_def(cg_context):
def generate_dictionaries(web_idl_database, output_dirs): def generate_dictionaries(web_idl_database, output_dirs):
dictionary = web_idl_database.find("InternalDictionary") dictionary = web_idl_database.find("MediaDecodingConfiguration")
filename = "example_dictionary.cc" filename = "example_dictionary.cc"
filepath = os.path.join(output_dirs['core'], filename) filepath = os.path.join(output_dirs['core'], filename)
......
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