if self.else_clause:
self.else_clause.analyse_expressions(env)
- # eliminate dead code based on constant condition results
- if_clauses = []
- condition_result = None
- for if_clause in self.if_clauses:
- condition_result = if_clause.get_constant_condition_result()
- if condition_result != False:
- if_clauses.append(if_clause)
- if condition_result == True:
- # other conditions can no longer apply
- self.else_clause = None
- break
- self.if_clauses = if_clauses
- # FIXME: if only one active code body is left here, we can
- # replace the whole node
-
def generate_execution_code(self, code):
code.mark_pos(self.pos)
- if self.if_clauses:
- end_label = code.new_label()
- for if_clause in self.if_clauses:
- if_clause.generate_execution_code(code, end_label)
- if self.else_clause:
- code.putln("/*else*/ {")
- self.else_clause.generate_execution_code(code)
- code.putln("}")
- code.put_label(end_label)
- elif self.else_clause:
+ end_label = code.new_label()
+ for if_clause in self.if_clauses:
+ if_clause.generate_execution_code(code, end_label)
+ if self.else_clause:
+ code.putln("/*else*/ {")
self.else_clause.generate_execution_code(code)
+ code.putln("}")
+ code.put_label(end_label)
+ def generate_function_definitions(self, env, code):
+ for clause in self.if_clauses:
+ clause.generate_function_definitions(env, code)
+ if self.else_clause is not None:
+ self.else_clause.generate_function_definitions(env, code)
+
def annotate(self, code):
for if_clause in self.if_clauses:
if_clause.annotate(code)
pos = s.position()
s.next()
name = EncodedString( p_ident(s) )
- #args = []
s.expect('(');
- args = p_c_arg_list(s, in_pyfunc = 1, nonempty_declarators = 1)
+ args, star_arg, starstar_arg = p_varargslist(s, terminator=')')
+ s.expect(')')
+ if p_nogil(s):
- error(s.pos, "Python function cannot be declared nogil")
++ error(pos, "Python function cannot be declared nogil")
+ return_type_annotation = None
+ if s.sy == '->':
+ s.next()
+ return_type_annotation = p_simple_expr(s)
+ doc, body = p_suite(s, Ctx(level = 'function'), with_doc = 1)
+ return Nodes.DefNode(pos, name = name, args = args,
+ star_arg = star_arg, starstar_arg = starstar_arg,
+ doc = doc, body = body, decorators = decorators,
+ return_type_annotation = return_type_annotation)
+
+def p_varargslist(s, terminator=')', annotated=1):
+ args = p_c_arg_list(s, in_pyfunc = 1, nonempty_declarators = 1,
+ annotated = annotated)
star_arg = None
starstar_arg = None
if s.sy == '*':