py: Calculate maximum exception stack size in compiler.
diff --git a/py/compile.c b/py/compile.c
index f18c228..4d07f2e 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -144,11 +144,7 @@
                     } else if (MP_PARSE_NODE_IS_TOKEN_KIND(pns->nodes[1], MP_TOKEN_OP_PERCENT)) {
                         pn = mp_parse_node_new_leaf(MP_PARSE_NODE_SMALL_INT, python_modulo(arg0, arg1));
                     } else if (MP_PARSE_NODE_IS_TOKEN_KIND(pns->nodes[1], MP_TOKEN_OP_DBL_SLASH)) {
-                        //pn = mp_parse_node_new_leaf(MP_PARSE_NODE_SMALL_INT, 
-                          //                          floor((mp_float_t)arg0 / arg1));
-                        pn = mp_parse_node_new_leaf(MP_PARSE_NODE_SMALL_INT, 
-                                                    python_floor_divide(arg0, arg1));
-			
+                        pn = mp_parse_node_new_leaf(MP_PARSE_NODE_SMALL_INT, python_floor_divide(arg0, arg1));
                     } else {
                         // shouldn't happen
                         assert(0);
@@ -198,12 +194,24 @@
 }
 
 STATIC void compile_trailer_paren_helper(compiler_t *comp, mp_parse_node_t pn_arglist, bool is_method_call, int n_positional_extra);
-void compile_node(compiler_t *comp, mp_parse_node_t pn);
+STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn);
 
 STATIC int comp_next_label(compiler_t *comp) {
     return comp->next_label++;
 }
 
+STATIC void compile_increase_except_level(compiler_t *comp) {
+    comp->cur_except_level += 1;
+    if (comp->cur_except_level > comp->scope_cur->exc_stack_size) {
+        comp->scope_cur->exc_stack_size = comp->cur_except_level;
+    }
+}
+
+STATIC void compile_decrease_except_level(compiler_t *comp) {
+    assert(comp->cur_except_level > 0);
+    comp->cur_except_level -= 1;
+}
+
 STATIC scope_t *scope_new_and_link(compiler_t *comp, scope_kind_t kind, mp_parse_node_t pn, uint emit_options) {
     scope_t *scope = scope_new(kind, pn, comp->source_file, rt_get_unique_code_id(), emit_options);
     scope->parent = comp->scope_cur;
@@ -1635,7 +1643,7 @@
     int success_label = comp_next_label(comp);
 
     EMIT_ARG(setup_except, l1);
-    comp->cur_except_level += 1;
+    compile_increase_except_level(comp);
 
     compile_node(comp, pn_body); // body
     EMIT(pop_block);
@@ -1687,7 +1695,7 @@
         if (qstr_exception_local != 0) {
             l3 = comp_next_label(comp);
             EMIT_ARG(setup_finally, l3);
-            comp->cur_except_level += 1;
+            compile_increase_except_level(comp);
         }
         compile_node(comp, pns_except->nodes[1]);
         if (qstr_exception_local != 0) {
@@ -1701,14 +1709,14 @@
             EMIT_ARG(store_id, qstr_exception_local);
             EMIT_ARG(delete_id, qstr_exception_local);
 
-            comp->cur_except_level -= 1;
+            compile_decrease_except_level(comp);
             EMIT(end_finally);
         }
         EMIT_ARG(jump, l2);
         EMIT_ARG(label_assign, end_finally_label);
     }
 
-    comp->cur_except_level -= 1;
+    compile_decrease_except_level(comp);
     EMIT(end_finally);
 
     EMIT_ARG(label_assign, success_label);
@@ -1723,7 +1731,7 @@
     int l_finally_block = comp_next_label(comp);
 
     EMIT_ARG(setup_finally, l_finally_block);
-    comp->cur_except_level += 1;
+    compile_increase_except_level(comp);
 
     if (n_except == 0) {
         assert(MP_PARSE_NODE_IS_NULL(pn_else));
@@ -1736,7 +1744,7 @@
     EMIT_ARG(label_assign, l_finally_block);
     compile_node(comp, pn_finally);
 
-    comp->cur_except_level -= 1;
+    compile_decrease_except_level(comp);
     EMIT(end_finally);
 
     EMIT_ARG(set_stack_size, stack_size);
@@ -2799,7 +2807,10 @@
     EMIT_ARG(start_pass, pass, scope);
 
     if (comp->pass == PASS_1) {
+        // reset maximum stack sizes in scope
+        // they will be computed in this first pass
         scope->stack_size = 0;
+        scope->exc_stack_size = 0;
     }
 
 #if MICROPY_EMIT_CPYTHON
@@ -2939,6 +2950,9 @@
     }
 
     EMIT(end_pass);
+
+    // make sure we match all the exception levels
+    assert(comp->cur_except_level == 0);
 }
 
 void compile_scope_inline_asm(compiler_t *comp, scope_t *scope, pass_kind_t pass) {