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

Fix precedence rules of decorator options.

parent 40f52c12
......@@ -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)
......
......@@ -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.
......
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