diff options
author | Juan Linietsky <reduzio@gmail.com> | 2018-05-08 10:43:44 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-08 10:43:44 -0300 |
commit | 06f1d1ae23e9c14aa8882ab41330fbfbd2d3424c (patch) | |
tree | d17e25f9002671bc65d8199cd0a5b2771eded365 | |
parent | 9dbfe5dc615f398577a926d400086b38de37051e (diff) | |
parent | a01c33c9d05719d8c0c6b93b4072a64b013a73d3 (diff) | |
download | redot-engine-06f1d1ae23e9c14aa8882ab41330fbfbd2d3424c.tar.gz |
Merge pull request #15282 from poke1024/check-obj-class
Check implicit casts on object classes in bound method calls
-rw-r--r-- | core/method_bind.h | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/core/method_bind.h b/core/method_bind.h index e02d64c935..41b500c401 100644 --- a/core/method_bind.h +++ b/core/method_bind.h @@ -128,10 +128,36 @@ struct VariantCaster<const T &> { // Object enum casts must go here VARIANT_ENUM_CAST(Object::ConnectFlags); +template <typename T> +struct VariantObjectClassChecker { + static _FORCE_INLINE_ bool check(const Variant &p_variant) { + return true; + } +}; + +template <> +struct VariantObjectClassChecker<Node *> { + static _FORCE_INLINE_ bool check(const Variant &p_variant) { + Object *obj = p_variant; + Node *node = p_variant; + return node || !obj; + } +}; + +template <> +struct VariantObjectClassChecker<Control *> { + static _FORCE_INLINE_ bool check(const Variant &p_variant) { + Object *obj = p_variant; + Control *control = p_variant; + return control || !obj; + } +}; + #define CHECK_ARG(m_arg) \ if ((m_arg - 1) < p_arg_count) { \ Variant::Type argtype = get_argument_type(m_arg - 1); \ - if (!Variant::can_convert_strict(p_args[m_arg - 1]->get_type(), argtype)) { \ + if (!Variant::can_convert_strict(p_args[m_arg - 1]->get_type(), argtype) || \ + !VariantObjectClassChecker<P##m_arg>::check(*p_args[m_arg - 1])) { \ r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; \ r_error.argument = m_arg - 1; \ r_error.expected = argtype; \ |