From bf1862930b890472e6f93df4ad7e08f1d7620191 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Wed, 11 Jan 2017 04:31:21 -0500 Subject: [PATCH] [jit] Extends an array in mono_spill_global_vars () instead of asserting. Fixes #50789. (#4201) --- mono/mini/method-to-ir.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index bf5c0f3bbeb..94f28af9685 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -13802,7 +13802,7 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts) int orig_next_vreg; guint32 *vreg_to_lvreg; guint32 *lvregs; - guint32 i, lvregs_len; + guint32 i, lvregs_len, lvregs_size; gboolean dest_has_lvreg = FALSE; MonoStackType stacktypes [128]; MonoInst **live_range_start, **live_range_end; @@ -13875,7 +13875,8 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts) */ orig_next_vreg = cfg->next_vreg; vreg_to_lvreg = (guint32 *)mono_mempool_alloc0 (cfg->mempool, sizeof (guint32) * cfg->next_vreg); - lvregs = (guint32 *)mono_mempool_alloc (cfg->mempool, sizeof (guint32) * 1024); + lvregs_size = 1024; + lvregs = (guint32 *)mono_mempool_alloc (cfg->mempool, sizeof (guint32) * lvregs_size); lvregs_len = 0; /* @@ -14258,7 +14259,12 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts) } g_assert (sreg != -1); vreg_to_lvreg [var->dreg] = sreg; - g_assert (lvregs_len < 1024); + if (lvregs_len >= lvregs_size) { + guint32 *new_lvregs = mono_mempool_alloc0 (cfg->mempool, sizeof (guint32) * lvregs_size * 2); + memcpy (new_lvregs, lvregs, sizeof (guint32) * lvregs_size); + lvregs = new_lvregs; + lvregs_size *= 2; + } lvregs [lvregs_len ++] = var->dreg; } } @@ -14305,7 +14311,12 @@ mono_spill_global_vars (MonoCompile *cfg, gboolean *need_local_opts) if (dest_has_lvreg) { g_assert (ins->dreg != -1); vreg_to_lvreg [prev_dreg] = ins->dreg; - g_assert (lvregs_len < 1024); + if (lvregs_len >= lvregs_size) { + guint32 *new_lvregs = mono_mempool_alloc0 (cfg->mempool, sizeof (guint32) * lvregs_size * 2); + memcpy (new_lvregs, lvregs, sizeof (guint32) * lvregs_size); + lvregs = new_lvregs; + lvregs_size *= 2; + } lvregs [lvregs_len ++] = prev_dreg; dest_has_lvreg = FALSE; } -- 2.11.4.GIT