Browse Source

Fix set chain bug with jump_if_shared

cdemirer 3 năm trước cách đây
mục cha
commit
a0608bd891

+ 10 - 10
modules/gdscript/gdscript_compiler.cpp

@@ -1059,22 +1059,22 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
 					bool known_type = assigned.type.has_type;
 					bool is_shared = Variant::is_type_shared(assigned.type.builtin_type);
 
-					if (!known_type) {
-						// Jump shared values since they are already updated in-place.
-						gen->write_jump_if_shared(assigned);
-					}
-					if (known_type && !is_shared) {
+					if (!known_type || !is_shared) {
+						if (!known_type) {
+							// Jump shared values since they are already updated in-place.
+							gen->write_jump_if_shared(assigned);
+						}
 						if (!info.is_named) {
 							gen->write_set(info.base, info.key, assigned);
-							if (info.key.mode == GDScriptCodeGenerator::Address::TEMPORARY) {
-								gen->pop_temporary();
-							}
 						} else {
 							gen->write_set_named(info.base, info.name, assigned);
 						}
+						if (!known_type) {
+							gen->write_end_jump_if_shared();
+						}
 					}
-					if (!known_type) {
-						gen->write_end_jump_if_shared();
+					if (!info.is_named && info.key.mode == GDScriptCodeGenerator::Address::TEMPORARY) {
+						gen->pop_temporary();
 					}
 					if (assigned.mode == GDScriptCodeGenerator::Address::TEMPORARY) {
 						gen->pop_temporary();

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

@@ -0,0 +1,19 @@
+func test():
+	var dictionary1: Variant = {1:Vector2()}
+	dictionary1[1].x = 2
+	var dictionary2: Dictionary = {3:Vector2()}
+	dictionary2[3].x = 4
+	var array1: Variant = [[Vector2()]]
+	array1[0][0].x = 5
+	var array2: Array = [[Vector2()]]
+	array2[0][0].x = 6
+	var array3: Array[Array] = [[Vector2()]]
+	array3[0][0].x = 7
+	var transform = Transform3D()
+	transform.basis.x = Vector3(8.0, 9.0, 7.0)
+	print(dictionary1)
+	print(dictionary2)
+	print(array1)
+	print(array2)
+	print(array3)
+	print(transform)

+ 7 - 0
modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.out

@@ -0,0 +1,7 @@
+GDTEST_OK
+{1:(2, 0)}
+{3:(4, 0)}
+[[(5, 0)]]
+[[(6, 0)]]
+[[(7, 0)]]
+[X: (8, 9, 7), Y: (0, 1, 0), Z: (0, 0, 1), O: (0, 0, 0)]