Add support for freeing code emitter objects at the end of compilation.
diff --git a/py/compile.c b/py/compile.c
index 7e77832..e8a5197 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -3155,6 +3155,9 @@
     }
 
     bool had_error = comp->had_error;
+    if (comp->emit_method_table->free != NULL) {
+        comp->emit_method_table->free(comp->emit);
+    }
     m_del_obj(compiler_t, comp);
     uint unique_code_id = module_scope->unique_code_id;
     for (scope_t *s = module_scope; s;) {
diff --git a/py/emit.h b/py/emit.h
index 309d474..c4d3853 100644
--- a/py/emit.h
+++ b/py/emit.h
@@ -17,6 +17,8 @@
 typedef struct _emit_t emit_t;
 
 typedef struct _emit_method_table_t {
+    void (*free)(emit_t *emit);
+
     void (*set_native_types)(emit_t *emit, bool do_native_types);
     void (*start_pass)(emit_t *emit, pass_kind_t pass, scope_t *scope);
     void (*end_pass)(emit_t *emit);
diff --git a/py/emitbc.c b/py/emitbc.c
index c3385e0..d66202e 100644
--- a/py/emitbc.c
+++ b/py/emitbc.c
@@ -43,6 +43,11 @@
     return emit;
 }
 
+static void emit_bc_free(emit_t *emit) {
+    m_del(uint, emit->label_offsets, emit->max_num_labels);
+    m_del_obj(emit_t, emit);
+}
+
 // all functions must go through this one to emit code info
 static byte* emit_get_cur_to_write_code_info(emit_t* emit, int num_bytes_to_write) {
     //printf("emit %d\n", num_bytes_to_write);
@@ -751,6 +756,8 @@
 }
 
 const emit_method_table_t emit_bc_method_table = {
+    emit_bc_free,
+
     emit_bc_set_native_types,
     emit_bc_start_pass,
     emit_bc_end_pass,
diff --git a/py/emitcpy.c b/py/emitcpy.c
index de2a578..6984ebf 100644
--- a/py/emitcpy.c
+++ b/py/emitcpy.c
@@ -796,6 +796,8 @@
 }
 
 const emit_method_table_t emit_cpython_method_table = {
+    NULL,
+
     emit_cpy_set_native_types,
     emit_cpy_start_pass,
     emit_cpy_end_pass,
diff --git a/py/emitnative.c b/py/emitnative.c
index 6fc1742..ddda906 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -146,6 +146,15 @@
     return emit;
 }
 
+static void emit_native_free(emit_t *emit) {
+#if N_X64
+    asm_x64_free(emit->as, false);
+#elif N_THUMB
+    asm_thumb_free(emit->as, false);
+#endif
+    m_del_obj(emit_t, emit);
+}
+
 static void emit_native_set_viper_types(emit_t *emit, bool do_viper_types) {
     emit->do_viper_types = do_viper_types;
 }
@@ -1226,6 +1235,8 @@
 }
 
 const emit_method_table_t EXPORT_FUN(method_table) = {
+    emit_native_free,
+
     emit_native_set_viper_types,
     emit_native_start_pass,
     emit_native_end_pass,
diff --git a/py/emitpass1.c b/py/emitpass1.c
index 38115a5..6a26cd1 100644
--- a/py/emitpass1.c
+++ b/py/emitpass1.c
@@ -97,6 +97,8 @@
 }
 
 const emit_method_table_t emit_pass1_method_table = {
+    emit_pass1_free,
+
     (void*)emit_pass1_dummy,
     emit_pass1_start_pass,
     emit_pass1_end_pass,