From 9d9008ee5ec979543c997616f33de5283b73bad5 Mon Sep 17 00:00:00 2001 From: monojenkins Date: Wed, 20 May 2020 06:52:01 -0400 Subject: [PATCH] [interp] Small cleanups (#36706) Co-authored-by: BrzVlad --- src/mono/mono/mini/interp/interp.c | 27 ++++++++++++++++++--------- src/mono/mono/mini/interp/mintops.def | 1 + src/mono/mono/mini/interp/transform.c | 16 +++++++++++----- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/mono/mono/mini/interp/interp.c b/src/mono/mono/mini/interp/interp.c index 4563f1c..6572376 100644 --- a/src/mono/mono/mini/interp/interp.c +++ b/src/mono/mono/mini/interp/interp.c @@ -4969,6 +4969,24 @@ call:; ip += 3; MINT_IN_BREAK; } + MINT_IN_CASE(MINT_NEWOBJ_STRING) { + frame->ip = ip; + + cmethod = (InterpMethod*)frame->imethod->data_items [ip [1]]; + + const int param_count = ip [2]; + if (param_count) { + sp -= param_count; + memmove (sp + 2, sp, param_count * sizeof (stackval)); + } + + retval = sp; + ++sp; + sp->data.p = NULL; // first parameter + is_void = TRUE; + ip += 3; + goto call; + } MINT_IN_CASE(MINT_NEWOBJ_FAST) { MonoVTable *vtable = (MonoVTable*) frame->imethod->data_items [ip [3]]; INIT_VTABLE (vtable); @@ -5091,15 +5109,6 @@ call_newobj: g_assert (!m_class_is_valuetype (newobj_class)); - // This branch could be avoided. Move it to transform, and use a new opcode NEWOBJ_STRING. - if (newobj_class == mono_defaults.string_class) { - retval = sp; - ++sp; - sp->data.p = NULL; // first parameter - is_void = TRUE; - goto call; - } - MonoDomain* const domain = frame->imethod->domain; MonoVTable *vtable = mono_class_vtable_checked (domain, newobj_class, error); if (!is_ok (error) || !mono_runtime_class_init_full (vtable, error)) { diff --git a/src/mono/mono/mini/interp/mintops.def b/src/mono/mono/mini/interp/mintops.def index d3a7a73..d3dd6cc 100644 --- a/src/mono/mono/mini/interp/mintops.def +++ b/src/mono/mono/mini/interp/mintops.def @@ -380,6 +380,7 @@ OPDEF(MINT_ENDFILTER, "endfilter", 1, Pop0, Push0, MintOpNoArgs) OPDEF(MINT_NEWOBJ, "newobj", 2, VarPop, Push1, MintOpMethodToken) OPDEF(MINT_NEWOBJ_ARRAY, "newobj_array", 3, VarPop, Push1, MintOpMethodToken) +OPDEF(MINT_NEWOBJ_STRING, "newobj_string", 3, VarPop, Push1, MintOpMethodToken) OPDEF(MINT_NEWOBJ_FAST, "newobj_fast", 4, VarPop, Push1, MintOpMethodToken) OPDEF(MINT_NEWOBJ_VT_FAST, "newobj_vt_fast", 3, VarPop, Push1, MintOpMethodToken) OPDEF(MINT_NEWOBJ_VTST_FAST, "newobj_vtst_fast", 4, VarPop, Push1, MintOpMethodToken) diff --git a/src/mono/mono/mini/interp/transform.c b/src/mono/mono/mini/interp/transform.c index 4554273..5d78ab5 100644 --- a/src/mono/mono/mini/interp/transform.c +++ b/src/mono/mono/mini/interp/transform.c @@ -2489,11 +2489,12 @@ interp_transform_call (TransformData *td, MonoMethod *method, MonoMethod *target #endif if (op != -1) { - td->last_ins->data[1] = op; - if (td->last_ins->opcode == MINT_CALLI_NAT_FAST) - td->last_ins->data[2] = save_last_error; - } else if (op == -1 && td->last_ins->opcode == MINT_CALLI_NAT) { - td->last_ins->data[1] = save_last_error; + g_assert (td->last_ins->opcode == MINT_CALLI_NAT_FAST); + td->last_ins->data [1] = op; + td->last_ins->data [2] = save_last_error; + } else if (native) { + g_assert (td->last_ins->opcode == MINT_CALLI_NAT); + td->last_ins->data [1] = save_last_error; } } else { InterpMethod *imethod = mono_interp_get_imethod (domain, target_method, error); @@ -4610,6 +4611,10 @@ generate_code (TransformData *td, MonoMethod *method, MonoMethodHeader *header, interp_add_ins (td, MINT_NEWOBJ_ARRAY); td->last_ins->data [0] = get_data_item_index (td, m->klass); td->last_ins->data [1] = csignature->param_count; + } else if (klass == mono_defaults.string_class) { + interp_add_ins (td, MINT_NEWOBJ_STRING); + td->last_ins->data [0] = get_data_item_index (td, mono_interp_get_imethod (domain, m, error)); + td->last_ins->data [1] = csignature->param_count; } else if (m_class_get_image (klass) == mono_defaults.corlib && !strcmp (m_class_get_name (m->klass), "ByReference`1") && !strcmp (m->name, ".ctor")) { @@ -6489,6 +6494,7 @@ get_inst_stack_usage (TransformData *td, InterpInst *ins, int *pop, int *push) break; } case MINT_NEWOBJ_ARRAY: + case MINT_NEWOBJ_STRING: *pop = ins->data [1]; *push = 1; break; -- 2.7.4