From cacced7e507f7603bacc03ae2616e58f0ede122a Mon Sep 17 00:00:00 2001 From: Hein-Pieter van Braam Date: Thu, 24 Aug 2017 22:58:51 +0200 Subject: Convert Object::cast_to() to the static version Currently we rely on some undefined behavior when Object->cast_to() gets called with a Null pointer. This used to work fine with GCC < 6 but newer versions of GCC remove all codepaths in which the this pointer is Null. However, the non-static cast_to() was supposed to be null safe. This patch makes cast_to() Null safe and removes the now redundant Null checks where they existed. It is explained in this article: https://www.viva64.com/en/b/0226/ --- scene/main/node.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'scene/main/node.cpp') diff --git a/scene/main/node.cpp b/scene/main/node.cpp index c850a5ae7..66d3ad22f 100755 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -194,7 +194,7 @@ void Node::_propagate_enter_tree() { data.depth = 1; } - data.viewport = cast_to(); + data.viewport = Object::cast_to(this); if (!data.viewport) data.viewport = data.parent->data.viewport; @@ -2160,9 +2160,9 @@ Node *Node::_duplicate(int p_flags) const { bool instanced = false; - if (cast_to()) { + if (Object::cast_to(this)) { - const InstancePlaceholder *ip = cast_to(); + const InstancePlaceholder *ip = Object::cast_to(this); InstancePlaceholder *nip = memnew(InstancePlaceholder); nip->set_instance_path(ip->get_instance_path()); node = nip; @@ -2180,7 +2180,7 @@ Node *Node::_duplicate(int p_flags) const { Object *obj = ClassDB::instance(get_class()); ERR_FAIL_COND_V(!obj, NULL); - node = obj->cast_to(); + node = Object::cast_to(obj); if (!node) memdelete(obj); ERR_FAIL_COND_V(!node, NULL); @@ -2270,7 +2270,7 @@ void Node::_duplicate_and_reown(Node *p_new_parent, const Map &p print_line("could not duplicate: " + String(get_class())); } ERR_FAIL_COND(!obj); - node = obj->cast_to(); + node = Object::cast_to(obj); if (!node) memdelete(obj); } @@ -2326,7 +2326,7 @@ void Node::_duplicate_signals(const Node *p_original, Node *p_copy) const { NodePath p = p_original->get_path_to(this); Node *copy = p_copy->get_node(p); - Node *target = E->get().target->cast_to(); + Node *target = Object::cast_to(E->get().target); if (!target) { continue; } @@ -2355,7 +2355,7 @@ Node *Node::duplicate_and_reown(const Map &p_reown_map) const { print_line("could not duplicate: " + String(get_class())); } ERR_FAIL_COND_V(!obj, NULL); - node = obj->cast_to(); + node = Object::cast_to(obj); if (!node) memdelete(obj); ERR_FAIL_COND_V(!node, NULL); @@ -2610,7 +2610,7 @@ void Node::_set_tree(SceneTree *p_tree) { static void _Node_debug_sn(Object *p_obj) { - Node *n = p_obj->cast_to(); + Node *n = Object::cast_to(p_obj); if (!n) return; -- cgit v1.2.3-70-g09d2