Skip to content

Commit 02bfed6

Browse files
authored
Merge pull request #1785 from Unity-Technologies/unity-2023.1-mbe-fix-uum-27537
[2023.1][mono][jit] Emit a null check when storing to valuetype fields. (#82663)
2 parents cc545d5 + f36183d commit 02bfed6

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

mono/mini/ir-emit.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,13 @@ static int ccount = 0;
881881
#define MONO_EMIT_NEW_IMPLICIT_EXCEPTION_LOAD_STORE(cfg) do { \
882882
} while (0)
883883

884+
#define MONO_EMIT_EXPLICIT_NULL_CHECK(cfg, reg) do { \
885+
cfg->flags |= MONO_CFG_HAS_CHECK_THIS; \
886+
MONO_EMIT_NEW_BIALU_IMM (cfg, OP_COMPARE_IMM, -1, (reg), 0); \
887+
MONO_EMIT_NEW_COND_EXC (cfg, EQ, "NullReferenceException"); \
888+
MONO_EMIT_NEW_UNALU (cfg, OP_NOT_NULL, -1, reg); \
889+
} while (0)
890+
884891
/* Emit an explicit null check which doesn't depend on SIGSEGV signal handling */
885892
#define MONO_EMIT_NULL_CHECK(cfg, reg, out_of_page) do { \
886893
if (cfg->explicit_null_checks || (out_of_page)) { \

mono/mini/method-to-ir.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9661,6 +9661,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
96619661
EMIT_NEW_BIALU_IMM (cfg, ptr, OP_PADD_IMM, dreg, sp [0]->dreg, foffset);
96629662
store = mini_emit_storing_write_barrier (cfg, ptr, sp [1]);
96639663
} else {
9664+
if (MONO_TYPE_ISSTRUCT (field->type))
9665+
/* The decomposition might end up calling a copy/wbarrier function which doesn't do null checks */
9666+
MONO_EMIT_EXPLICIT_NULL_CHECK (cfg, sp [0]->dreg);
9667+
96649668
EMIT_NEW_STORE_MEMBASE_TYPE (cfg, store, field->type, sp [0]->dreg, foffset, sp [1]->dreg);
96659669
}
96669670
}

0 commit comments

Comments
 (0)