Skip to content

Commit fc53ee7

Browse files
thaystglewing
andauthored
[wasm][debugger] Implement support to modify values. (#49557)
* [wasm][debugger] Implement support to modify values. * Apply suggestions from code review Co-authored-by: Larry Ewing <lewing@microsoft.com> * Adding first test. * Adding more tests, fixing boolean behavior, ignore value change when the new value type is incompatible. * Implement set value on object -> property and attribute. * Fix compilation * Changing what @radical suggested. * Adding tests. * Adding test. * Fix what @radical suggested. * Fix compilation. * Fix what @radical suggested. Co-authored-by: Larry Ewing <lewing@microsoft.com>
1 parent d25620b commit fc53ee7

File tree

13 files changed

+794
-44
lines changed

13 files changed

+794
-44
lines changed

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

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5735,24 +5735,6 @@ set_var (MonoType *t, MonoDebugVarInfo *var, MonoContext *ctx, MonoDomain *domai
57355735
}
57365736
}
57375737

5738-
static void
5739-
set_interp_var (MonoType *t, gpointer addr, guint8 *val_buf)
5740-
{
5741-
int size;
5742-
5743-
if (t->byref) {
5744-
addr = *(gpointer*)addr;
5745-
g_assert (addr);
5746-
}
5747-
5748-
if (MONO_TYPE_IS_REFERENCE (t))
5749-
size = sizeof (gpointer);
5750-
else
5751-
size = mono_class_value_size (mono_class_from_mono_type_internal (t), NULL);
5752-
5753-
memcpy (addr, val_buf, size);
5754-
}
5755-
57565738
static void
57575739
clear_event_request (int req_id, int etype)
57585740
{
@@ -9183,7 +9165,9 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
91839165
addr = (guint8*)mini_get_interp_callbacks ()->frame_get_arg (frame->interp_frame, pos);
91849166
else
91859167
addr = (guint8*)mini_get_interp_callbacks ()->frame_get_local (frame->interp_frame, pos);
9186-
set_interp_var (t, addr, val_buf);
9168+
err = mono_de_set_interp_var (t, addr, val_buf);
9169+
if (err != ERR_NONE)
9170+
return err;
91879171
} else {
91889172
set_var (t, var, &frame->ctx, frame->de.domain, val_buf, frame->reg_locations, &tls->restore_state.ctx);
91899173
}
@@ -9214,7 +9198,9 @@ frame_commands (int command, guint8 *p, guint8 *end, Buffer *buf)
92149198
guint8 *addr;
92159199

92169200
addr = (guint8*)mini_get_interp_callbacks ()->frame_get_this (frame->interp_frame);
9217-
set_interp_var (m_class_get_this_arg (frame->actual_method->klass), addr, val_buf);
9201+
err = mono_de_set_interp_var (m_class_get_this_arg (frame->actual_method->klass), addr, val_buf);
9202+
if (err != ERR_NONE)
9203+
return err;
92189204
} else {
92199205
var = jit->this_var;
92209206
if (!var) {

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,5 +1754,24 @@ get_notify_debugger_of_wait_completion_method (void)
17541754
return notify_debugger_of_wait_completion_method_cache;
17551755
}
17561756

1757+
DbgEngineErrorCode
1758+
mono_de_set_interp_var (MonoType *t, gpointer addr, guint8 *val_buf)
1759+
{
1760+
int size;
1761+
1762+
if (t->byref) {
1763+
addr = *(gpointer*)addr;
1764+
if (!addr)
1765+
return ERR_INVALID_OBJECT;
1766+
}
1767+
1768+
if (MONO_TYPE_IS_REFERENCE (t))
1769+
size = sizeof (gpointer);
1770+
else
1771+
size = mono_class_value_size (mono_class_from_mono_type_internal (t), NULL);
1772+
1773+
memcpy (addr, val_buf, size);
1774+
return ERR_NONE;
1775+
}
17571776

17581777
#endif

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,8 @@ DbgEngineErrorCode mono_de_ss_create (MonoInternalThread *thread, StepSize size,
510510
void mono_de_cancel_ss (SingleStepReq *req);
511511
void mono_de_cancel_all_ss (void);
512512

513+
DbgEngineErrorCode mono_de_set_interp_var (MonoType *t, gpointer addr, guint8 *val_buf);
514+
513515
gboolean set_set_notification_for_wait_completion_flag (DbgEngineStackFrame *frame);
514516
MonoClass * get_class_to_get_builder_field(DbgEngineStackFrame *frame);
515517
gpointer get_this_addr (DbgEngineStackFrame *the_frame);

0 commit comments

Comments
 (0)