py: Combine continuous block of emit steps into with_cleanup emit call.

Because different emitters need to handle with-cleanup in different ways.
diff --git a/py/compile.c b/py/compile.c
index 9213fd2..aef59fb 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1640,10 +1640,7 @@
         // compile additional pre-bits and the body
         compile_with_stmt_helper(comp, n - 1, nodes + 1, body);
         // finish this with block
-        EMIT(pop_block);
-        EMIT_ARG(load_const_tok, MP_TOKEN_KW_NONE);
-        EMIT_ARG(label_assign, l_end);
-        EMIT(with_cleanup);
+        EMIT_ARG(with_cleanup, l_end);
         compile_decrease_except_level(comp);
         EMIT(end_finally);
     }
diff --git a/py/emit.h b/py/emit.h
index 7e8e033..9121e71 100644
--- a/py/emit.h
+++ b/py/emit.h
@@ -106,7 +106,7 @@
     void (*break_loop)(emit_t *emit, mp_uint_t label, mp_uint_t except_depth);
     void (*continue_loop)(emit_t *emit, mp_uint_t label, mp_uint_t except_depth);
     void (*setup_with)(emit_t *emit, mp_uint_t label);
-    void (*with_cleanup)(emit_t *emit);
+    void (*with_cleanup)(emit_t *emit, mp_uint_t label);
     void (*setup_except)(emit_t *emit, mp_uint_t label);
     void (*setup_finally)(emit_t *emit, mp_uint_t label);
     void (*end_finally)(emit_t *emit);
@@ -227,7 +227,7 @@
 #define mp_emit_bc_break_loop mp_emit_bc_unwind_jump
 #define mp_emit_bc_continue_loop mp_emit_bc_unwind_jump
 void mp_emit_bc_setup_with(emit_t *emit, mp_uint_t label);
-void mp_emit_bc_with_cleanup(emit_t *emit);
+void mp_emit_bc_with_cleanup(emit_t *emit, mp_uint_t label);
 void mp_emit_bc_setup_except(emit_t *emit, mp_uint_t label);
 void mp_emit_bc_setup_finally(emit_t *emit, mp_uint_t label);
 void mp_emit_bc_end_finally(emit_t *emit);
diff --git a/py/emitbc.c b/py/emitbc.c
index 14298ba..d871aa4 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -758,7 +758,10 @@
     emit_write_bytecode_byte_unsigned_label(emit, MP_BC_SETUP_WITH, label);
 }
 
-void mp_emit_bc_with_cleanup(emit_t *emit) {
+void mp_emit_bc_with_cleanup(emit_t *emit, mp_uint_t label) {
+    mp_emit_bc_pop_block(emit);
+    mp_emit_bc_load_const_tok(emit, MP_TOKEN_KW_NONE);
+    mp_emit_bc_label_assign(emit, label);
     emit_bc_pre(emit, -4);
     emit_write_bytecode_byte(emit, MP_BC_WITH_CLEANUP);
 }
diff --git a/py/emitnative.c b/py/emitnative.c
index fc9922c..04b465b 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -1990,7 +1990,7 @@
     assert(0);
 }
 
-STATIC void emit_native_with_cleanup(emit_t *emit) {
+STATIC void emit_native_with_cleanup(emit_t *emit, mp_uint_t label) {
     (void)emit;
     assert(0);
 }