Forráskód Böngészése

Zero Dictionary and Array variants when changing type with reset

So they don't reference to the old values anymore and instead refer to
a new value.
George Marques 3 éve
szülő
commit
4c14051b3f

+ 2 - 2
core/variant/variant_internal.h

@@ -1301,12 +1301,12 @@ struct VariantZeroAssigner<Signal> {
 
 template <>
 struct VariantZeroAssigner<Dictionary> {
-	static _FORCE_INLINE_ void zero(Variant *v) {}
+	static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_dictionary(v) = Dictionary(); }
 };
 
 template <>
 struct VariantZeroAssigner<Array> {
-	static _FORCE_INLINE_ void zero(Variant *v) {}
+	static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_array(v) = Array(); }
 };
 
 template <>

+ 32 - 0
modules/gdscript/tests/scripts/runtime/features/arrays_arent_shared.gd

@@ -0,0 +1,32 @@
+# https://github.com/godotengine/godot/issues/48121
+
+func test():
+	var x := []
+	var y := []
+	x.push_back(y)
+	print("TEST ARRAY ADD TO SELF: " + str(len(y)))
+	x.clear()
+
+	x = Array()
+	y = Array()
+	x.push_back(y)
+	print("TEST ARRAY ADD TO SELF: " + str(len(y)))
+	x.clear()
+
+	x = Array().duplicate()
+	y = Array().duplicate()
+	x.push_back(y)
+	print("TEST ARRAY ADD TO SELF: " + str(len(y)))
+	x.clear()
+
+	x = [].duplicate()
+	y = [].duplicate()
+	x.push_back(y)
+	print("TEST ARRAY ADD TO SELF: " + str(len(y)))
+	x.clear()
+
+	x = Array()
+	y = Array()
+	x.push_back(y)
+	print("TEST ARRAY ADD TO SELF: " + str(len(y)))
+	x.clear()

+ 6 - 0
modules/gdscript/tests/scripts/runtime/features/arrays_arent_shared.out

@@ -0,0 +1,6 @@
+GDTEST_OK
+TEST ARRAY ADD TO SELF: 0
+TEST ARRAY ADD TO SELF: 0
+TEST ARRAY ADD TO SELF: 0
+TEST ARRAY ADD TO SELF: 0
+TEST ARRAY ADD TO SELF: 0

+ 19 - 0
modules/gdscript/tests/scripts/runtime/features/dictionaries_arent_shared.gd

@@ -0,0 +1,19 @@
+# https://github.com/godotengine/godot/issues/48121
+
+func test():
+	var x := Dictionary()
+	var y := Dictionary()
+	y[0]=1
+	y[1]=1
+	y[2]=1
+	print("TEST OTHER DICTIONARY: " + str(len(x)))
+	x.clear()
+
+	x = Dictionary().duplicate()
+	y = Dictionary().duplicate()
+	y[0]=1
+	y[1]=1
+	y[2]=1
+	print("TEST OTHER DICTIONARY: " + str(len(x)))
+	x.clear()
+	return

+ 3 - 0
modules/gdscript/tests/scripts/runtime/features/dictionaries_arent_shared.out

@@ -0,0 +1,3 @@
+GDTEST_OK
+TEST OTHER DICTIONARY: 0
+TEST OTHER DICTIONARY: 0