summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2018-05-08 10:43:44 -0300
committerGitHub <noreply@github.com>2018-05-08 10:43:44 -0300
commit06f1d1ae23e9c14aa8882ab41330fbfbd2d3424c (patch)
treed17e25f9002671bc65d8199cd0a5b2771eded365
parent9dbfe5dc615f398577a926d400086b38de37051e (diff)
parenta01c33c9d05719d8c0c6b93b4072a64b013a73d3 (diff)
downloadredot-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.h28
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; \