Commit 68b24fae authored by Stefan Behnel's avatar Stefan Behnel

collapse BoolBinopNode during constant folding, small fix for BoolNode folding

parent 23668f32
...@@ -2526,6 +2526,24 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations): ...@@ -2526,6 +2526,24 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
self._calculate_const(node) self._calculate_const(node)
return node return node
def visit_BoolBinopNode(self, node):
self._calculate_const(node)
if node.constant_result is ExprNodes.not_a_constant:
return node
if not node.operand1.is_literal or not node.operand2.is_literal:
# We calculate other constants to make them available to
# the compiler, but we only aggregate constant nodes
# recursively, so non-const nodes are straight out.
return node
if node.constant_result == node.operand1.constant_result and node.operand1.is_literal:
return node.operand1
elif node.constant_result == node.operand2.constant_result and node.operand2.is_literal:
return node.operand2
else:
# FIXME: we could do more ...
return node
def visit_BinopNode(self, node): def visit_BinopNode(self, node):
self._calculate_const(node) self._calculate_const(node)
if node.constant_result is ExprNodes.not_a_constant: if node.constant_result is ExprNodes.not_a_constant:
...@@ -2568,6 +2586,9 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations): ...@@ -2568,6 +2586,9 @@ class ConstantFolding(Visitor.VisitorTransform, SkipDeclarations):
new_node = target_class(pos=node.pos, type = widest_type) new_node = target_class(pos=node.pos, type = widest_type)
new_node.constant_result = node.constant_result new_node.constant_result = node.constant_result
if isinstance(node, ExprNodes.BoolNode):
new_node.value = node.constant_result
else:
new_node.value = str(node.constant_result) new_node.value = str(node.constant_result)
#new_node = new_node.coerce_to(node.type, self.current_scope) #new_node = new_node.coerce_to(node.type, self.current_scope)
return new_node return new_node
......
cimport cython
@cython.test_fail_if_path_exists('//BoolBinopNode')
def or_literal_bint(): def or_literal_bint():
""" """
>>> True or 5 >>> True or 5
...@@ -8,6 +11,7 @@ def or_literal_bint(): ...@@ -8,6 +11,7 @@ def or_literal_bint():
""" """
return True or 5 return True or 5
@cython.test_fail_if_path_exists('//BoolBinopNode')
def and_literal_bint(): def and_literal_bint():
""" """
>>> 5 and True >>> 5 and True
...@@ -17,6 +21,7 @@ def and_literal_bint(): ...@@ -17,6 +21,7 @@ def and_literal_bint():
""" """
return 5 and True return 5 and True
@cython.test_fail_if_path_exists('//BoolBinopNode')
def False_and_True_or_0(): def False_and_True_or_0():
""" """
>>> False and True or 0 >>> False and True or 0
...@@ -26,6 +31,7 @@ def False_and_True_or_0(): ...@@ -26,6 +31,7 @@ def False_and_True_or_0():
""" """
return False and True or 0 return False and True or 0
@cython.test_fail_if_path_exists('//BoolBinopNode')
def True_and_True_or_0(): def True_and_True_or_0():
""" """
>>> True and True or 0 >>> True and True or 0
......
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