diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2020-11-30 14:34:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-30 14:34:56 +0100 |
commit | 27f1c67155cf8a5618b1186b27932eb226bb0f0a (patch) | |
tree | 70c51d89ae4abafef4b5af7992987e096560872c | |
parent | b9a2787bd164602e866ecac1527020e0e1c34da8 (diff) | |
parent | a604e72dc974723439e9df5edc67502b82beba4b (diff) |
Merge pull request #43987 from vnen/gdscript-dont-share-references
GDScript: Don't construct ref values in compiler
-rw-r--r-- | modules/gdscript/gdscript_analyzer.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index 3f2fdc04a5..aa2fa67ef2 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -1709,7 +1709,27 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool is_awa call_type.native_type = function_name; // "Object". } - if (all_is_constant) { + bool safe_to_fold = true; + switch (builtin_type) { + // Those are stored by reference so not suited for compile-time construction. + // Because in this case they would be the same reference in all constructed values. + case Variant::OBJECT: + case Variant::PACKED_BYTE_ARRAY: + case Variant::PACKED_INT32_ARRAY: + case Variant::PACKED_INT64_ARRAY: + case Variant::PACKED_FLOAT32_ARRAY: + case Variant::PACKED_FLOAT64_ARRAY: + case Variant::PACKED_STRING_ARRAY: + case Variant::PACKED_VECTOR2_ARRAY: + case Variant::PACKED_VECTOR3_ARRAY: + case Variant::PACKED_COLOR_ARRAY: + safe_to_fold = false; + break; + default: + break; + } + + if (all_is_constant && safe_to_fold) { // Construct here. Vector<const Variant *> args; for (int i = 0; i < p_call->arguments.size(); i++) { |