@@ -144,11 +144,7 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
144144 } else if (MP_PARSE_NODE_IS_TOKEN_KIND (pns -> nodes [1 ], MP_TOKEN_OP_PERCENT )) {
145145 pn = mp_parse_node_new_leaf (MP_PARSE_NODE_SMALL_INT , python_modulo (arg0 , arg1 ));
146146 } else if (MP_PARSE_NODE_IS_TOKEN_KIND (pns -> nodes [1 ], MP_TOKEN_OP_DBL_SLASH )) {
147- //pn = mp_parse_node_new_leaf(MP_PARSE_NODE_SMALL_INT,
148- // floor((mp_float_t)arg0 / arg1));
149- pn = mp_parse_node_new_leaf (MP_PARSE_NODE_SMALL_INT ,
150- python_floor_divide (arg0 , arg1 ));
151-
147+ pn = mp_parse_node_new_leaf (MP_PARSE_NODE_SMALL_INT , python_floor_divide (arg0 , arg1 ));
152148 } else {
153149 // shouldn't happen
154150 assert (0 );
@@ -198,12 +194,24 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
198194}
199195
200196STATIC void compile_trailer_paren_helper (compiler_t * comp , mp_parse_node_t pn_arglist , bool is_method_call , int n_positional_extra );
201- void compile_node (compiler_t * comp , mp_parse_node_t pn );
197+ STATIC void compile_node (compiler_t * comp , mp_parse_node_t pn );
202198
203199STATIC int comp_next_label (compiler_t * comp ) {
204200 return comp -> next_label ++ ;
205201}
206202
203+ STATIC void compile_increase_except_level (compiler_t * comp ) {
204+ comp -> cur_except_level += 1 ;
205+ if (comp -> cur_except_level > comp -> scope_cur -> exc_stack_size ) {
206+ comp -> scope_cur -> exc_stack_size = comp -> cur_except_level ;
207+ }
208+ }
209+
210+ STATIC void compile_decrease_except_level (compiler_t * comp ) {
211+ assert (comp -> cur_except_level > 0 );
212+ comp -> cur_except_level -= 1 ;
213+ }
214+
207215STATIC scope_t * scope_new_and_link (compiler_t * comp , scope_kind_t kind , mp_parse_node_t pn , uint emit_options ) {
208216 scope_t * scope = scope_new (kind , pn , comp -> source_file , rt_get_unique_code_id (), emit_options );
209217 scope -> parent = comp -> scope_cur ;
@@ -1635,7 +1643,7 @@ void compile_try_except(compiler_t *comp, mp_parse_node_t pn_body, int n_except,
16351643 int success_label = comp_next_label (comp );
16361644
16371645 EMIT_ARG (setup_except , l1 );
1638- comp -> cur_except_level += 1 ;
1646+ compile_increase_except_level ( comp ) ;
16391647
16401648 compile_node (comp , pn_body ); // body
16411649 EMIT (pop_block );
@@ -1687,7 +1695,7 @@ void compile_try_except(compiler_t *comp, mp_parse_node_t pn_body, int n_except,
16871695 if (qstr_exception_local != 0 ) {
16881696 l3 = comp_next_label (comp );
16891697 EMIT_ARG (setup_finally , l3 );
1690- comp -> cur_except_level += 1 ;
1698+ compile_increase_except_level ( comp ) ;
16911699 }
16921700 compile_node (comp , pns_except -> nodes [1 ]);
16931701 if (qstr_exception_local != 0 ) {
@@ -1701,14 +1709,14 @@ void compile_try_except(compiler_t *comp, mp_parse_node_t pn_body, int n_except,
17011709 EMIT_ARG (store_id , qstr_exception_local );
17021710 EMIT_ARG (delete_id , qstr_exception_local );
17031711
1704- comp -> cur_except_level -= 1 ;
1712+ compile_decrease_except_level ( comp ) ;
17051713 EMIT (end_finally );
17061714 }
17071715 EMIT_ARG (jump , l2 );
17081716 EMIT_ARG (label_assign , end_finally_label );
17091717 }
17101718
1711- comp -> cur_except_level -= 1 ;
1719+ compile_decrease_except_level ( comp ) ;
17121720 EMIT (end_finally );
17131721
17141722 EMIT_ARG (label_assign , success_label );
@@ -1723,7 +1731,7 @@ void compile_try_finally(compiler_t *comp, mp_parse_node_t pn_body, int n_except
17231731 int l_finally_block = comp_next_label (comp );
17241732
17251733 EMIT_ARG (setup_finally , l_finally_block );
1726- comp -> cur_except_level += 1 ;
1734+ compile_increase_except_level ( comp ) ;
17271735
17281736 if (n_except == 0 ) {
17291737 assert (MP_PARSE_NODE_IS_NULL (pn_else ));
@@ -1736,7 +1744,7 @@ void compile_try_finally(compiler_t *comp, mp_parse_node_t pn_body, int n_except
17361744 EMIT_ARG (label_assign , l_finally_block );
17371745 compile_node (comp , pn_finally );
17381746
1739- comp -> cur_except_level -= 1 ;
1747+ compile_decrease_except_level ( comp ) ;
17401748 EMIT (end_finally );
17411749
17421750 EMIT_ARG (set_stack_size , stack_size );
@@ -2799,7 +2807,10 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
27992807 EMIT_ARG (start_pass , pass , scope );
28002808
28012809 if (comp -> pass == PASS_1 ) {
2810+ // reset maximum stack sizes in scope
2811+ // they will be computed in this first pass
28022812 scope -> stack_size = 0 ;
2813+ scope -> exc_stack_size = 0 ;
28032814 }
28042815
28052816#if MICROPY_EMIT_CPYTHON
@@ -2939,6 +2950,9 @@ void compile_scope(compiler_t *comp, scope_t *scope, pass_kind_t pass) {
29392950 }
29402951
29412952 EMIT (end_pass );
2953+
2954+ // make sure we match all the exception levels
2955+ assert (comp -> cur_except_level == 0 );
29422956}
29432957
29442958void compile_scope_inline_asm (compiler_t * comp , scope_t * scope , pass_kind_t pass ) {
0 commit comments