From 7b3d38c80042d1378dca43161f39e95c5eb45bde Mon Sep 17 00:00:00 2001 From: Dag Sverre Seljebotn Date: Tue, 5 Aug 2008 14:38:44 +0200 Subject: [PATCH] Fix precedence rules of decorator options. --- Cython/Compiler/ParseTreeTransforms.py | 32 +++++++++++++++----------- tests/run/bufaccess.pyx | 1 + 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Cython/Compiler/ParseTreeTransforms.py b/Cython/Compiler/ParseTreeTransforms.py index 6979ee36..983c2b99 100644 --- a/Cython/Compiler/ParseTreeTransforms.py +++ b/Cython/Compiler/ParseTreeTransforms.py @@ -330,20 +330,17 @@ class ResolveOptions(CythonTransform): return None def visit_with_options(self, node, options): - if not options: - return self.visit_Node(node) - else: - oldoptions = self.options - newoptions = copy.copy(oldoptions) - newoptions.update(options) - self.options = newoptions - node = self.visit_Node(node) - self.options = oldoptions + oldoptions = self.options + newoptions = copy.copy(oldoptions) + newoptions.update(options) + self.options = newoptions + node = self.visit_Node(node) + self.options = oldoptions return node # Handle decorators def visit_DefNode(self, node): - options = {} + options = [] if node.decorators: # Split the decorators into two lists -- real decorators and options @@ -351,14 +348,21 @@ class ResolveOptions(CythonTransform): for dec in node.decorators: option = self.try_to_parse_option(dec.decorator) if option is not None: - name, value = option - options[name] = value + options.append(option) else: realdecs.append(dec) node.decorators = realdecs - return self.visit_with_options(node, options) - + if options: + optdict = {} + options.reverse() # Decorators coming first take precedence + for option in options: + name, value = option + optdict[name] = value + return self.visit_with_options(node, options) + else: + return self.visit_Node(node) + # Handle with statements def visit_WithStatNode(self, node): option = self.try_to_parse_option(node.manager) diff --git a/tests/run/bufaccess.pyx b/tests/run/bufaccess.pyx index c5b4c2a8..e5b6b4f5 100644 --- a/tests/run/bufaccess.pyx +++ b/tests/run/bufaccess.pyx @@ -543,6 +543,7 @@ def safe_get(object[int] buf, int idx): @testcase @cython.boundscheck(False) +@cython.boundscheck(True) def unsafe_get(object[int] buf, int idx): """ Access outside of the area the buffer publishes. -- 2.26.2