You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
GDScript: Fix uninitialized local variables not being reset
This commit is contained in:
@@ -38,15 +38,14 @@
|
||||
class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
|
||||
struct StackSlot {
|
||||
Variant::Type type = Variant::NIL;
|
||||
bool can_contain_object = true;
|
||||
Vector<int> bytecode_indices;
|
||||
|
||||
StackSlot() = default;
|
||||
StackSlot(Variant::Type p_type) :
|
||||
type(p_type) {}
|
||||
StackSlot(Variant::Type p_type, bool p_can_contain_object) :
|
||||
type(p_type), can_contain_object(p_can_contain_object) {}
|
||||
};
|
||||
|
||||
const static int RESERVED_STACK = 3; // For self, class, and nil.
|
||||
|
||||
struct CallTarget {
|
||||
Address target;
|
||||
bool is_new_temporary = false;
|
||||
@@ -85,9 +84,11 @@ class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
|
||||
RBMap<StringName, int> local_constants;
|
||||
|
||||
Vector<StackSlot> locals;
|
||||
HashSet<int> dirty_locals;
|
||||
|
||||
Vector<StackSlot> temporaries;
|
||||
List<int> used_temporaries;
|
||||
List<int> temporaries_pending_clear;
|
||||
HashSet<int> temporaries_pending_clear;
|
||||
RBMap<Variant::Type, List<int>> temporaries_pool;
|
||||
|
||||
List<GDScriptFunction::StackDebug> stack_debug;
|
||||
@@ -193,6 +194,9 @@ class GDScriptByteCodeGenerator : public GDScriptCodeGenerator {
|
||||
ERR_PRINT("Leaving block with non-zero temporary variables: " + itos(used_temporaries.size()));
|
||||
}
|
||||
#endif
|
||||
for (int i = current_locals; i < locals.size(); i++) {
|
||||
dirty_locals.insert(i + GDScriptFunction::FIXED_ADDRESSES_MAX);
|
||||
}
|
||||
locals.resize(current_locals);
|
||||
if (debug_stack) {
|
||||
for (const KeyValue<StringName, int> &E : block_identifiers) {
|
||||
@@ -455,7 +459,9 @@ public:
|
||||
virtual uint32_t add_or_get_name(const StringName &p_name) override;
|
||||
virtual uint32_t add_temporary(const GDScriptDataType &p_type) override;
|
||||
virtual void pop_temporary() override;
|
||||
virtual void clean_temporaries() override;
|
||||
virtual void clear_temporaries() override;
|
||||
virtual void clear_address(const Address &p_address) override;
|
||||
virtual bool is_local_dirty(const Address &p_address) const override;
|
||||
|
||||
virtual void start_parameters() override;
|
||||
virtual void end_parameters() override;
|
||||
@@ -496,6 +502,7 @@ public:
|
||||
virtual void write_get_static_variable(const Address &p_target, const Address &p_class, int p_index) override;
|
||||
virtual void write_assign(const Address &p_target, const Address &p_source) override;
|
||||
virtual void write_assign_with_conversion(const Address &p_target, const Address &p_source) override;
|
||||
virtual void write_assign_null(const Address &p_target) override;
|
||||
virtual void write_assign_true(const Address &p_target) override;
|
||||
virtual void write_assign_false(const Address &p_target) override;
|
||||
virtual void write_assign_default_parameter(const Address &p_dst, const Address &p_src, bool p_use_conversion) override;
|
||||
|
||||
Reference in New Issue
Block a user