Переглянути джерело

[Core] Fix property access on read-only `Dictionary`

A Thousand Ships 1 рік тому
батько
коміт
ec29c3e784

+ 10 - 4
core/variant/variant_setget.cpp

@@ -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);
+		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;
-			r_valid = true;
 		} else {
-			VariantGetInternalPtr<Dictionary>::get_ptr(this)->operator[](p_member) = p_value;
-			r_valid = true;
+			dict[p_member] = p_value;
 		}
 
+		r_valid = true;
 	} else {
 		r_valid = false;
 	}

+ 4 - 0
modules/gdscript/tests/scripts/runtime/errors/read_only_dictionary.gd

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

+ 6 - 0
modules/gdscript/tests/scripts/runtime/errors/read_only_dictionary.out

@@ -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'.