From c717d5c64baa5c63aca977e49b0ca2b5b0b0f4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Verschelde?= Date: Mon, 4 Jul 2022 16:43:49 +0200 Subject: Arrays: Zero new items of trivial types on resize() (bindings only) This is not enabled by default in the core version for performance reasons, as Vector/CowData are used in critical code paths where not zero'ing memory which is going to be set later on can be important. But for bindings / the scripting API, we make zero the new items by default (which already happened for built types like Vector3, etc., but not for trivial types like int, float). Fixes #43033. Co-authored-by: David Hoppenbrouwers --- core/templates/cowdata.h | 4 ++++ core/templates/vector.h | 1 + 2 files changed, 5 insertions(+) (limited to 'core/templates') diff --git a/core/templates/cowdata.h b/core/templates/cowdata.h index e760fc2176..5f13f4a6be 100644 --- a/core/templates/cowdata.h +++ b/core/templates/cowdata.h @@ -158,6 +158,7 @@ public: return _ptr[p_index]; } + template Error resize(int p_size); _FORCE_INLINE_ void remove_at(int p_index) { @@ -257,6 +258,7 @@ uint32_t CowData::_copy_on_write() { } template +template Error CowData::resize(int p_size) { ERR_FAIL_COND_V(p_size < 0, ERR_INVALID_PARAMETER); @@ -306,6 +308,8 @@ Error CowData::resize(int p_size) { for (int i = *_get_size(); i < p_size; i++) { memnew_placement(&_ptr[i], T); } + } else if (p_ensure_zero) { + memset((void *)(_ptr + current_size), 0, (p_size - current_size) * sizeof(T)); } *_get_size() = p_size; diff --git a/core/templates/vector.h b/core/templates/vector.h index f3f5ed76a7..51595a75f5 100644 --- a/core/templates/vector.h +++ b/core/templates/vector.h @@ -89,6 +89,7 @@ public: _FORCE_INLINE_ void set(int p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); } _FORCE_INLINE_ int size() const { return _cowdata.size(); } Error resize(int p_size) { return _cowdata.resize(p_size); } + Error resize_zeroed(int p_size) { return _cowdata.template resize(p_size); } _FORCE_INLINE_ const T &operator[](int p_index) const { return _cowdata.get(p_index); } Error insert(int p_pos, T p_val) { return _cowdata.insert(p_pos, p_val); } int find(const T &p_val, int p_from = 0) const { return _cowdata.find(p_val, p_from); } -- cgit v1.2.3