Commit 5595df4d authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

bind-gen: Fix SymbolDefinitionNode insertion to be aware of registeration

Make SymbolDefinitionNode insertion happen only when the SymbolNode
is already registered.

Bug: 839389
Change-Id: I5ce1e21511866a511659d1d6e7b3658ccddc5650
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1873807Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Cr-Commit-Position: refs/heads/master@{#708944}
parent eccefc6f
...@@ -281,6 +281,15 @@ class CodeNode(object): ...@@ -281,6 +281,15 @@ class CodeNode(object):
return self.upstream.is_code_symbol_defined(symbol_node) return self.upstream.is_code_symbol_defined(symbol_node)
return False return False
def is_code_symbol_registered(self, symbol_node):
"""
Returns True if |symbol_node| is registered and available for use at
this point. See also |SymbolScopeNode.register_code_symbol|.
"""
if self.outer is not None:
return self.outer.is_code_symbol_registered(symbol_node)
return False
def on_undefined_code_symbol_found(self, symbol_node): def on_undefined_code_symbol_found(self, symbol_node):
"""Receives a report of use of an undefined symbol node.""" """Receives a report of use of an undefined symbol node."""
assert isinstance(symbol_node, SymbolNode) assert isinstance(symbol_node, SymbolNode)
...@@ -532,13 +541,16 @@ class SymbolScopeNode(SequenceNode): ...@@ -532,13 +541,16 @@ class SymbolScopeNode(SequenceNode):
separator_last="\n", separator_last="\n",
renderer=renderer) renderer=renderer)
self._registered_code_symbols = set()
def _render(self, renderer, last_render_state): def _render(self, renderer, last_render_state):
# Sort nodes in order to render reproducible results. # Sort nodes in order to render reproducible results.
symbol_nodes = sorted( symbol_nodes = sorted(
last_render_state.undefined_code_symbols, last_render_state.undefined_code_symbols,
key=lambda symbol_node: symbol_node.name) key=lambda symbol_node: symbol_node.name)
for symbol_node in symbol_nodes: for symbol_node in symbol_nodes:
if not self.is_code_symbol_defined(symbol_node): if (self.is_code_symbol_registered(symbol_node)
and not self.is_code_symbol_defined(symbol_node)):
self._insert_symbol_definition(symbol_node) self._insert_symbol_definition(symbol_node)
return super(SymbolScopeNode, self)._render( return super(SymbolScopeNode, self)._render(
...@@ -605,10 +617,17 @@ class SymbolScopeNode(SequenceNode): ...@@ -605,10 +617,17 @@ class SymbolScopeNode(SequenceNode):
did_insert = insert_right_before_first_use(self) did_insert = insert_right_before_first_use(self)
assert did_insert assert did_insert
def is_code_symbol_registered(self, symbol_node):
if symbol_node in self._registered_code_symbols:
return True
return super(SymbolScopeNode,
self).is_code_symbol_registered(symbol_node)
def register_code_symbol(self, symbol_node): def register_code_symbol(self, symbol_node):
"""Registers a SymbolNode and makes it available in this scope.""" """Registers a SymbolNode and makes it available in this scope."""
assert isinstance(symbol_node, SymbolNode) assert isinstance(symbol_node, SymbolNode)
self.add_template_var(symbol_node.name, symbol_node) self.add_template_var(symbol_node.name, symbol_node)
self._registered_code_symbols.add(symbol_node)
def register_code_symbols(self, symbol_nodes): def register_code_symbols(self, symbol_nodes):
for symbol_node in symbol_nodes: for symbol_node in symbol_nodes:
......
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