From: Stefan Behnel Date: Wed, 28 Apr 2010 16:52:44 +0000 (+0200) Subject: merged in latest cython-devel X-Git-Tag: 0.13.beta0~2^2~85 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=6f95c7e38cc974a25fce3822ee82a2d5a9a4f440;p=cython.git merged in latest cython-devel --- 6f95c7e38cc974a25fce3822ee82a2d5a9a4f440 diff --cc Cython/Compiler/Nodes.py index 66cbcb5d,00ac4463..a0de3210 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@@ -4038,24 -3871,36 +4038,42 @@@ class IfStatNode(StatNode) if_clause.analyse_expressions(env) 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) - 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*/ {") + 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: 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)