Merge pull request #89647 from AThousandShips/read_only_dict

[Core] Fix property access on read-only `Dictionary`
This commit is contained in:
Rémi Verschelde 2024-05-01 09:54:48 +02:00
commit 273a643145
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 23 additions and 7 deletions

View file

@ -251,15 +251,21 @@ void Variant::set_named(const StringName &p_member, const Variant &p_value, bool
return;
}
} else if (type == Variant::DICTIONARY) {
Variant *v = VariantGetInternalPtr<Dictionary>::get_ptr(this)->getptr(p_member);
if (v) {
*v = p_value;
r_valid = true;
} else {
VariantGetInternalPtr<Dictionary>::get_ptr(this)->operator[](p_member) = p_value;
r_valid = true;
Dictionary &dict = *VariantGetInternalPtr<Dictionary>::get_ptr(this);
if (dict.is_read_only()) {
r_valid = false;
return;
}
Variant *v = dict.getptr(p_member);
if (v) {
*v = p_value;
} else {
dict[p_member] = p_value;
}
r_valid = true;
} else {
r_valid = false;
}

View file

@ -0,0 +1,4 @@
func test():
var dictionary := { "a": 0 }
dictionary.make_read_only()
dictionary.a = 1

View file

@ -0,0 +1,6 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR
>> on function: test()
>> runtime/errors/read_only_dictionary.gd
>> 4
>> Invalid assignment of property or key 'a' with value of type 'int' on a base object of type 'Dictionary'.