Merge pull request #5260 from BrzVlad/fix-handler-block
[mono.git] / mono / metadata / sre-save.c
index ff2f93a767be1a8ef630b34a058a2fa076a48db5..5d26024218b6b989b631d52daecf5db42bb53530 100644 (file)
@@ -1,5 +1,6 @@
-/*
- * sre-save.c: Routine for saving an image to a file.
+/**
+ * \file
+ * Routine for saving an image to a file.
  *   
  * 
  * Author:
 #include "mono/metadata/security-manager.h"
 #include "mono/metadata/tabledefs.h"
 #include "mono/metadata/tokentype.h"
+#include "mono/metadata/w32file.h"
+#include "mono/metadata/w32error.h"
 
 #include "mono/utils/checked-build.h"
 #include "mono/utils/mono-digest.h"
 #include "mono/utils/mono-error-internals.h"
+#include "mono/utils/w32api.h"
 
 #define TEXT_OFFSET 512
 #define CLI_H_SIZE 136
@@ -173,6 +177,17 @@ add_mono_string_to_blob_cached (MonoDynamicImage *assembly, MonoString *str)
        return idx;
 }
 
+static guint32
+image_create_token_raw  (MonoDynamicImage *assembly, MonoObject* obj_raw, gboolean create_methodspec, gboolean register_token, MonoError *error)
+{
+       HANDLE_FUNCTION_ENTER (); /* FIXME callers of image_create_token_raw should use handles */
+       error_init (error);
+       MONO_HANDLE_DCL (MonoObject, obj);
+       guint32 result = mono_image_create_token (assembly, obj, create_methodspec, register_token, error);
+       HANDLE_FUNCTION_RETURN_VAL (result);
+}
+
+
 /*
  * idx is the table index of the object
  * type is one of MONO_CUSTOM_ATTR_*
@@ -189,7 +204,7 @@ mono_image_add_cattrs (MonoDynamicImage *assembly, guint32 idx, guint32 type, Mo
        char blob_size [6];
        char *p = blob_size;
        
-       mono_error_init (error);
+       error_init (error);
 
        /* it is legal to pass a NULL cattrs: we avoid to use the if in a lot of places */
        if (!cattrs)
