From: Stefan Behnel Date: Wed, 3 Sep 2008 11:24:52 +0000 (+0200) Subject: fixed error detection on misplaced default except: clause X-Git-Tag: 0.9.9.2.beta~63^2~12^2~1 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=b970aadc0c52ae0485d56e9eb67c219c8f6d7f13;p=cython.git fixed error detection on misplaced default except: clause --- diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 2738fd66..94c852e3 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -3538,11 +3538,16 @@ class TryExceptStatNode(StatNode): self.gil_check(env) def analyse_expressions(self, env): - self.body.analyse_expressions(env) self.cleanup_list = env.free_temp_entries[:] + default_clause_seen = 0 for except_clause in self.except_clauses: except_clause.analyse_expressions(env) + if default_clause_seen: + error(except_clause.pos, "default 'except:' must be last") + if not except_clause.pattern: + default_clause_seen = 1 + self.has_default_clause = default_clause_seen if self.else_clause: self.else_clause.analyse_expressions(env) self.gil_check(env) @@ -3579,19 +3584,13 @@ class TryExceptStatNode(StatNode): code.put_goto(try_end_label) code.put_label(our_error_label) code.put_var_xdecrefs_clear(self.cleanup_list) - default_clause_seen = 0 for except_clause in self.except_clauses: - if not except_clause.pattern: - default_clause_seen = 1 - else: - if default_clause_seen: - error(except_clause.pos, "Default except clause not last") except_clause.generate_handling_code(code, except_end_label) - if not default_clause_seen: - code.put_goto(code.error_label) - if code.label_used(except_error_label): - code.put_label(except_error_label) + error_label_used = code.label_used(except_error_label) + if error_label_used or not self.has_default_clause: + if error_label_used: + code.put_label(except_error_label) for var in Naming.exc_save_vars: code.put_xdecref(var, py_object_type) code.put_goto(old_error_label) diff --git a/tests/errors/e_exceptclause.pyx b/tests/errors/e_exceptclause.pyx new file mode 100644 index 00000000..e6acf946 --- /dev/null +++ b/tests/errors/e_exceptclause.pyx @@ -0,0 +1,16 @@ + +try: + raise KeyError +except KeyError: + pass +except: + pass +except: + pass +except AttributeError: + pass + +_ERRORS = u""" + 8:0: default 'except:' must be last +10:0: default 'except:' must be last +"""