Commit 422d9c04 authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

bind-gen: Introduce a new SequenceNode

Introduces a new SequenceNode and replaces existing use cases of
SymbolScopeNode with the SequenceNode if appropriate.

The implementation of SequenceNode and SymbolScopeNode is
incomplete, and the follow-up patches will complete the two
classes.

Bug: 839389
Change-Id: I6d578ffe94c386757e76764a4d02221ef0847f51
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1946176
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#720790}
parent 3bc00036
...@@ -208,7 +208,7 @@ class CodeNode(object): ...@@ -208,7 +208,7 @@ class CodeNode(object):
""" """
if self.prev is not None: if self.prev is not None:
prev = self.prev prev = self.prev
while isinstance(prev, SymbolScopeNode) and prev: while isinstance(prev, SequenceNode) and prev:
prev = prev[-1] prev = prev[-1]
return prev return prev
else: else:
...@@ -458,12 +458,10 @@ ${node}\\ ...@@ -458,12 +458,10 @@ ${node}\\
node.reset_prev(None) node.reset_prev(None)
class SymbolScopeNode(ListNode): class SequenceNode(ListNode):
""" """
Represents a sequence of nodes. Represents a sequence of generated code without introducing any new scope,
and provides the points where SymbolDefinitionNodes can be inserted.
If SymbolNodes are rendered inside this node, this node will attempt to
insert corresponding SymbolDefinitionNodes appropriately.
""" """
def __init__(self, code_nodes=None, separator="\n", separator_last=""): def __init__(self, code_nodes=None, separator="\n", separator_last=""):
...@@ -473,8 +471,6 @@ class SymbolScopeNode(ListNode): ...@@ -473,8 +471,6 @@ class SymbolScopeNode(ListNode):
separator=separator, separator=separator,
separator_last=separator_last) separator_last=separator_last)
self._registered_code_symbols = set()
def _render(self, renderer, last_render_state): def _render(self, renderer, last_render_state):
duplicates = [] duplicates = []
for element_node in self: for element_node in self:
...@@ -484,6 +480,28 @@ class SymbolScopeNode(ListNode): ...@@ -484,6 +480,28 @@ class SymbolScopeNode(ListNode):
for element_node in duplicates: for element_node in duplicates:
self.remove(element_node) self.remove(element_node)
return super(SequenceNode, self)._render(
renderer=renderer, last_render_state=last_render_state)
class SymbolScopeNode(SequenceNode):
"""
Represents a scope of generated code.
If SymbolNodes are rendered inside this node, this node will attempt to
insert corresponding SymbolDefinitionNodes appropriately.
"""
def __init__(self, code_nodes=None, separator="\n", separator_last=""):
SequenceNode.__init__(
self,
code_nodes=code_nodes,
separator=separator,
separator_last=separator_last)
self._registered_code_symbols = set()
def _render(self, renderer, last_render_state):
for symbol_node in last_render_state.undefined_code_symbols: for symbol_node in last_render_state.undefined_code_symbols:
if (self.is_code_symbol_registered(symbol_node) if (self.is_code_symbol_registered(symbol_node)
and not self.is_code_symbol_defined(symbol_node)): and not self.is_code_symbol_defined(symbol_node)):
...@@ -525,7 +543,7 @@ class SymbolScopeNode(ListNode): ...@@ -525,7 +543,7 @@ class SymbolScopeNode(ListNode):
def insert_right_before_first_use(symbol_scope_node): def insert_right_before_first_use(symbol_scope_node):
for index, node in enumerate(symbol_scope_node): for index, node in enumerate(symbol_scope_node):
if isinstance(node, SymbolScopeNode): if isinstance(node, SequenceNode):
did_insert = insert_right_before_first_use(node) did_insert = insert_right_before_first_use(node)
if did_insert: if did_insert:
return True return True
...@@ -634,7 +652,7 @@ class SymbolNode(CodeNode): ...@@ -634,7 +652,7 @@ class SymbolNode(CodeNode):
return node return node
class SymbolDefinitionNode(SymbolScopeNode): class SymbolDefinitionNode(SequenceNode):
""" """
Represents a definition of a code symbol. Represents a definition of a code symbol.
...@@ -645,7 +663,7 @@ class SymbolDefinitionNode(SymbolScopeNode): ...@@ -645,7 +663,7 @@ class SymbolDefinitionNode(SymbolScopeNode):
def __init__(self, symbol_node, code_nodes=None): def __init__(self, symbol_node, code_nodes=None):
assert isinstance(symbol_node, SymbolNode) assert isinstance(symbol_node, SymbolNode)
SymbolScopeNode.__init__(self, code_nodes) SequenceNode.__init__(self, code_nodes)
self._symbol_node = symbol_node self._symbol_node = symbol_node
......
...@@ -7,7 +7,7 @@ import web_idl ...@@ -7,7 +7,7 @@ import web_idl
from .clang_format import clang_format from .clang_format import clang_format
from .code_node import CodeNode from .code_node import CodeNode
from .code_node import LiteralNode from .code_node import LiteralNode
from .code_node import SymbolScopeNode from .code_node import SequenceNode
from .codegen_accumulator import CodeGenAccumulator from .codegen_accumulator import CodeGenAccumulator
from .path_manager import PathManager from .path_manager import PathManager
...@@ -40,7 +40,7 @@ def enclose_with_header_guard(code_node, header_guard): ...@@ -40,7 +40,7 @@ def enclose_with_header_guard(code_node, header_guard):
assert isinstance(code_node, CodeNode) assert isinstance(code_node, CodeNode)
assert isinstance(header_guard, str) assert isinstance(header_guard, str)
return SymbolScopeNode([ return SequenceNode([
LiteralNode("#ifndef {}".format(header_guard)), LiteralNode("#ifndef {}".format(header_guard)),
LiteralNode("#define {}".format(header_guard)), LiteralNode("#define {}".format(header_guard)),
LiteralNode(""), LiteralNode(""),
...@@ -54,7 +54,7 @@ def enclose_with_namespace(code_node, namespace): ...@@ -54,7 +54,7 @@ def enclose_with_namespace(code_node, namespace):
assert isinstance(code_node, CodeNode) assert isinstance(code_node, CodeNode)
assert isinstance(namespace, str) assert isinstance(namespace, str)
return SymbolScopeNode([ return SequenceNode([
LiteralNode("namespace {} {{".format(namespace)), LiteralNode("namespace {} {{".format(namespace)),
LiteralNode(""), LiteralNode(""),
code_node, code_node,
......
...@@ -12,6 +12,7 @@ from .blink_v8_bridge import blink_type_info ...@@ -12,6 +12,7 @@ from .blink_v8_bridge import blink_type_info
from .blink_v8_bridge import make_v8_to_blink_value from .blink_v8_bridge import make_v8_to_blink_value
from .code_node import CodeNode from .code_node import CodeNode
from .code_node import FunctionDefinitionNode from .code_node import FunctionDefinitionNode
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
...@@ -394,7 +395,7 @@ def make_fill_own_dict_member(key_index, member): ...@@ -394,7 +395,7 @@ def make_fill_own_dict_member(key_index, member):
member_set_func = name_style.api_func("set", member.identifier) member_set_func = name_style.api_func("set", member.identifier)
node = SymbolScopeNode() 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}))
...@@ -471,7 +472,7 @@ def generate_dictionaries(web_idl_database, output_dirs): ...@@ -471,7 +472,7 @@ def generate_dictionaries(web_idl_database, output_dirs):
root_node = SymbolScopeNode(separator_last="\n") root_node = SymbolScopeNode(separator_last="\n")
root_node.set_renderer(MakoRenderer()) root_node.set_renderer(MakoRenderer())
code_node = SymbolScopeNode() code_node = SequenceNode()
code_node.extend([ code_node.extend([
make_get_v8_dict_member_names_def(cg_context), make_get_v8_dict_member_names_def(cg_context),
......
...@@ -15,6 +15,7 @@ from .blink_v8_bridge import make_v8_to_blink_value_variadic ...@@ -15,6 +15,7 @@ from .blink_v8_bridge import make_v8_to_blink_value_variadic
from .code_node import CodeNode from .code_node import CodeNode
from .code_node import FunctionDefinitionNode from .code_node import FunctionDefinitionNode
from .code_node import LiteralNode from .code_node import LiteralNode
from .code_node import SequenceNode
from .code_node import SymbolDefinitionNode from .code_node import SymbolDefinitionNode
from .code_node import SymbolNode from .code_node import SymbolNode
from .code_node import SymbolScopeNode from .code_node import SymbolScopeNode
...@@ -264,7 +265,7 @@ def make_check_receiver(cg_context): ...@@ -264,7 +265,7 @@ def make_check_receiver(cg_context):
if (cg_context.attribute if (cg_context.attribute
and "LenientThis" in cg_context.attribute.extended_attributes): and "LenientThis" in cg_context.attribute.extended_attributes):
return SymbolScopeNode([ return SequenceNode([
T("// [LenientThis]"), T("// [LenientThis]"),
UnlikelyExitNode( UnlikelyExitNode(
cond=T("!${v8_class}::HasInstance(${receiver}, ${isolate})"), cond=T("!${v8_class}::HasInstance(${receiver}, ${isolate})"),
...@@ -272,7 +273,7 @@ def make_check_receiver(cg_context): ...@@ -272,7 +273,7 @@ def make_check_receiver(cg_context):
]) ])
if cg_context.return_type.unwrap().is_promise: if cg_context.return_type.unwrap().is_promise:
return SymbolScopeNode([ return SequenceNode([
T("// Promise returning function: " T("// Promise returning function: "
"Convert a TypeError to a reject promise."), "Convert a TypeError to a reject promise."),
UnlikelyExitNode( UnlikelyExitNode(
...@@ -311,7 +312,7 @@ def make_check_security_of_return_value(cg_context): ...@@ -311,7 +312,7 @@ def make_check_security_of_return_value(cg_context):
T("V8SetReturnValueNull(${info});\n" T("V8SetReturnValueNull(${info});\n"
"return;"), "return;"),
]) ])
return SymbolScopeNode([ return SequenceNode([
T("// [CheckSecurity=ReturnValue]"), T("// [CheckSecurity=ReturnValue]"),
UnlikelyExitNode(cond=cond, body=body), UnlikelyExitNode(cond=cond, body=body),
]) ])
...@@ -392,7 +393,7 @@ def _make_overload_dispatcher_per_arg_size(items): ...@@ -392,7 +393,7 @@ def _make_overload_dispatcher_per_arg_size(items):
else: else:
arg_index = None arg_index = None
func_like = None func_like = None
dispatcher_nodes = SymbolScopeNode() dispatcher_nodes = SequenceNode()
# True if there exists a case that overload resolution will fail. # True if there exists a case that overload resolution will fail.
can_fail = True can_fail = True
...@@ -580,7 +581,7 @@ def make_overload_dispatcher(cg_context): ...@@ -580,7 +581,7 @@ def make_overload_dispatcher(cg_context):
items_grouped_by_arg_size = itertools.groupby( items_grouped_by_arg_size = itertools.groupby(
sorted(items, key=args_size, reverse=True), key=args_size) sorted(items, key=args_size, reverse=True), key=args_size)
branches = SymbolScopeNode() branches = SequenceNode()
did_use_break = False did_use_break = False
for arg_size, items in items_grouped_by_arg_size: for arg_size, items in items_grouped_by_arg_size:
items = list(items) items = list(items)
...@@ -622,7 +623,7 @@ def make_overload_dispatcher(cg_context): ...@@ -622,7 +623,7 @@ def make_overload_dispatcher(cg_context):
if not did_use_break and arg_size == 0 and conditional.is_always_true: if not did_use_break and arg_size == 0 and conditional.is_always_true:
return branches return branches
return SymbolScopeNode([ return SequenceNode([
branches, branches,
T(""), T(""),
T("${exception_state}.ThrowTypeError" T("${exception_state}.ThrowTypeError"
...@@ -681,7 +682,7 @@ def make_report_measure_as(cg_context): ...@@ -681,7 +682,7 @@ def make_report_measure_as(cg_context):
name_style.raw.upper_camel_case(cg_context.member_like.identifier), name_style.raw.upper_camel_case(cg_context.member_like.identifier),
suffix) suffix)
node = SymbolScopeNode() node = SequenceNode()
pattern = ("// [Measure], [MeasureAs]\n" pattern = ("// [Measure], [MeasureAs]\n"
"UseCounter::Count(${execution_context}, WebFeature::{_1});") "UseCounter::Count(${execution_context}, WebFeature::{_1});")
...@@ -893,7 +894,7 @@ def make_operation_callback_def(cg_context, function_name): ...@@ -893,7 +894,7 @@ def make_operation_callback_def(cg_context, function_name):
return make_operation_function_def( return make_operation_function_def(
cg_context.make_copy(operation=operation_group[0]), function_name) cg_context.make_copy(operation=operation_group[0]), function_name)
node = SymbolScopeNode() node = SequenceNode()
for operation in operation_group: for operation in operation_group:
node.append( node.append(
make_operation_function_def( make_operation_function_def(
...@@ -997,7 +998,7 @@ def generate_interfaces(web_idl_database, output_dirs): ...@@ -997,7 +998,7 @@ def generate_interfaces(web_idl_database, output_dirs):
root_node.accumulator.add_include_headers( root_node.accumulator.add_include_headers(
collect_include_headers(interface)) collect_include_headers(interface))
code_node = SymbolScopeNode() code_node = SequenceNode()
for attribute in interface.attributes: for attribute in interface.attributes:
func_name = name_style.func(attribute.identifier, func_name = name_style.func(attribute.identifier,
......
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