diff options
Diffstat (limited to 'core/variant')
| -rw-r--r-- | core/variant/method_ptrcall.h | 10 | ||||
| -rw-r--r-- | core/variant/variant.cpp | 11 | ||||
| -rw-r--r-- | core/variant/variant.h | 1 | ||||
| -rw-r--r-- | core/variant/variant_call.cpp | 38 | ||||
| -rw-r--r-- | core/variant/variant_setget.cpp | 14 |
5 files changed, 61 insertions, 13 deletions
diff --git a/core/variant/method_ptrcall.h b/core/variant/method_ptrcall.h index 123f2067e2..c8d1241d3d 100644 --- a/core/variant/method_ptrcall.h +++ b/core/variant/method_ptrcall.h @@ -159,10 +159,7 @@ MAKE_PTRARG_BY_REFERENCE(Variant); template <typename T> struct PtrToArg<T *> { _FORCE_INLINE_ static T *convert(const void *p_ptr) { - if (p_ptr == nullptr) { - return nullptr; - } - return const_cast<T *>(*reinterpret_cast<T *const *>(p_ptr)); + return likely(p_ptr) ? const_cast<T *>(*reinterpret_cast<T *const *>(p_ptr)) : nullptr; } typedef Object *EncodeT; _FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) { @@ -173,10 +170,7 @@ struct PtrToArg<T *> { template <typename T> struct PtrToArg<const T *> { _FORCE_INLINE_ static const T *convert(const void *p_ptr) { - if (p_ptr == nullptr) { - return nullptr; - } - return *reinterpret_cast<T *const *>(p_ptr); + return likely(p_ptr) ? *reinterpret_cast<T *const *>(p_ptr) : nullptr; } typedef const Object *EncodeT; _FORCE_INLINE_ static void encode(T *p_var, void *p_ptr) { diff --git a/core/variant/variant.cpp b/core/variant/variant.cpp index fcbfdd4741..37eb16f9b2 100644 --- a/core/variant/variant.cpp +++ b/core/variant/variant.cpp @@ -3515,6 +3515,17 @@ bool Variant::is_shared() const { return is_type_shared(type); } +bool Variant::is_read_only() const { + switch (type) { + case ARRAY: + return reinterpret_cast<const Array *>(_data._mem)->is_read_only(); + case DICTIONARY: + return reinterpret_cast<const Dictionary *>(_data._mem)->is_read_only(); + default: + return false; + } +} + void Variant::_variant_call_error(const String &p_method, Callable::CallError &error) { switch (error.error) { case Callable::CallError::CALL_ERROR_INVALID_ARGUMENT: { diff --git a/core/variant/variant.h b/core/variant/variant.h index ea6ae02c1e..93953c4e0e 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -349,6 +349,7 @@ public: bool is_zero() const; bool is_one() const; bool is_null() const; + bool is_read_only() const; // Make sure Variant is not implicitly cast when accessing it with bracket notation (GH-49469). Variant &operator[](const Variant &p_key) = delete; diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index d0d940c47d..986b34c662 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -1804,7 +1804,13 @@ static void _register_variant_builtin_methods() { bind_method(Vector2, abs, sarray(), varray()); bind_method(Vector2, sign, sarray(), varray()); bind_method(Vector2, clamp, sarray("min", "max"), varray()); + bind_method(Vector2, clampf, sarray("min", "max"), varray()); bind_method(Vector2, snapped, sarray("step"), varray()); + bind_method(Vector2, snappedf, sarray("step"), varray()); + bind_method(Vector2, min, sarray("with"), varray()); + bind_method(Vector2, minf, sarray("with"), varray()); + bind_method(Vector2, max, sarray("with"), varray()); + bind_method(Vector2, maxf, sarray("with"), varray()); bind_static_method(Vector2, from_angle, sarray("angle"), varray()); @@ -1820,7 +1826,13 @@ static void _register_variant_builtin_methods() { bind_method(Vector2i, sign, sarray(), varray()); bind_method(Vector2i, abs, sarray(), varray()); bind_method(Vector2i, clamp, sarray("min", "max"), varray()); + bind_method(Vector2i, clampi, sarray("min", "max"), varray()); bind_method(Vector2i, snapped, sarray("step"), varray()); + bind_method(Vector2i, snappedi, sarray("step"), varray()); + bind_method(Vector2i, min, sarray("with"), varray()); + bind_method(Vector2i, mini, sarray("with"), varray()); + bind_method(Vector2i, max, sarray("with"), varray()); + bind_method(Vector2i, maxi, sarray("with"), varray()); /* Rect2 */ @@ -1875,7 +1887,9 @@ static void _register_variant_builtin_methods() { bind_method(Vector3, is_finite, sarray(), varray()); bind_method(Vector3, inverse, sarray(), varray()); bind_method(Vector3, clamp, sarray("min", "max"), varray()); + bind_method(Vector3, clampf, sarray("min", "max"), varray()); bind_method(Vector3, snapped, sarray("step"), varray()); + bind_method(Vector3, snappedf, sarray("step"), varray()); bind_method(Vector3, rotated, sarray("axis", "angle"), varray()); bind_method(Vector3, lerp, sarray("to", "weight"), varray()); bind_method(Vector3, slerp, sarray("to", "weight"), varray()); @@ -1896,9 +1910,13 @@ static void _register_variant_builtin_methods() { bind_method(Vector3, project, sarray("b"), varray()); bind_method(Vector3, slide, sarray("n"), varray()); bind_method(Vector3, bounce, sarray("n"), varray()); - bind_method(Vector3, reflect, sarray("direction"), varray()); + bind_method(Vector3, reflect, sarray("n"), varray()); bind_method(Vector3, sign, sarray(), varray()); bind_method(Vector3, octahedron_encode, sarray(), varray()); + bind_method(Vector3, min, sarray("with"), varray()); + bind_method(Vector3, minf, sarray("with"), varray()); + bind_method(Vector3, max, sarray("with"), varray()); + bind_method(Vector3, maxf, sarray("with"), varray()); bind_static_method(Vector3, octahedron_decode, sarray("uv"), varray()); /* Vector3i */ @@ -1912,7 +1930,13 @@ static void _register_variant_builtin_methods() { bind_method(Vector3i, sign, sarray(), varray()); bind_method(Vector3i, abs, sarray(), varray()); bind_method(Vector3i, clamp, sarray("min", "max"), varray()); + bind_method(Vector3i, clampi, sarray("min", "max"), varray()); bind_method(Vector3i, snapped, sarray("step"), varray()); + bind_method(Vector3i, snappedi, sarray("step"), varray()); + bind_method(Vector3i, min, sarray("with"), varray()); + bind_method(Vector3i, mini, sarray("with"), varray()); + bind_method(Vector3i, max, sarray("with"), varray()); + bind_method(Vector3i, maxi, sarray("with"), varray()); /* Vector4 */ @@ -1931,7 +1955,9 @@ static void _register_variant_builtin_methods() { bind_method(Vector4, posmod, sarray("mod"), varray()); bind_method(Vector4, posmodv, sarray("modv"), varray()); bind_method(Vector4, snapped, sarray("step"), varray()); + bind_method(Vector4, snappedf, sarray("step"), varray()); bind_method(Vector4, clamp, sarray("min", "max"), varray()); + bind_method(Vector4, clampf, sarray("min", "max"), varray()); bind_method(Vector4, normalized, sarray(), varray()); bind_method(Vector4, is_normalized, sarray(), varray()); bind_method(Vector4, direction_to, sarray("to"), varray()); @@ -1942,6 +1968,10 @@ static void _register_variant_builtin_methods() { bind_method(Vector4, is_equal_approx, sarray("to"), varray()); bind_method(Vector4, is_zero_approx, sarray(), varray()); bind_method(Vector4, is_finite, sarray(), varray()); + bind_method(Vector4, min, sarray("with"), varray()); + bind_method(Vector4, minf, sarray("with"), varray()); + bind_method(Vector4, max, sarray("with"), varray()); + bind_method(Vector4, maxf, sarray("with"), varray()); /* Vector4i */ @@ -1952,7 +1982,13 @@ static void _register_variant_builtin_methods() { bind_method(Vector4i, sign, sarray(), varray()); bind_method(Vector4i, abs, sarray(), varray()); bind_method(Vector4i, clamp, sarray("min", "max"), varray()); + bind_method(Vector4i, clampi, sarray("min", "max"), varray()); bind_method(Vector4i, snapped, sarray("step"), varray()); + bind_method(Vector4i, snappedi, sarray("step"), varray()); + bind_method(Vector4i, min, sarray("with"), varray()); + bind_method(Vector4i, mini, sarray("with"), varray()); + bind_method(Vector4i, max, sarray("with"), varray()); + bind_method(Vector4i, maxi, sarray("with"), varray()); bind_method(Vector4i, distance_to, sarray("to"), varray()); bind_method(Vector4i, distance_squared_to, sarray("to"), varray()); diff --git a/core/variant/variant_setget.cpp b/core/variant/variant_setget.cpp index 9d5ed22b1a..f49e9e54b3 100644 --- a/core/variant/variant_setget.cpp +++ b/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; } |
