Merge pull request #89647 from AThousandShips/read_only_dict
[Core] Fix property access on read-only `Dictionary`
This commit is contained in:
commit
273a643145
3 changed files with 23 additions and 7 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
func test():
|
||||
var dictionary := { "a": 0 }
|
||||
dictionary.make_read_only()
|
||||
dictionary.a = 1
|
|
@ -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'.
|
Loading…
Reference in a new issue