Skip to content

Commit e42b687

Browse files
authored
[sdb] Add MODULE_APPLY_CHANGES command for hot reload (#49043)
1 parent 2f9f6dd commit e42b687

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

src/mono/mono/mini/debugger-agent.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6391,6 +6391,27 @@ get_types_for_source_file (gpointer key, gpointer value, gpointer user_data)
63916391
}
63926392
}
63936393

6394+
static gboolean
6395+
module_apply_changes (MonoImage *image, MonoArray *dmeta, MonoArray *dil, MonoArray *dpdb, MonoError *error)
6396+
{
6397+
#ifdef ENABLE_METADATA_UPDATE
6398+
MonoDomain *domain = mono_domain_get ();
6399+
/* TODO: use dpdb */
6400+
gpointer dmeta_bytes = (gpointer)mono_array_addr_internal (dmeta, char, 0);
6401+
int32_t dmeta_len = mono_array_length_internal (dmeta);
6402+
gpointer dil_bytes = (gpointer)mono_array_addr_internal (dil, char, 0);
6403+
int32_t dil_len = mono_array_length_internal (dil);
6404+
gpointer dpdb_bytes = !dpdb ? NULL : (gpointer)mono_array_addr_internal (dpdb, char, 0);
6405+
int32_t dpdb_len = !dpdb ? 0 : mono_array_length_internal (dpdb);
6406+
mono_image_load_enc_delta (domain, image, dmeta_bytes, dmeta_len, dil_bytes, dil_len, error);
6407+
return is_ok (error);
6408+
#else
6409+
mono_error_set_not_supported (error, "");
6410+
return FALSE;
6411+
#endif
6412+
}
6413+
6414+
63946415
static void
63956416
buffer_add_cattr_arg (Buffer *buf, MonoType *t, MonoDomain *domain, MonoObject *val)
63966417
{
@@ -7481,6 +7502,27 @@ module_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
74817502
g_free (sourcelink);
74827503
break;
74837504
}
7505+
case MDBGPROT_CMD_MODULE_APPLY_CHANGES: {
7506+
MonoImage *image = decode_moduleid (p, &p, end, &domain, &err);
7507+
if (err != ERR_NONE)
7508+
return err;
7509+
int dmeta_id = decode_objid (p, &p, end);
7510+
int dil_id = decode_objid (p, &p, end);
7511+
int dpdb_id = decode_objid (p, &p, end);
7512+
MonoObject *dmeta, *dil, *dpdb;
7513+
if ((err = get_object (dmeta_id, &dmeta)) != ERR_NONE)
7514+
return err;
7515+
if ((err = get_object (dil_id, &dil)) != ERR_NONE)
7516+
return err;
7517+
if ((err = get_object_allow_null (dpdb_id, &dpdb)) != ERR_NONE)
7518+
return err;
7519+
ERROR_DECL (error);
7520+
if (!module_apply_changes (image, (MonoArray *)dmeta, (MonoArray *)dil, (MonoArray *)dpdb, error)) {
7521+
mono_error_cleanup (error);
7522+
return ERR_LOADER_ERROR;
7523+
}
7524+
return ERR_NONE;
7525+
}
74847526
default:
74857527
return ERR_NOT_IMPLEMENTED;
74867528
}
@@ -9459,6 +9501,7 @@ static const char* assembly_cmds_str[] = {
94599501

94609502
static const char* module_cmds_str[] = {
94619503
"GET_INFO",
9504+
"APPLY_CHANGES",
94629505
};
94639506

94649507
static const char* field_cmds_str[] = {

src/mono/mono/mini/debugger-protocol.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*/
1212

1313
#define MAJOR_VERSION 2
14-
#define MINOR_VERSION 59
14+
#define MINOR_VERSION 60
1515

1616
typedef enum {
1717
MDBGPROT_CMD_COMPOSITE = 100
@@ -143,6 +143,7 @@ typedef enum {
143143

144144
typedef enum {
145145
MDBGPROT_CMD_MODULE_GET_INFO = 1,
146+
MDBGPROT_CMD_MODULE_APPLY_CHANGES = 2,
146147
} MdbgProtCmdModule;
147148

148149
typedef enum {

0 commit comments

Comments
 (0)