From 1ae591fa829139776dc9b661879ada23fbd82b0e Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Tue, 7 Oct 2008 20:36:03 -0700 Subject: [PATCH] call struct constructor --- Cython/Compiler/ExprNodes.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index ff1494fb..be4389ee 100644 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -1862,6 +1862,21 @@ class CallNode(ExprNode): # Make sure we're not in a nogil environment if env.nogil: error(self.pos, "Calling gil-requiring function without gil") + + def analyse_as_type_constructor(self, env): + type = self.function.analyse_as_type(env) + if type and type.is_struct_or_union: + args, kwds = self.explicit_args_kwds() + items = [] + for arg, member in zip(args, type.scope.var_entries): + items.append(DictItemNode(pos=arg.pos, key=NameNode(pos=arg.pos, name=member.name), value=arg)) + if kwds: + items += kwds.key_value_pairs + self.key_value_pairs = items + self.__class__ = DictNode + self.analyse_types(env) + self.coerce_to(type, env) + return True class SimpleCallNode(CallNode): @@ -1907,6 +1922,8 @@ class SimpleCallNode(CallNode): return self.args, None def analyse_types(self, env): + if self.analyse_as_type_constructor(env): + return function = self.function function.is_called = 1 self.function.analyse_types(env) @@ -2142,6 +2159,8 @@ class GeneralCallNode(CallNode): return self.positional_args.args, self.keyword_args def analyse_types(self, env): + if self.analyse_as_type_constructor(env): + return self.function.analyse_types(env) self.positional_args.analyse_types(env) if self.keyword_args: -- 2.26.2