From a0608bd8915f69c533cf729f1b091b31a8d933cb Mon Sep 17 00:00:00 2001 From: cdemirer <41021322+cdemirer@users.noreply.github.com> Date: Tue, 28 Jun 2022 18:45:27 +0300 Subject: Fix set chain bug with jump_if_shared --- modules/gdscript/gdscript_compiler.cpp | 20 ++++++++++---------- .../runtime/features/chain_assignment_works.gd | 19 +++++++++++++++++++ .../runtime/features/chain_assignment_works.out | 7 +++++++ 3 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.gd create mode 100644 modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.out diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index 1daf8ff7a9..6055d3df33 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/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(); diff --git a/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.gd b/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.gd new file mode 100644 index 0000000000..d2f3a3e18f --- /dev/null +++ b/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) diff --git a/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.out b/modules/gdscript/tests/scripts/runtime/features/chain_assignment_works.out new file mode 100644 index 0000000000..5e7ccf534a --- /dev/null +++ b/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)] -- cgit v1.2.3