self.args = declarator.args
for formal_arg, type_arg in zip(self.args, type.args):
formal_arg.type = type_arg.type
+ formal_arg.name = type_arg.name
formal_arg.cname = type_arg.cname
name = name_declarator.name
cname = name_declarator.cname
self.num_required_kw_args = rk
self.num_required_args = r
- def as_cfunction(self, cfunc):
+ def as_cfunction(self, cfunc=None, scope=None):
if self.star_arg:
error(self.star_arg.pos, "cdef function cannot have star argument")
if self.starstar_arg:
error(self.starstar_arg.pos, "cdef function cannot have starstar argument")
- if len(self.args) != len(cfunc.type.args) or cfunc.type.has_varargs:
- error(self.pos, "wrong number of arguments")
- error(declarator.pos, "previous declaration here")
- for formal_arg, type_arg in zip(self.args, cfunc.type.args):
- name_declarator, type = formal_arg.analyse(cfunc.scope, nonempty=1)
- if type is PyrexTypes.py_object_type or formal_arg.is_self:
- formal_arg.type = type_arg.type
- formal_arg.name_declarator = name_declarator
+ if cfunc is None:
+ cfunc_args = []
+ for formal_arg in self.args:
+ name_declarator, type = formal_arg.analyse(scope, nonempty=1)
+ cfunc_args.append(PyrexTypes.CFuncTypeArg(name = name_declarator.name,
+ cname = None,
+ type = py_object_type,
+ pos = formal_arg.pos))
+ cfunc_type = PyrexTypes.CFuncType(return_type = py_object_type,
+ args = cfunc_args,
+ has_varargs = False,
+ exception_value = None,
+ exception_check = False,
+ nogil = False,
+ with_gil = False,
+ is_overridable = True)
+ cfunc = CVarDefNode(self.pos, type=cfunc_type, pxd_locals=[])
+ else:
+ cfunc_type = cfunc.type
+ if len(self.args) != len(cfunc_type.args) or cfunc_type.has_varargs:
+ error(self.pos, "wrong number of arguments")
+ error(declarator.pos, "previous declaration here")
+ for formal_arg, type_arg in zip(self.args, cfunc_type.args):
+ name_declarator, type = formal_arg.analyse(cfunc.scope, nonempty=1)
+ if type is None or type is PyrexTypes.py_object_type or formal_arg.is_self:
+ formal_arg.type = type_arg.type
+ formal_arg.name_declarator = name_declarator
import ExprNodes
- if cfunc.type.exception_value is None:
+ if cfunc_type.exception_value is None:
exception_value = None
else:
- exception_value = ExprNodes.ConstNode(self.pos, value=cfunc.type.exception_value, type=cfunc.type.return_type)
+ exception_value = ExprNodes.ConstNode(self.pos, value=cfunc_type.exception_value, type=cfunc_type.return_type)
declarator = CFuncDeclaratorNode(self.pos,
base = CNameDeclaratorNode(self.pos, name=self.name, cname=None),
args = self.args,
has_varargs = False,
- exception_check = cfunc.type.exception_check,
+ exception_check = cfunc_type.exception_check,
exception_value = exception_value,
- with_gil = cfunc.type.with_gil,
- nogil = cfunc.type.nogil)
+ with_gil = cfunc_type.with_gil,
+ nogil = cfunc_type.nogil)
return CFuncDefNode(self.pos,
modifiers = [],
- base_type = CAnalysedBaseTypeNode(self.pos, type=cfunc.type.return_type),
+ base_type = CAnalysedBaseTypeNode(self.pos, type=cfunc_type.return_type),
declarator = declarator,
body = self.body,
doc = self.doc,
- overridable = cfunc.type.is_overridable,
- type = cfunc.type,
- with_gil = cfunc.type.with_gil,
- nogil = cfunc.type.nogil,
+ overridable = cfunc_type.is_overridable,
+ type = cfunc_type,
+ with_gil = cfunc_type.with_gil,
+ nogil = cfunc_type.nogil,
visibility = 'private',
api = False,
pxd_locals = cfunc.pxd_locals)
directive_locals = {}
self.directive_locals = directive_locals
for arg in self.args:
- base_type = arg.base_type.analyse(env)
- name_declarator, type = \
- arg.declarator.analyse(base_type, env)
- arg.name = name_declarator.name
+ if hasattr(arg, 'name'):
+ type = arg.type
+ name_declarator = None
+ else:
+ base_type = arg.base_type.analyse(env)
+ name_declarator, type = \
+ arg.declarator.analyse(base_type, env)
+ arg.name = name_declarator.name
if arg.name in directive_locals:
type_node = directive_locals[arg.name]
other_type = type_node.analyse_as_type(env)
error(type_node.pos, "Previous declaration here")
else:
type = other_type
- if name_declarator.cname:
+ if name_declarator and name_declarator.cname:
error(self.pos,
"Python function argument cannot have C name specification")
arg.type = type.as_argument_type()