Commit 7b3d38c8 authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Fix precedence rules of decorator options.

parent 40f52c12
...@@ -330,9 +330,6 @@ class ResolveOptions(CythonTransform): ...@@ -330,9 +330,6 @@ class ResolveOptions(CythonTransform):
return None return None
def visit_with_options(self, node, options): def visit_with_options(self, node, options):
if not options:
return self.visit_Node(node)
else:
oldoptions = self.options oldoptions = self.options
newoptions = copy.copy(oldoptions) newoptions = copy.copy(oldoptions)
newoptions.update(options) newoptions.update(options)
...@@ -343,7 +340,7 @@ class ResolveOptions(CythonTransform): ...@@ -343,7 +340,7 @@ class ResolveOptions(CythonTransform):
# Handle decorators # Handle decorators
def visit_DefNode(self, node): def visit_DefNode(self, node):
options = {} options = []
if node.decorators: if node.decorators:
# Split the decorators into two lists -- real decorators and options # Split the decorators into two lists -- real decorators and options
...@@ -351,13 +348,20 @@ class ResolveOptions(CythonTransform): ...@@ -351,13 +348,20 @@ class ResolveOptions(CythonTransform):
for dec in node.decorators: for dec in node.decorators:
option = self.try_to_parse_option(dec.decorator) option = self.try_to_parse_option(dec.decorator)
if option is not None: if option is not None:
name, value = option options.append(option)
options[name] = value
else: else:
realdecs.append(dec) realdecs.append(dec)
node.decorators = realdecs node.decorators = realdecs
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) return self.visit_with_options(node, options)
else:
return self.visit_Node(node)
# Handle with statements # Handle with statements
def visit_WithStatNode(self, node): def visit_WithStatNode(self, node):
......
...@@ -543,6 +543,7 @@ def safe_get(object[int] buf, int idx): ...@@ -543,6 +543,7 @@ def safe_get(object[int] buf, int idx):
@testcase @testcase
@cython.boundscheck(False) @cython.boundscheck(False)
@cython.boundscheck(True)
def unsafe_get(object[int] buf, int idx): def unsafe_get(object[int] buf, int idx):
""" """
Access outside of the area the buffer publishes. Access outside of the area the buffer publishes.
......
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