Commit c73c2f96 authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

bind-gen: Implement CxxMultiBranchesNode

Implements if-else if-...-else chain.

Bug: 839389
Change-Id: Ib9a86fe2acf2c768f8ee09e2ff1d177f65596a3e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1958248
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#722953}
parent 5611ed8b
...@@ -13,11 +13,15 @@ from .code_node import ListNode ...@@ -13,11 +13,15 @@ from .code_node import ListNode
from .code_node import SymbolScopeNode from .code_node import SymbolScopeNode
from .code_node import TextNode from .code_node import TextNode
from .codegen_expr import CodeGenExpr from .codegen_expr import CodeGenExpr
from .codegen_format import format_template
class CxxBlockNode(CompositeNode): class CxxBlockNode(CompositeNode):
def __init__(self, body): def __init__(self, body):
template_format = ("{{\n" " {body}\n" "}}") template_format = (
"{{\n" #
" {body}\n" #
"}}")
CompositeNode.__init__( CompositeNode.__init__(
self, self,
...@@ -27,7 +31,10 @@ class CxxBlockNode(CompositeNode): ...@@ -27,7 +31,10 @@ class CxxBlockNode(CompositeNode):
class CxxIfNode(CompositeNode): class CxxIfNode(CompositeNode):
def __init__(self, cond, body, likeliness): def __init__(self, cond, body, likeliness):
template_format = ("if ({cond}) {{\n" " {body}\n" "}}") template_format = (
"if ({cond}) {{\n" #
" {body}\n" #
"}}")
CompositeNode.__init__( CompositeNode.__init__(
self, self,
...@@ -38,11 +45,12 @@ class CxxIfNode(CompositeNode): ...@@ -38,11 +45,12 @@ class CxxIfNode(CompositeNode):
class CxxIfElseNode(CompositeNode): class CxxIfElseNode(CompositeNode):
def __init__(self, cond, then, then_likeliness, else_, else_likeliness): def __init__(self, cond, then, then_likeliness, else_, else_likeliness):
template_format = ("if ({cond}) {{\n" template_format = (
" {then}\n" "if ({cond}) {{\n" #
"}} else {{\n" " {then}\n" #
" {else_}\n" "}} else {{\n" #
"}}") " {else_}\n" #
"}}")
CompositeNode.__init__( CompositeNode.__init__(
self, self,
...@@ -62,6 +70,65 @@ class CxxUnlikelyIfNode(CxxIfNode): ...@@ -62,6 +70,65 @@ class CxxUnlikelyIfNode(CxxIfNode):
CxxIfNode.__init__(self, cond, body, Likeliness.UNLIKELY) CxxIfNode.__init__(self, cond, body, Likeliness.UNLIKELY)
class CxxMultiBranchesNode(CodeNode):
class _Clause(object):
def __init__(self, cond, body):
assert isinstance(cond, (CodeNode, bool))
assert isinstance(body, SymbolScopeNode)
self.cond = cond
self.body = body
def __init__(self):
clauses_gensym = CodeNode.gensym()
clauses = []
template_text = format_template(
"""\
% for {clause} in {clauses}:
% if not loop.first:
else \\
% endif
% if {clause}.cond is not False:
% if {clause}.cond is not True:
if (${{{clause}.cond}}) \\
% endif
{{
${{{clause}.body}}
}}\\
% if {clause}.cond is True:
<% break %>
% endif
% endif
% endfor\
""",
clause=CodeNode.gensym(),
clauses=clauses_gensym)
template_vars = {clauses_gensym: clauses}
CodeNode.__init__(
self, template_text=template_text, template_vars=template_vars)
self._clauses = clauses
def append(self, cond, body, likeliness=Likeliness.LIKELY):
if cond is None:
cond = False
elif isinstance(cond, CodeGenExpr):
if cond.is_always_true:
cond = True
elif cond.is_always_false:
cond = False
if not isinstance(cond, bool):
cond = _to_conditional_node(cond)
body = _to_symbol_scope_node(body, likeliness)
if isinstance(cond, CodeNode):
cond.set_outer(self)
body.set_outer(self)
self._clauses.append(self._Clause(cond, body))
class CxxBreakableBlockNode(CompositeNode): class CxxBreakableBlockNode(CompositeNode):
def __init__(self, body, likeliness=Likeliness.LIKELY): def __init__(self, body, likeliness=Likeliness.LIKELY):
template_format = ("do {{ // Dummy loop for use of 'break'.\n" template_format = ("do {{ // Dummy loop for use of 'break'.\n"
......
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