summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ParseTreeTransforms.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2015-09-04 13:27:58 +0200
committerStefan Behnel <stefan_ml@behnel.de>2015-09-04 13:27:58 +0200
commitab78f93b3ffa88183a0d2aae6b692e394c51f860 (patch)
treeceebd767385aad1878904c4ce0843ba78d6afb1d /Cython/Compiler/ParseTreeTransforms.py
parent7da496024a2ecb93a85de79756e4e89f2d289187 (diff)
downloadcython-ab78f93b3ffa88183a0d2aae6b692e394c51f860.tar.gz
adapt and apply major refactoring of IndexNode originally written by Mark Florisson
Diffstat (limited to 'Cython/Compiler/ParseTreeTransforms.py')
-rw-r--r--Cython/Compiler/ParseTreeTransforms.py21
1 files changed, 8 insertions, 13 deletions
diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py
index 947a77443..5fd120e41 100644
--- a/Cython/Compiler/ParseTreeTransforms.py
+++ b/Cython/Compiler/ParseTreeTransforms.py
@@ -17,7 +17,7 @@ from . import Builtin
from .Visitor import VisitorTransform, TreeVisitor
from .Visitor import CythonTransform, EnvTransform, ScopeTrackingTransform
-from .UtilNodes import LetNode, LetRefNode, ResultRefNode
+from .UtilNodes import LetNode, LetRefNode
from .TreeFragment import TreeFragment
from .StringEncoding import EncodedString, _unicode
from .Errors import error, warning, CompileError, InternalError
@@ -1931,13 +1931,8 @@ class AnalyseExpressionsTransform(CythonTransform):
re-analyse the types.
"""
self.visit_Node(node)
-
if node.is_fused_index and not node.type.is_error:
node = node.base
- elif node.memslice_ellipsis_noop:
- # memoryviewslice[...] expression, drop the IndexNode
- node = node.base
-
return node
@@ -1971,26 +1966,26 @@ class ExpandInplaceOperators(EnvTransform):
if lhs.type.is_cpp_class:
# No getting around this exact operator here.
return node
- if isinstance(lhs, ExprNodes.IndexNode) and lhs.is_buffer_access:
- # There is code to handle this case.
+ if isinstance(lhs, ExprNodes.BufferIndexNode):
+ # There is code to handle this case in InPlaceAssignmentNode
return node
env = self.current_env()
def side_effect_free_reference(node, setting=False):
- if isinstance(node, ExprNodes.NameNode):
+ if node.is_name:
return node, []
elif node.type.is_pyobject and not setting:
node = LetRefNode(node)
return node, [node]
- elif isinstance(node, ExprNodes.IndexNode):
- if node.is_buffer_access:
- raise ValueError("Buffer access")
+ elif node.is_subscript:
base, temps = side_effect_free_reference(node.base)
index = LetRefNode(node.index)
return ExprNodes.IndexNode(node.pos, base=base, index=index), temps + [index]
- elif isinstance(node, ExprNodes.AttributeNode):
+ elif node.is_attribute:
obj, temps = side_effect_free_reference(node.obj)
return ExprNodes.AttributeNode(node.pos, obj=obj, attribute=node.attribute), temps
+ elif isinstance(node, ExprNodes.BufferIndexNode):
+ raise ValueError("Don't allow things like attributes of buffer indexing operations")
else:
node = LetRefNode(node)
return node, [node]