From 12995b84c76c8b7655be663b2b21d95f1d85af19 Mon Sep 17 00:00:00 2001 From: Chronos Ouroboros Date: Thu, 8 Sep 2022 09:41:36 -0300 Subject: [PATCH] - fixed FDynArray_Obj not performing write barriers properly. --- src/common/scripting/core/dynarrays.cpp | 30 ++++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/common/scripting/core/dynarrays.cpp b/src/common/scripting/core/dynarrays.cpp index 1d03fe3a724..207c91fbcd9 100644 --- a/src/common/scripting/core/dynarrays.cpp +++ b/src/common/scripting/core/dynarrays.cpp @@ -842,30 +842,45 @@ DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Ptr, Clear, ArrayClear) // //----------------------------------------------------- -DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Obj, Copy, ArrayCopy) +void ObjArrayCopy(FDynArray_Obj *self, FDynArray_Obj *other) { - PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); - PARAM_POINTER(other, FDynArray_Obj); for (auto& elem : *other) GC::WriteBarrier(elem); *self = *other; - return 0; } -DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Obj, Move, ArrayMove) +DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Obj, Copy, ObjArrayCopy) { PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); PARAM_POINTER(other, FDynArray_Obj); + ObjArrayCopy(self, other); + return 0; +} + +void ObjArrayMove(FDynArray_Obj *self, FDynArray_Obj *other) +{ for (auto& elem : *other) GC::WriteBarrier(elem); *self = std::move(*other); - return 0; } -DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Obj, Append, ArrayAppend) +DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Obj, Move, ObjArrayMove) { PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); PARAM_POINTER(other, FDynArray_Obj); + ObjArrayMove(self, other); + return 0; +} + +void ObjArrayAppend(FDynArray_Obj *self, FDynArray_Obj *other) +{ for (auto& elem : *other) GC::WriteBarrier(elem); self->Append(*other); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Obj, Append, ObjArrayAppend) +{ + PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); + PARAM_POINTER(other, FDynArray_Obj); + ObjArrayAppend(self, other); return 0; } @@ -886,7 +901,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(FDynArray_Obj, Push, ObjArrayPush) { PARAM_SELF_STRUCT_PROLOGUE(FDynArray_Obj); PARAM_OBJECT(val, DObject); - GC::WriteBarrier(val); ACTION_RETURN_INT(ObjArrayPush(self, val)); }