diff options
author | Stefan Behnel <stefan_ml@behnel.de> | 2015-09-04 13:27:58 +0200 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2015-09-04 13:27:58 +0200 |
commit | ab78f93b3ffa88183a0d2aae6b692e394c51f860 (patch) | |
tree | ceebd767385aad1878904c4ce0843ba78d6afb1d /Cython/Compiler/ParseTreeTransforms.py | |
parent | 7da496024a2ecb93a85de79756e4e89f2d289187 (diff) | |
download | cython-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.py | 21 |
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] |