2005-07-21 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mono / metadata / mono-debug-debugger.c
index 772774494fdfb762cf30ef177c2b7caed9a4d5cc..b20f440d4fa95b7df626dfc67a5b21c140de6ba0 100644 (file)
@@ -18,7 +18,7 @@
 static guint32 debugger_lock_level = 0;
 static CRITICAL_SECTION debugger_lock_mutex;
 static gboolean must_reload_symtabs = FALSE;
-static gboolean mono_debugger_initialized = FALSE;
+static gboolean mono_debugger_use_debugger = FALSE;
 static MonoObject *last_exception = NULL;
 
 struct _MonoDebuggerMetadataInfo {
@@ -68,11 +68,6 @@ MonoDebuggerIOLayer mono_debugger_io_layer = {
 void
 mono_debugger_lock (void)
 {
-       if (!mono_debugger_initialized) {
-               debugger_lock_level++;
-               return;
-       }
-
        EnterCriticalSection (&debugger_lock_mutex);
        debugger_lock_level++;
 }
@@ -80,15 +75,8 @@ mono_debugger_lock (void)
 void
 mono_debugger_unlock (void)
 {
-       g_assert (debugger_lock_level > 0);
-
-       if (!mono_debugger_initialized) {
-               debugger_lock_level--;
-               return;
-       }
-
        if (debugger_lock_level == 1) {
-               if (must_reload_symtabs) {
+               if (must_reload_symtabs && mono_debugger_use_debugger) {
                        mono_debugger_event (MONO_DEBUGGER_EVENT_RELOAD_SYMTABS, 0, 0);
                        must_reload_symtabs = FALSE;
                }
@@ -99,20 +87,20 @@ mono_debugger_unlock (void)
 }
 
 void
-mono_debugger_initialize (void)
+mono_debugger_initialize (gboolean use_debugger)
 {
        MONO_GC_REGISTER_ROOT (last_exception);
        
-       g_assert (!mono_debugger_initialized);
+       g_assert (!mono_debugger_use_debugger);
 
        InitializeCriticalSection (&debugger_lock_mutex);
-       mono_debugger_initialized = TRUE;
+       mono_debugger_use_debugger = use_debugger;
 }
 
 void
 mono_debugger_add_symbol_file (MonoDebugHandle *handle)
 {
-       g_assert (mono_debugger_initialized);
+       g_assert (mono_debugger_use_debugger);
 
        mono_debugger_lock ();
        mono_debugger_event (MONO_DEBUGGER_EVENT_ADD_MODULE, GPOINTER_TO_UINT (handle), 0);
@@ -313,7 +301,7 @@ mono_debugger_breakpoint_callback (MonoMethod *method, guint32 index)
 gboolean
 mono_debugger_unhandled_exception (gpointer addr, gpointer stack, MonoObject *exc)
 {
-       if (!mono_debugger_initialized)
+       if (!mono_debugger_use_debugger)
                return FALSE;
 
        // Prevent the object from being finalized.
@@ -328,7 +316,7 @@ mono_debugger_handle_exception (gpointer addr, gpointer stack, MonoObject *exc)
 {
        MonoDebuggerExceptionInfo info;
 
-       if (!mono_debugger_initialized)
+       if (!mono_debugger_use_debugger)
                return;
 
        // Prevent the object from being finalized.
@@ -347,7 +335,7 @@ mono_debugger_throw_exception (gpointer addr, gpointer stack, MonoObject *exc)
 {
        MonoDebuggerExceptionInfo info;
 
-       if (!mono_debugger_initialized)
+       if (!mono_debugger_use_debugger)
                return FALSE;
 
        // Prevent the object from being finalized.
@@ -406,9 +394,6 @@ mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, Mono
        MonoObject *retval;
        gchar *message;
 
-       //      g_message (G_STRLOC ": %p - %p - %p - %p", method, obj, params, exc);
-       //      g_message (G_STRLOC ": %s.%s", method->klass->name, method->name);
-
        if (!strcmp (method->name, ".ctor")) {
                retval = obj = mono_object_new (mono_domain_get (), method->klass);
 
@@ -428,6 +413,36 @@ mono_debugger_runtime_invoke (MonoMethod *method, void *obj, void **params, Mono
        return retval;
 }
 
+gboolean
+mono_debugger_lookup_type (const gchar *type_name)
+{
+       int i;
+       mono_debugger_lock ();
+
+       for (i = 0; i < mono_symbol_table->num_symbol_files; i++) {
+               MonoDebugHandle *symfile = mono_symbol_table->symbol_files [i];
+               MonoType *type;
+               MonoClass* klass;
+               gchar *name;
+
+               name = g_strdup (type_name);
+               type = mono_reflection_type_from_name (name, symfile->image);
+               g_free (name);
+               if (!type)
+                       continue;
+
+               klass = mono_class_from_mono_type (type);
+               if (klass)
+                       mono_class_init (klass);
+
+               mono_debugger_unlock ();
+               return TRUE;
+       }
+
+       mono_debugger_unlock ();
+       return FALSE;
+}
+
 gint32
 mono_debugger_lookup_assembly (const gchar *name)
 {