From bee1e945b6513581e907a9d1252d7ad773089c87 Mon Sep 17 00:00:00 2001 From: monojenkins Date: Thu, 20 Feb 2020 16:07:22 -0500 Subject: [PATCH] [wasm] Improve locals visualization (#32503) Co-authored-by: Ankit Jain --- src/mono/mono/mini/mini-wasm-debugger.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/mono/mono/mini/mini-wasm-debugger.c b/src/mono/mono/mini/mini-wasm-debugger.c index 4eb3a27..32dedb8 100644 --- a/src/mono/mono/mini/mini-wasm-debugger.c +++ b/src/mono/mono/mini/mini-wasm-debugger.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -42,6 +43,7 @@ extern void mono_wasm_add_bool_var (gint8); extern void mono_wasm_add_number_var (double); extern void mono_wasm_add_string_var (const char*); extern void mono_wasm_add_obj_var (const char*, guint64); +extern void mono_wasm_add_func_var (const char*, guint64); extern void mono_wasm_add_array_var (const char*, guint64); extern void mono_wasm_add_properties_var (const char*); extern void mono_wasm_add_array_item (int); @@ -529,7 +531,11 @@ mono_wasm_current_bp_id (void) static int get_object_id(MonoObject *obj) { - ObjRef *ref = (ObjRef *)g_hash_table_lookup (obj_to_objref, GINT_TO_POINTER (~((gsize)obj))); + ObjRef *ref; + if (!obj) + return 0; + + ref = (ObjRef *)g_hash_table_lookup (obj_to_objref, GINT_TO_POINTER (~((gsize)obj))); if (ref) return ref->id; ref = g_new0 (ObjRef, 1); @@ -650,23 +656,18 @@ static gboolean describe_value(MonoType * type, gpointer addr) case MONO_TYPE_OBJECT: case MONO_TYPE_CLASS: { MonoObject *obj = *(MonoObject**)addr; - if (!obj) { - mono_wasm_add_string_var (NULL); + MonoClass *klass = type->data.klass; + + char *class_name = mono_type_full_name (type); + + if (type->type == MONO_TYPE_SZARRAY || type->type == MONO_TYPE_ARRAY) { + mono_wasm_add_array_var (class_name, get_object_id (obj)); + } else if (m_class_is_delegate (klass)) { + mono_wasm_add_func_var (class_name, get_object_id (obj)); } else { - GString *class_name; - class_name = g_string_new (""); - if (*(m_class_get_name_space (obj->vtable->klass))) { - g_string_append (class_name, m_class_get_name_space (obj->vtable->klass)); - g_string_append_c (class_name, '.'); - } - g_string_append (class_name, m_class_get_name (obj->vtable->klass)); - if (m_class_get_byval_arg (obj->vtable->klass)->type == MONO_TYPE_SZARRAY || m_class_get_byval_arg (obj->vtable->klass)->type == MONO_TYPE_ARRAY) - mono_wasm_add_array_var (class_name->str, get_object_id(obj)); - else - mono_wasm_add_obj_var (class_name->str, get_object_id(obj)); - g_string_free(class_name, FALSE); - break; + mono_wasm_add_obj_var (class_name, get_object_id (obj)); } + g_free (class_name); break; } default: { -- 2.7.4