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/ --- editor/scene_tree_dock.cpp | 50 +++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 27 deletions(-) (limited to 'editor/scene_tree_dock.cpp') diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index e984098bd..62bc7e8be 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -775,7 +775,7 @@ void SceneTreeDock::_notification(int p_what) { break; first_enter = false; - CanvasItemEditorPlugin *canvas_item_plugin = editor_data->get_editor("2D")->cast_to(); + CanvasItemEditorPlugin *canvas_item_plugin = Object::cast_to(editor_data->get_editor("2D")); if (canvas_item_plugin) { canvas_item_plugin->get_canvas_item_editor()->connect("item_lock_status_changed", scene_tree, "_update_tree"); canvas_item_plugin->get_canvas_item_editor()->connect("item_group_status_changed", scene_tree, "_update_tree"); @@ -864,7 +864,7 @@ Node *SceneTreeDock::_duplicate(Node *p_node, Map &duplimap) { } else { Object *obj = ClassDB::instance(p_node->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); @@ -915,11 +915,7 @@ void SceneTreeDock::_set_owners(Node *p_owner, const Array &p_nodes) { for (int i = 0; i < p_nodes.size(); i++) { - Object *obj = p_nodes[i]; - if (!obj) - continue; - - Node *n = obj->cast_to(); + Node *n = Object::cast_to(p_nodes[i]); if (!n) continue; n->set_owner(p_owner); @@ -994,9 +990,9 @@ void SceneTreeDock::perform_node_renames(Node *p_base, Listcast_to()) { + if (Object::cast_to(p_base)) { - AnimationPlayer *ap = p_base->cast_to(); + AnimationPlayer *ap = Object::cast_to(p_base); List anims; ap->get_animation_list(&anims); Node *root = ap->get_node(ap->get_root()); @@ -1235,12 +1231,12 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V editor_data->get_undo_redo().add_undo_method(sed, "live_debug_reparent_node", NodePath(String(edited_scene->get_path_to(new_parent)) + "/" + new_name), edited_scene->get_path_to(node->get_parent()), node->get_name(), node->get_index()); if (p_keep_global_xform) { - if (node->cast_to()) - editor_data->get_undo_redo().add_do_method(node, "set_global_transform", node->cast_to()->get_global_transform()); - if (node->cast_to()) - editor_data->get_undo_redo().add_do_method(node, "set_global_transform", node->cast_to()->get_global_transform()); - if (node->cast_to()) - editor_data->get_undo_redo().add_do_method(node, "set_global_position", node->cast_to()->get_global_position()); + if (Object::cast_to(node)) + editor_data->get_undo_redo().add_do_method(node, "set_global_transform", Object::cast_to(node)->get_global_transform()); + if (Object::cast_to(node)) + editor_data->get_undo_redo().add_do_method(node, "set_global_transform", Object::cast_to(node)->get_global_transform()); + if (Object::cast_to(node)) + editor_data->get_undo_redo().add_do_method(node, "set_global_position", Object::cast_to(node)->get_global_position()); } editor_data->get_undo_redo().add_do_method(this, "_set_owners", edited_scene, owners); @@ -1277,12 +1273,12 @@ void SceneTreeDock::_do_reparent(Node *p_new_parent, int p_position_in_parent, V editor_data->get_undo_redo().add_undo_method(AnimationPlayerEditor::singleton->get_key_editor(), "set_root", node); if (p_keep_global_xform) { - if (node->cast_to()) - editor_data->get_undo_redo().add_undo_method(node, "set_transform", node->cast_to()->get_transform()); - if (node->cast_to()) - editor_data->get_undo_redo().add_undo_method(node, "set_transform", node->cast_to()->get_transform()); - if (node->cast_to()) - editor_data->get_undo_redo().add_undo_method(node, "set_position", node->cast_to()->get_position()); + if (Object::cast_to(node)) + editor_data->get_undo_redo().add_undo_method(node, "set_transform", Object::cast_to(node)->get_transform()); + if (Object::cast_to(node)) + editor_data->get_undo_redo().add_undo_method(node, "set_transform", Object::cast_to(node)->get_transform()); + if (Object::cast_to(node)) + editor_data->get_undo_redo().add_undo_method(node, "set_position", Object::cast_to(node)->get_position()); } } @@ -1421,7 +1417,7 @@ void SceneTreeDock::_create() { Object *c = create_dialog->instance_selected(); ERR_FAIL_COND(!c); - Node *child = c->cast_to(); + Node *child = Object::cast_to(c); ERR_FAIL_COND(!child); editor_data->get_undo_redo().create_action(TTR("Create Node")); @@ -1450,9 +1446,9 @@ void SceneTreeDock::_create() { editor_data->get_undo_redo().commit_action(); editor->push_item(c); - if (c->cast_to()) { + if (Object::cast_to(c)) { //make editor more comfortable, so some controls don't appear super shrunk - Control *ct = c->cast_to(); + Control *ct = Object::cast_to(c); Size2 ms = ct->get_minimum_size(); if (ms.width < 4) @@ -1469,7 +1465,7 @@ void SceneTreeDock::_create() { Object *c = create_dialog->instance_selected(); ERR_FAIL_COND(!c); - Node *newnode = c->cast_to(); + Node *newnode = Object::cast_to(c); ERR_FAIL_COND(!newnode); List pinfo; @@ -1931,10 +1927,10 @@ void SceneTreeDock::_focus_node() { ERR_FAIL_COND(!node); if (node->is_class("CanvasItem")) { - CanvasItemEditorPlugin *editor = editor_data->get_editor("2D")->cast_to(); + CanvasItemEditorPlugin *editor = Object::cast_to(editor_data->get_editor("2D")); editor->get_canvas_item_editor()->focus_selection(); } else { - SpatialEditorPlugin *editor = editor_data->get_editor("3D")->cast_to(); + SpatialEditorPlugin *editor = Object::cast_to(editor_data->get_editor("3D")); editor->get_spatial_editor()->get_editor_viewport(0)->focus_selection(); } } -- cgit v1.2.3-70-g09d2