file-io.c: Don't consider sockets as directory and avoid an endless loop. Fix bug...
[mono.git] / mono / metadata / mono-debug.c
index f93cdbffbae7c145563612bc495c2452fd21567b..b3816d22ea23c26752843fa875f6f990d73b7eb2 100644 (file)
@@ -133,6 +133,12 @@ mono_debug_init_2 (MonoAssembly *assembly)
        mono_debug_open_image (mono_assembly_get_image (assembly));
 }
 
+gboolean
+mono_debug_using_mono_debugger (void)
+{
+       return in_the_mono_debugger;
+}
+
 void
 mono_debug_cleanup (void)
 {
@@ -448,6 +454,9 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma
        MonoDebugMethodInfo *minfo;
        MethodHashEntry *hash;
 
+       if (method->is_inflated)
+               return NULL;
+
        if ((method->iflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL) ||
            (method->iflags & METHOD_IMPL_ATTRIBUTE_RUNTIME) ||
            (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) ||
@@ -461,6 +470,7 @@ mono_debug_add_method (MonoMethod *method, MonoDebugMethodJitInfo *jit, MonoDoma
 
        handle = _mono_debug_get_image (method->klass->image);
        if (!handle || !handle->symfile || !handle->symfile->offset_table) {
+               mono_debug_add_wrapper (method, jit);
                mono_debugger_unlock ();
                return NULL;
        }
@@ -724,15 +734,6 @@ mono_debug_start_add_type (MonoClass *klass)
                return;
 }
 
-static guint32
-get_token (MonoClass *klass)
-{
-       while (klass->rank)
-               klass = klass->element_class;
-
-       return klass->type_token;
-}
-
 static void
 mono_debug_add_type (MonoClass *klass)
 {
@@ -740,14 +741,14 @@ mono_debug_add_type (MonoClass *klass)
        MonoDebugClassEntry *entry;
        char buffer [BUFSIZ];
        guint8 *ptr, *oldptr;
-       guint32 token, size, total_size, max_size;
+       guint32 size, total_size, max_size;
        int base_offset = 0;
 
        handle = _mono_debug_get_image (klass->image);
        if (!handle)
                return;
 
-       if (klass->generic_class ||
+       if (klass->generic_class || klass->rank ||
            (klass->byval_arg.type == MONO_TYPE_VAR) || (klass->byval_arg.type == MONO_TYPE_MVAR))
                return;
 
@@ -757,15 +758,10 @@ mono_debug_add_type (MonoClass *klass)
        else
                ptr = oldptr = buffer;
 
-       token = get_token (klass);
-       if (!token)
-               return;
-
        if (klass->valuetype)
                base_offset = - (int)(sizeof (MonoObject));
 
-       write_leb128 (token, ptr, &ptr);
-       write_leb128 (klass->rank, ptr, &ptr);
+       write_leb128 (klass->type_token, ptr, &ptr);
        write_leb128 (klass->instance_size + base_offset, ptr, &ptr);
        WRITE_UNALIGNED (gpointer, ptr, klass);
        ptr += sizeof (gpointer);
@@ -774,13 +770,7 @@ mono_debug_add_type (MonoClass *klass)
        g_assert (size < max_size);
        total_size = size + sizeof (MonoDebugClassEntry);
 
-       if (total_size + 9 >= DATA_TABLE_CHUNK_SIZE) {
-               // FIXME: Maybe we should print a warning here.
-               //        This should only happen for very big methods, for instance
-               //        with more than 40.000 line numbers and more than 5.000
-               //        local variables.
-               return;
-       }
+       g_assert (total_size + 9 < DATA_TABLE_CHUNK_SIZE);
 
        entry = (MonoDebugClassEntry *) allocate_data_item (MONO_DEBUG_DATA_ITEM_CLASS, total_size);