@@ -204,8 +219,18 @@ mono_image_add_cattrs (MonoDynamicImage *assembly, guint32 idx, guint32 type, Mo
        for (i = 0; i < count; ++i) {
                cattr = (MonoReflectionCustomAttr*)mono_array_get (cattrs, gpointer, i);
                values [MONO_CUSTOM_ATTR_PARENT] = idx;
-               token = mono_image_create_token (assembly, (MonoObject*)cattr->ctor, FALSE, FALSE, error);
-               if (!mono_error_ok (error)) goto fail;
+               g_assert (cattr->ctor != NULL);
+               if (mono_is_sre_ctor_builder (mono_object_class (cattr->ctor))) {
+                       MonoReflectionCtorBuilder *ctor = (MonoReflectionCtorBuilder*)cattr->ctor;
+                       MonoMethod *method = ctor->mhandle;
+                       if (method->klass->image == &assembly->image)
+                               token = MONO_TOKEN_METHOD_DEF | ((MonoReflectionCtorBuilder*)cattr->ctor)->table_idx;
+                       else
+                               token = mono_image_get_methodref_token (assembly, method, FALSE);
+               } else {
+                       token = image_create_token_raw (assembly, (MonoObject*)cattr->ctor, FALSE, FALSE, error); /* FIXME use handles */
+                       if (!mono_error_ok (error)) goto fail;
+               }
                type = mono_metadata_token_index (token);
                type <<= MONO_CUSTOM_ATTR_TYPE_BITS;
                switch (mono_metadata_token_table (token)) {
@@ -315,7 +340,7 @@ method_encode_code (MonoDynamicImage *assembly, ReflectionMethodBuilder *mb, Mon
        guint32 header_size = 12;
        MonoArray *code;
 
-       mono_error_init (error);
+       error_init (error);
 
        if ((mb->attrs & (METHOD_ATTRIBUTE_PINVOKE_IMPL | METHOD_ATTRIBUTE_ABSTRACT)) ||
                        (mb->iattrs & (METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL | METHOD_IMPL_ATTRIBUTE_RUNTIME)))
@@ -477,7 +502,7 @@ mono_image_basic_method (ReflectionMethodBuilder *mb, MonoDynamicImage *assembly
        guint32 *values;
        guint i, count;
 
-       mono_error_init (error);
+       error_init (error);
 
        /* room in this table is already allocated */
        table = &assembly->tables [MONO_TABLE_METHOD];
@@ -565,7 +590,7 @@ mono_image_add_methodimpl (MonoDynamicImage *assembly, MonoReflectionMethodBuild
        MonoReflectionMethod *m;
        int i;
 
-       mono_error_init (error);
+       error_init (error);
 
        if (!mb->override_methods)
                return TRUE;
@@ -580,7 +605,7 @@ mono_image_add_methodimpl (MonoDynamicImage *assembly, MonoReflectionMethodBuild
                values [MONO_METHODIMPL_CLASS] = tb->table_idx;
                values [MONO_METHODIMPL_BODY] = MONO_METHODDEFORREF_METHODDEF | (mb->table_idx << MONO_METHODDEFORREF_BITS);
 
-               tok = mono_image_create_token (assembly, (MonoObject*)m, FALSE, FALSE, error);
+               tok = image_create_token_raw (assembly, (MonoObject*)m, FALSE, FALSE, error); /* FIXME use handles */
                return_val_if_nok (error, FALSE);
 
                switch (mono_metadata_token_table (tok)) {
@@ -610,7 +635,7 @@ mono_image_get_method_info (MonoReflectionMethodBuilder *mb, MonoDynamicImage *a
        ReflectionMethodBuilder rmb;
        int i;
 
-       mono_error_init (error);
+       error_init (error);
 
        if (!mono_reflection_methodbuilder_from_method_builder (&rmb, mb, error) ||
            !mono_image_basic_method (&rmb, assembly, error))
@@ -687,7 +712,7 @@ mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *ass
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       mono_error_init (error);
+       error_init (error);
 
        MonoDynamicTable *table;
        guint32 *values;
@@ -705,7 +730,6 @@ mono_image_get_field_info (MonoReflectionFieldBuilder *fb, MonoDynamicImage *ass
        values [MONO_FIELD_SIGNATURE] = mono_dynimage_encode_field_signature (assembly, fb, error);
        return_if_nok (error);
 
-
        if (fb->offset != -1) {
                table = &assembly->tables [MONO_TABLE_FIELDLAYOUT];
                table->rows ++;
@@ -759,7 +783,7 @@ mono_image_get_property_info (MonoReflectionPropertyBuilder *pb, MonoDynamicImag
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       mono_error_init (error);
+       error_init (error);
 
        MonoDynamicTable *table;
        guint32 *values;
@@ -885,7 +909,7 @@ encode_constraints (MonoReflectionGenericParam *gparam, guint32 owner, MonoDynam
 {
        MONO_REQ_GC_UNSAFE_MODE;
 
-       mono_error_init (error);
+       error_init (error);
 
        MonoDynamicTable *table;
        guint32 num_constraints, i;
@@ -958,7 +982,7 @@ write_generic_param_entry (MonoDynamicImage *assembly, GenericParamTableEntry *e
        guint32 *values;
        guint32 table_idx;
 
-       mono_error_init (error);
+       error_init (error);
 
        table = &assembly->tables [MONO_TABLE_GENERICPARAM];
        table_idx = table->next_idx ++;
@@ -1015,7 +1039,7 @@ static gboolean
 params_add_cattrs (MonoDynamicImage *assembly, MonoArray *pinfo, MonoError *error) {
        int i;
 
-       mono_error_init (error);
+       error_init (error);
        if (!pinfo)
                return TRUE;
        for (i = 0; i < mono_array_length (pinfo); ++i) {
@@ -1034,7 +1058,7 @@ static gboolean
 type_add_cattrs (MonoDynamicImage *assembly, MonoReflectionTypeBuilder *tb, MonoError *error) {
        int i;
 
-       mono_error_init (error);
+       error_init (error);
        
        if (!mono_image_add_cattrs (assembly, tb->table_idx, MONO_CUSTOM_ATTR_TYPEDEF, tb->cattrs, error))
                return FALSE;
@@ -1097,7 +1121,7 @@ module_add_cattrs (MonoDynamicImage *assembly, MonoReflectionModuleBuilder *modu
 {
        int i;
        
-       mono_error_init (error);
+       error_init (error);
 
        if (!mono_image_add_cattrs (assembly, moduleb->table_idx, MONO_CUSTOM_ATTR_MODULE, moduleb->cattrs, error))
                return FALSE;
@@ -1139,7 +1163,7 @@ mono_image_fill_file_table (MonoDomain *domain, MonoReflectionModule *module, Mo
        char *b = blob_size;
        char *dir, *path;
 
-       mono_error_init (error);
+       error_init (error);
 
        table = &assembly->tables [MONO_TABLE_FILE];
        table->rows++;
@@ -1172,7 +1196,7 @@ mono_image_fill_module_table (MonoDomain *domain, MonoReflectionModuleBuilder *m
        MonoDynamicTable *table;
        int i;
 
-       mono_error_init (error);
+       error_init (error);
 
        table = &assembly->tables [MONO_TABLE_MODULE];
        mb->table_idx = table->next_idx ++;
@@ -1195,7 +1219,7 @@ mono_image_fill_export_table_from_class (MonoDomain *domain, MonoClass *klass,
        guint32 *values;
        guint32 visib, res;
 
-       visib = klass->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK;
+       visib = mono_class_get_flags (klass) & TYPE_ATTRIBUTE_VISIBILITY_MASK;
        if (! ((visib & TYPE_ATTRIBUTE_PUBLIC) || (visib & TYPE_ATTRIBUTE_NESTED_PUBLIC)))
                return 0;
 
@@ -1204,7 +1228,7 @@ mono_image_fill_export_table_from_class (MonoDomain *domain, MonoClass *klass,
        alloc_table (table, table->rows);
        values = table->values + table->next_idx * MONO_EXP_TYPE_SIZE;
 
-       values [MONO_EXP_TYPE_FLAGS] = klass->flags;
+       values [MONO_EXP_TYPE_FLAGS] = mono_class_get_flags (klass);
        values [MONO_EXP_TYPE_TYPEDEF] = klass->type_token;
        if (klass->nested_in)
                values [MONO_EXP_TYPE_IMPLEMENTATION] = (parent_index << MONO_IMPLEMENTATION_BITS) + MONO_IMPLEMENTATION_EXP_TYPE;
@@ -1218,12 +1242,10 @@ mono_image_fill_export_table_from_class (MonoDomain *domain, MonoClass *klass,
        table->next_idx ++;
 
        /* Emit nested types */
-       if (klass->ext && klass->ext->nested_classes) {
-               GList *tmp;
-
-               for (tmp = klass->ext->nested_classes; tmp; tmp = tmp->next)
-                       mono_image_fill_export_table_from_class (domain, (MonoClass *)tmp->data, module_index, table->next_idx - 1, assembly);
-       }
+       GList *nested_classes = mono_class_get_nested_classes_property (klass);
+       GList *tmp;
+       for (tmp = nested_classes; tmp; tmp = tmp->next)
+               mono_image_fill_export_table_from_class (domain, (MonoClass *)tmp->data, module_index, table->next_idx - 1, assembly);
 
        return res;
 }
@@ -1236,7 +1258,7 @@ mono_image_fill_export_table (MonoDomain *domain, MonoReflectionTypeBuilder *tb,
        MonoClass *klass;
        guint32 idx, i;
 
-       mono_error_init (error);
+       error_init (error);
 
        MonoType *t = mono_reflection_type_get_handle ((MonoReflectionType*)tb, error);
        return_if_nok (error);
@@ -1275,7 +1297,7 @@ mono_image_fill_export_table_from_module (MonoDomain *domain, MonoReflectionModu
                MonoClass *klass = mono_class_get_checked (image, mono_metadata_make_token (MONO_TABLE_TYPEDEF, i + 1), &error);
                g_assert (mono_error_ok (&error)); /* FIXME don't swallow the error */
 
-               if (klass->flags & TYPE_ATTRIBUTE_PUBLIC)
+               if (mono_class_is_public (klass))
                        mono_image_fill_export_table_from_class (domain, klass, module_index, 0, assembly);
        }
 }
@@ -1468,7 +1490,7 @@ build_compressed_metadata (MonoDynamicImage *assembly, MonoError *error)
        unsigned char *p;
        struct StreamDesc stream_desc [5];
 
-       mono_error_init (error);
+       error_init (error);
 
        qsort (assembly->gen_params->pdata, assembly->gen_params->len, sizeof (gpointer), compare_genericparam);
        for (i = 0; i < assembly->gen_params->len; i++) {
@@ -1691,9 +1713,6 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
 {
        guint32 code_idx = GPOINTER_TO_UINT (value);
        MonoReflectionILTokenInfo *iltoken;
-       MonoReflectionFieldBuilder *field;
-       MonoReflectionCtorBuilder *ctor;
-       MonoReflectionMethodBuilder *method;
        MonoReflectionTypeBuilder *tb;
        MonoReflectionArrayMethod *am;
        guint32 i, idx = 0;
@@ -1705,8 +1724,7 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
                switch (target [3]) {
                case MONO_TABLE_FIELD:
                        if (!strcmp (iltoken->member->vtable->klass->name, "FieldBuilder")) {
-                               field = (MonoReflectionFieldBuilder *)iltoken->member;
-                               idx = field->table_idx;
+                               g_assert_not_reached ();
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MonoField")) {
                                MonoClassField *f = ((MonoReflectionField*)iltoken->member)->field;
                                idx = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->field_to_table_idx, f));
@@ -1716,11 +1734,9 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
                        break;
                case MONO_TABLE_METHOD:
                        if (!strcmp (iltoken->member->vtable->klass->name, "MethodBuilder")) {
-                               method = (MonoReflectionMethodBuilder *)iltoken->member;
-                               idx = method->table_idx;
+                               g_assert_not_reached ();
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "ConstructorBuilder")) {
-                               ctor = (MonoReflectionCtorBuilder *)iltoken->member;
-                               idx = ctor->table_idx;
+                               g_assert_not_reached ();
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod") || 
                                           !strcmp (iltoken->member->vtable->klass->name, "MonoCMethod")) {
                                MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
@@ -1730,47 +1746,75 @@ fixup_method (MonoReflectionILGen *ilgen, gpointer value, MonoDynamicImage *asse
                        }
                        break;
                case MONO_TABLE_TYPEDEF:
-                       if (strcmp (iltoken->member->vtable->klass->name, "TypeBuilder"))
+                       if (!strcmp (iltoken->member->vtable->klass->name, "TypeBuilder")) {
+                               g_assert_not_reached ();
+                       } else if (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType")) {
+                               MonoClass *k = mono_class_from_mono_type (((MonoReflectionType*)iltoken->member)->type);
+                               MonoObject *obj = mono_class_get_ref_info_raw (k); /* FIXME use handles */
+                               g_assert (obj);
+                               g_assert (!strcmp (mono_object_class (obj)->name, "TypeBuilder"));
+                               tb = (MonoReflectionTypeBuilder*)obj;
+                               idx = tb->table_idx;
+                       } else {
                                g_assert_not_reached ();
-                       tb = (MonoReflectionTypeBuilder *)iltoken->member;
-                       idx = tb->table_idx;
+                       }
                        break;
+               case MONO_TABLE_TYPEREF:
+                       g_assert (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType"));
+                       MonoClass *k = mono_class_from_mono_type (((MonoReflectionType*)iltoken->member)->type);
+                       MonoObject *obj = mono_class_get_ref_info_raw (k); /* FIXME use handles */
+                       g_assert (obj);
+                       g_assert (!strcmp (mono_object_class (obj)->name, "TypeBuilder"));
+                       g_assert (((MonoReflectionTypeBuilder*)obj)->module->dynamic_image != assembly);
+                       continue;
                case MONO_TABLE_MEMBERREF:
                        if (!strcmp (iltoken->member->vtable->klass->name, "MonoArrayMethod")) {
                                am = (MonoReflectionArrayMethod*)iltoken->member;
                                idx = am->table_idx;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod") ||
-                                  !strcmp (iltoken->member->vtable->klass->name, "MonoCMethod") ||
-                                  !strcmp (iltoken->member->vtable->klass->name, "MonoGenericMethod") ||
-                                  !strcmp (iltoken->member->vtable->klass->name, "MonoGenericCMethod")) {
+                                          !strcmp (iltoken->member->vtable->klass->name, "MonoCMethod")) {
                                MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
-                               g_assert (m->klass->generic_class || m->klass->generic_container);
+                               g_assert (mono_class_is_ginst (m->klass) || mono_class_is_gtd (m->klass));
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "FieldBuilder")) {
+                               g_assert_not_reached ();
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MonoField")) {
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MethodBuilder") ||
                                        !strcmp (iltoken->member->vtable->klass->name, "ConstructorBuilder")) {
+                               g_assert_not_reached ();
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "FieldOnTypeBuilderInst")) {
+                               g_assert_not_reached ();
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MethodOnTypeBuilderInst")) {
+                               g_assert_not_reached ();
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "ConstructorOnTypeBuilderInst")) {
+                               g_assert_not_reached ();
                                continue;
                        } else {
                                g_assert_not_reached ();
                        }
                        break;
                case MONO_TABLE_METHODSPEC:
-                       if (!strcmp (iltoken->member->vtable->klass->name, "MonoGenericMethod")) {
+                       if (!strcmp (iltoken->member->vtable->klass->name, "MonoMethod")) {
                                MonoMethod *m = ((MonoReflectionMethod*)iltoken->member)->method;
                                g_assert (mono_method_signature (m)->generic_param_count);
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MethodBuilder")) {
+                               g_assert_not_reached ();
                                continue;
                        } else if (!strcmp (iltoken->member->vtable->klass->name, "MethodOnTypeBuilderInst")) {
+                               g_assert_not_reached ();
+                               continue;
+                       } else {
+                               g_assert_not_reached ();
+                       }
+                       break;
+               case MONO_TABLE_TYPESPEC:
+                       if (!strcmp (iltoken->member->vtable->klass->name, "RuntimeType")) {
                                continue;
                        } else {
                                g_assert_not_reached ();
@@ -1830,7 +1874,7 @@ assembly_add_resource_manifest (MonoReflectionModuleBuilder *mb, MonoDynamicImag
        MonoDynamicTable *table;
        guint32 *values;
 
-       mono_error_init (error);
+       error_init (error);
 
        table = &assembly->tables [MONO_TABLE_MANIFESTRESOURCE];
        table->rows++;
@@ -1856,7 +1900,7 @@ assembly_add_resource (MonoReflectionModuleBuilder *mb, MonoDynamicImage *assemb
        char *name, *sname;
        guint32 idx, offset;
 
-       mono_error_init (error);
+       error_init (error);
 
        if (rsrc->filename) {
                name = mono_string_to_utf8_checked (rsrc->filename, error);
@@ -1916,7 +1960,7 @@ set_version_from_string (MonoString *version, guint32 *values, MonoError *error)
        gchar *ver, *p, *str;
        guint32 i;
        
-       mono_error_init (error);
+       error_init (error);
 
        values [MONO_ASSEMBLY_MAJOR_VERSION] = 0;
        values [MONO_ASSEMBLY_MINOR_VERSION] = 0;
@@ -1990,7 +2034,7 @@ mono_image_emit_manifest (MonoReflectionModuleBuilder *moduleb, MonoError *error
        int i;
        guint32 module_index;
 
-       mono_error_init (error);
+       error_init (error);
 
        assemblyb = moduleb->assemblyb;
        assembly = moduleb->dynamic_image;
@@ -2082,7 +2126,7 @@ mono_image_get_type_info (MonoDomain *domain, MonoReflectionTypeBuilder *tb, Mon
        int i, is_object = 0, is_system = 0;
        char *n;
 
-       mono_error_init (error);
+       error_init (error);
 
        table = &assembly->tables [MONO_TABLE_TYPEDEF];
        values = table->values + tb->table_idx * MONO_TYPEDEF_SIZE;
@@ -2273,7 +2317,7 @@ mono_image_build_metadata (MonoReflectionModuleBuilder *moduleb, MonoError *erro
        guint32 *values;
        int i, j;
 
-       mono_error_init (error);
+       error_init (error);
 
        assemblyb = moduleb->assemblyb;
        assembly = moduleb->dynamic_image;
@@ -2713,8 +2757,8 @@ static void
 checked_write_file (HANDLE f, gconstpointer buffer, guint32 numbytes)
 {
        guint32 dummy;
-       if (!WriteFile (f, buffer, numbytes, &dummy, NULL))
-               g_error ("WriteFile returned %d\n", GetLastError ());
+       if (!mono_w32file_write (f, buffer, numbytes, &dummy))
+               g_error ("mono_w32file_write returned %d\n", mono_w32error_get_last ());
 }
 
 /*
@@ -2751,7 +2795,7 @@ mono_image_create_pefile (MonoReflectionModuleBuilder *mb, HANDLE file, MonoErro
                0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x0d, 0x0d, 0x0a,  0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
        };
 
-       mono_error_init (error);
+       error_init (error);
 
        assemblyb = mb->assemblyb;
 
@@ -3008,8 +3052,8 @@ mono_image_create_pefile (MonoReflectionModuleBuilder *mb, HANDLE file, MonoErro
                if (!assembly->sections [i].size)
                        continue;
                
-               if (SetFilePointer (file, assembly->sections [i].offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
-                       g_error ("SetFilePointer returned %d\n", GetLastError ());
+               if (mono_w32file_seek (file, assembly->sections [i].offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
+                       g_error ("mono_w32file_seek returned %d\n", mono_w32error_get_last ());
                
                switch (i) {
                case MONO_SECTION_TEXT:
@@ -3068,10 +3112,10 @@ mono_image_create_pefile (MonoReflectionModuleBuilder *mb, HANDLE file, MonoErro
        }
        
        /* check that the file is properly padded */
-       if (SetFilePointer (file, file_offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
-               g_error ("SetFilePointer returned %d\n", GetLastError ());
-       if (! SetEndOfFile (file))
-               g_error ("SetEndOfFile returned %d\n", GetLastError ());
+       if (mono_w32file_seek (file, file_offset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
+               g_error ("mono_w32file_seek returned %d\n", mono_w32error_get_last ());
+       if (! mono_w32file_truncate (file))
+               g_error ("mono_w32file_truncate returned %d\n", mono_w32error_get_last ());
        
        mono_dynamic_stream_reset (&assembly->code);
        mono_dynamic_stream_reset (&assembly->us);