Commit 482d1ac8 authored by Haoyu Bai's avatar Haoyu Bai

fix locals directive in pxd files

parent 292c1eb0
...@@ -535,7 +535,7 @@ class CFuncDeclaratorNode(CDeclaratorNode): ...@@ -535,7 +535,7 @@ class CFuncDeclaratorNode(CDeclaratorNode):
overridable = 0 overridable = 0
optional_arg_count = 0 optional_arg_count = 0
def analyse(self, return_type, env, nonempty = 0): def analyse(self, return_type, env, nonempty = 0, directive_locals = {}):
if nonempty: if nonempty:
nonempty -= 1 nonempty -= 1
func_type_args = [] func_type_args = []
...@@ -543,6 +543,17 @@ class CFuncDeclaratorNode(CDeclaratorNode): ...@@ -543,6 +543,17 @@ class CFuncDeclaratorNode(CDeclaratorNode):
name_declarator, type = arg_node.analyse(env, nonempty = nonempty, name_declarator, type = arg_node.analyse(env, nonempty = nonempty,
is_self_arg = (i == 0 and env.is_c_class_scope)) is_self_arg = (i == 0 and env.is_c_class_scope))
name = name_declarator.name name = name_declarator.name
if name in directive_locals:
type_node = directive_locals[name]
other_type = type_node.analyse_as_type(env)
if other_type is None:
error(type_node.pos, "Not a type")
elif (type is not PyrexTypes.py_object_type
and not type.same_as(other_type)):
error(self.base.pos, "Signature does not agree with previous declaration")
error(type_node.pos, "Previous declaration here")
else:
type = other_type
if name_declarator.cname: if name_declarator.cname:
error(self.pos, error(self.pos,
"Function argument cannot have C name specification") "Function argument cannot have C name specification")
...@@ -946,7 +957,10 @@ class CVarDefNode(StatNode): ...@@ -946,7 +957,10 @@ class CVarDefNode(StatNode):
visibility = self.visibility visibility = self.visibility
for declarator in self.declarators: for declarator in self.declarators:
name_declarator, type = declarator.analyse(base_type, env) if isinstance(declarator, CFuncDeclaratorNode):
name_declarator, type = declarator.analyse(base_type, env, directive_locals=self.directive_locals)
else:
name_declarator, type = declarator.analyse(base_type, env)
if not type.is_complete(): if not type.is_complete():
if not (self.visibility == 'extern' and type.is_array): if not (self.visibility == 'extern' and type.is_array):
error(declarator.pos, error(declarator.pos,
......
cimport cython
@cython.locals(egg=double)
cdef foo(egg)
import cython
# @cython.locals(x=double)
# cdef func_defval(x=0):
# return x**2
def foo(egg):
if not cython.compiled:
egg = float(egg)
return egg
def test_pxd_locals():
"""
>>> isinstance(test_pxd_locals(), float)
True
"""
return foo(1)
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