Browse Source

Merge pull request #40670 from vnen/remove-multilevel-call

Remove multilevel calls
Rémi Verschelde 5 years ago
parent
commit
b2096ba53e

+ 0 - 93
core/object.cpp

@@ -680,84 +680,6 @@ Variant Object::_call_deferred_bind(const Variant **p_args, int p_argcount, Call
 	return Variant();
 	return Variant();
 }
 }
 
 
-#ifdef DEBUG_ENABLED
-static void _test_call_error(const StringName &p_func, const Callable::CallError &error) {
-	switch (error.error) {
-		case Callable::CallError::CALL_OK:
-		case Callable::CallError::CALL_ERROR_INVALID_METHOD:
-			break;
-		case Callable::CallError::CALL_ERROR_INVALID_ARGUMENT: {
-			ERR_FAIL_MSG("Error calling function: " + String(p_func) + " - Invalid type for argument " + itos(error.argument) + ", expected " + Variant::get_type_name(Variant::Type(error.expected)) + ".");
-			break;
-		}
-		case Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS: {
-			ERR_FAIL_MSG("Error calling function: " + String(p_func) + " - Too many arguments, expected " + itos(error.argument) + ".");
-			break;
-		}
-		case Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS: {
-			ERR_FAIL_MSG("Error calling function: " + String(p_func) + " - Too few arguments, expected " + itos(error.argument) + ".");
-			break;
-		}
-		case Callable::CallError::CALL_ERROR_INSTANCE_IS_NULL:
-			break;
-	}
-}
-#else
-
-#define _test_call_error(m_str, m_err)
-
-#endif
-
-void Object::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	if (p_method == CoreStringNames::get_singleton()->_free) {
-#ifdef DEBUG_ENABLED
-		ERR_FAIL_COND_MSG(Object::cast_to<Reference>(this), "Can't 'free' a reference.");
-
-		ERR_FAIL_COND_MSG(_lock_index.get() > 1, "Object is locked and can't be freed.");
-#endif
-
-		//must be here, must be before everything,
-		memdelete(this);
-		return;
-	}
-
-	//Variant ret;
-	OBJ_DEBUG_LOCK
-
-	Callable::CallError error;
-
-	if (script_instance) {
-		script_instance->call_multilevel(p_method, p_args, p_argcount);
-		//_test_call_error(p_method,error);
-	}
-
-	MethodBind *method = ClassDB::get_method(get_class_name(), p_method);
-
-	if (method) {
-		method->call(this, p_args, p_argcount, error);
-		_test_call_error(p_method, error);
-	}
-}
-
-void Object::call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	MethodBind *method = ClassDB::get_method(get_class_name(), p_method);
-
-	Callable::CallError error;
-	OBJ_DEBUG_LOCK
-
-	if (method) {
-		method->call(this, p_args, p_argcount, error);
-		_test_call_error(p_method, error);
-	}
-
-	//Variant ret;
-
-	if (script_instance) {
-		script_instance->call_multilevel_reversed(p_method, p_args, p_argcount);
-		//_test_call_error(p_method,error);
-	}
-}
-
 bool Object::has_method(const StringName &p_method) const {
 bool Object::has_method(const StringName &p_method) const {
 	if (p_method == CoreStringNames::get_singleton()->_free) {
 	if (p_method == CoreStringNames::get_singleton()->_free) {
 		return true;
 		return true;
@@ -820,21 +742,6 @@ Variant Object::call(const StringName &p_name, VARIANT_ARG_DECLARE) {
 	return ret;
 	return ret;
 }
 }
 
 
-void Object::call_multilevel(const StringName &p_name, VARIANT_ARG_DECLARE) {
-	VARIANT_ARGPTRS;
-
-	int argc = 0;
-	for (int i = 0; i < VARIANT_ARG_MAX; i++) {
-		if (argptr[i]->get_type() == Variant::NIL) {
-			break;
-		}
-		argc++;
-	}
-
-	//Callable::CallError error;
-	call_multilevel(p_name, argptr, argc);
-}
-
 Variant Object::call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
 Variant Object::call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
 	r_error.error = Callable::CallError::CALL_OK;
 	r_error.error = Callable::CallError::CALL_OK;
 
 

+ 0 - 3
core/object.h

@@ -655,10 +655,7 @@ public:
 	void get_method_list(List<MethodInfo> *p_list) const;
 	void get_method_list(List<MethodInfo> *p_list) const;
 	Variant callv(const StringName &p_method, const Array &p_args);
 	Variant callv(const StringName &p_method, const Array &p_args);
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
-	virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount);
-	virtual void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount);
 	Variant call(const StringName &p_name, VARIANT_ARG_LIST); // C++ helper
 	Variant call(const StringName &p_name, VARIANT_ARG_LIST); // C++ helper
-	void call_multilevel(const StringName &p_name, VARIANT_ARG_LIST); // C++ helper
 
 
 	void notification(int p_notification, bool p_reversed = false);
 	void notification(int p_notification, bool p_reversed = false);
 	String to_string();
 	String to_string();

+ 0 - 23
core/script_language.cpp

@@ -308,16 +308,6 @@ Variant ScriptInstance::call(const StringName &p_method, VARIANT_ARG_DECLARE) {
 	return call(p_method, argptr, argc, error);
 	return call(p_method, argptr, argc, error);
 }
 }
 
 
-void ScriptInstance::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	Callable::CallError ce;
-	call(p_method, p_args, p_argcount, ce); // script may not support multilevel calls
-}
-
-void ScriptInstance::call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	Callable::CallError ce;
-	call(p_method, p_args, p_argcount, ce); // script may not support multilevel calls
-}
-
 void ScriptInstance::property_set_fallback(const StringName &, const Variant &, bool *r_valid) {
 void ScriptInstance::property_set_fallback(const StringName &, const Variant &, bool *r_valid) {
 	if (r_valid) {
 	if (r_valid) {
 		*r_valid = false;
 		*r_valid = false;
@@ -331,19 +321,6 @@ Variant ScriptInstance::property_get_fallback(const StringName &, bool *r_valid)
 	return Variant();
 	return Variant();
 }
 }
 
 
-void ScriptInstance::call_multilevel(const StringName &p_method, VARIANT_ARG_DECLARE) {
-	VARIANT_ARGPTRS;
-	int argc = 0;
-	for (int i = 0; i < VARIANT_ARG_MAX; i++) {
-		if (argptr[i]->get_type() == Variant::NIL) {
-			break;
-		}
-		argc++;
-	}
-
-	call_multilevel(p_method, argptr, argc);
-}
-
 ScriptInstance::~ScriptInstance() {
 ScriptInstance::~ScriptInstance() {
 }
 }
 
 

+ 0 - 5
core/script_language.h

@@ -199,9 +199,6 @@ public:
 	virtual bool has_method(const StringName &p_method) const = 0;
 	virtual bool has_method(const StringName &p_method) const = 0;
 	virtual Variant call(const StringName &p_method, VARIANT_ARG_LIST);
 	virtual Variant call(const StringName &p_method, VARIANT_ARG_LIST);
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) = 0;
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) = 0;
-	virtual void call_multilevel(const StringName &p_method, VARIANT_ARG_LIST);
-	virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount);
-	virtual void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount);
 	virtual void notification(int p_notification) = 0;
 	virtual void notification(int p_notification) = 0;
 	virtual String to_string(bool *r_valid) {
 	virtual String to_string(bool *r_valid) {
 		if (r_valid) {
 		if (r_valid) {
@@ -428,8 +425,6 @@ public:
 		r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 		r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 		return Variant();
 		return Variant();
 	}
 	}
-	//virtual void call_multilevel(const StringName& p_method,VARIANT_ARG_LIST) { return Variant(); }
-	//virtual void call_multilevel(const StringName& p_method,const Variant** p_args,int p_argcount,Callable::CallError &r_error) { return Variant(); }
 	virtual void notification(int p_notification) {}
 	virtual void notification(int p_notification) {}
 
 
 	virtual Ref<Script> get_script() const { return script; }
 	virtual Ref<Script> get_script() const { return script; }

+ 2 - 26
modules/gdnative/nativescript/nativescript.cpp

@@ -991,7 +991,8 @@ void NativeScriptInstance::notification(int p_notification) {
 
 
 	Variant value = p_notification;
 	Variant value = p_notification;
 	const Variant *args[1] = { &value };
 	const Variant *args[1] = { &value };
-	call_multilevel("_notification", args, 1);
+	Callable::CallError error;
+	call("_notification", args, 1, error);
 }
 }
 
 
 String NativeScriptInstance::to_string(bool *r_valid) {
 String NativeScriptInstance::to_string(bool *r_valid) {
@@ -1087,31 +1088,6 @@ ScriptLanguage *NativeScriptInstance::get_language() {
 	return NativeScriptLanguage::get_singleton();
 	return NativeScriptLanguage::get_singleton();
 }
 }
 
 
-void NativeScriptInstance::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	NativeScriptDesc *script_data = GET_SCRIPT_DESC();
-
-	while (script_data) {
-		Map<StringName, NativeScriptDesc::Method>::Element *E = script_data->methods.find(p_method);
-		if (E) {
-			godot_variant res = E->get().method.method((godot_object *)owner,
-					E->get().method.method_data,
-					userdata,
-					p_argcount,
-					(godot_variant **)p_args);
-			godot_variant_destroy(&res);
-		}
-		script_data = script_data->base_data;
-	}
-}
-
-void NativeScriptInstance::call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	NativeScriptDesc *script_data = GET_SCRIPT_DESC();
-
-	if (script_data) {
-		_ml_call_reversed(script_data, p_method, p_args, p_argcount);
-	}
-}
-
 NativeScriptInstance::~NativeScriptInstance() {
 NativeScriptInstance::~NativeScriptInstance() {
 	NativeScriptDesc *script_data = GET_SCRIPT_DESC();
 	NativeScriptDesc *script_data = GET_SCRIPT_DESC();
 
 

+ 0 - 3
modules/gdnative/nativescript/nativescript.h

@@ -231,9 +231,6 @@ public:
 
 
 	virtual ScriptLanguage *get_language();
 	virtual ScriptLanguage *get_language();
 
 
-	virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount);
-	virtual void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount);
-
 	virtual void refcount_incremented();
 	virtual void refcount_incremented();
 	virtual bool refcount_decremented();
 	virtual bool refcount_decremented();
 
 

+ 0 - 6
modules/gdnative/pluginscript/pluginscript_instance.h

@@ -62,12 +62,6 @@ public:
 
 
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
 
 
-	// Rely on default implementations provided by ScriptInstance for the moment.
-	// Note that multilevel call could be removed in 3.0 release, so stay tuned
-	// (see https://godotengine.org/qa/9244/can-override-the-_ready-and-_process-functions-child-classes)
-	//virtual void call_multilevel(const StringName& p_method,const Variant** p_args,int p_argcount);
-	//virtual void call_multilevel_reversed(const StringName& p_method,const Variant** p_args,int p_argcount);
-
 	virtual void notification(int p_notification);
 	virtual void notification(int p_notification);
 
 
 	virtual Ref<Script> get_script() const;
 	virtual Ref<Script> get_script() const;

+ 0 - 33
modules/gdscript/gdscript.cpp

@@ -1309,39 +1309,6 @@ Variant GDScriptInstance::call(const StringName &p_method, const Variant **p_arg
 	return Variant();
 	return Variant();
 }
 }
 
 
-void GDScriptInstance::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	GDScript *sptr = script.ptr();
-	Callable::CallError ce;
-
-	while (sptr) {
-		Map<StringName, GDScriptFunction *>::Element *E = sptr->member_functions.find(p_method);
-		if (E) {
-			E->get()->call(this, p_args, p_argcount, ce);
-			return;
-		}
-		sptr = sptr->_base;
-	}
-}
-
-void GDScriptInstance::_ml_call_reversed(GDScript *sptr, const StringName &p_method, const Variant **p_args, int p_argcount) {
-	if (sptr->_base) {
-		_ml_call_reversed(sptr->_base, p_method, p_args, p_argcount);
-	}
-
-	Callable::CallError ce;
-
-	Map<StringName, GDScriptFunction *>::Element *E = sptr->member_functions.find(p_method);
-	if (E) {
-		E->get()->call(this, p_args, p_argcount, ce);
-	}
-}
-
-void GDScriptInstance::call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	if (script.ptr()) {
-		_ml_call_reversed(script.ptr(), p_method, p_args, p_argcount);
-	}
-}
-
 void GDScriptInstance::notification(int p_notification) {
 void GDScriptInstance::notification(int p_notification) {
 	//notification is not virtual, it gets called at ALL levels just like in C.
 	//notification is not virtual, it gets called at ALL levels just like in C.
 	Variant value = p_notification;
 	Variant value = p_notification;

+ 0 - 5
modules/gdscript/gdscript.h

@@ -146,7 +146,6 @@ protected:
 	void _get_property_list(List<PropertyInfo> *p_properties) const;
 	void _get_property_list(List<PropertyInfo> *p_properties) const;
 
 
 	Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;
 	Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;
-	//void call_multilevel(const StringName& p_method,const Variant** p_args,int p_argcount);
 
 
 	static void _bind_methods();
 	static void _bind_methods();
 
 
@@ -258,8 +257,6 @@ class GDScriptInstance : public ScriptInstance {
 
 
 	SelfList<GDScriptFunctionState>::List pending_func_states;
 	SelfList<GDScriptFunctionState>::List pending_func_states;
 
 
-	void _ml_call_reversed(GDScript *sptr, const StringName &p_method, const Variant **p_args, int p_argcount);
-
 public:
 public:
 	virtual Object *get_owner() { return owner; }
 	virtual Object *get_owner() { return owner; }
 
 
@@ -271,8 +268,6 @@ public:
 	virtual void get_method_list(List<MethodInfo> *p_list) const;
 	virtual void get_method_list(List<MethodInfo> *p_list) const;
 	virtual bool has_method(const StringName &p_method) const;
 	virtual bool has_method(const StringName &p_method) const;
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
 	virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error);
-	virtual void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount);
-	virtual void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount);
 
 
 	Variant debug_get_member_by_index(int p_idx) const { return members[p_idx]; }
 	Variant debug_get_member_by_index(int p_idx) const { return members[p_idx]; }
 
 

+ 2 - 37
modules/mono/csharp_script.cpp

@@ -897,7 +897,7 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
 
 
 			// Call OnBeforeSerialize
 			// Call OnBeforeSerialize
 			if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener))) {
 			if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener))) {
-				obj->get_script_instance()->call_multilevel(string_names.on_before_serialize);
+				obj->get_script_instance()->call(string_names.on_before_serialize);
 			}
 			}
 
 
 			// Save instance info
 			// Save instance info
@@ -1133,7 +1133,7 @@ void CSharpLanguage::reload_assemblies(bool p_soft_reload) {
 
 
 				// Call OnAfterDeserialization
 				// Call OnAfterDeserialization
 				if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener))) {
 				if (csi->script->script_class->implements_interface(CACHED_CLASS(ISerializationListener))) {
-					obj->get_script_instance()->call_multilevel(string_names.on_after_deserialize);
+					obj->get_script_instance()->call(string_names.on_after_deserialize);
 				}
 				}
 			}
 			}
 		}
 		}
@@ -1866,41 +1866,6 @@ Variant CSharpInstance::call(const StringName &p_method, const Variant **p_args,
 	return Variant();
 	return Variant();
 }
 }
 
 
-void CSharpInstance::call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	GD_MONO_SCOPE_THREAD_ATTACH;
-
-	if (script.is_valid()) {
-		MonoObject *mono_object = get_mono_object();
-
-		ERR_FAIL_NULL(mono_object);
-
-		_call_multilevel(mono_object, p_method, p_args, p_argcount);
-	}
-}
-
-void CSharpInstance::_call_multilevel(MonoObject *p_mono_object, const StringName &p_method, const Variant **p_args, int p_argcount) {
-	GD_MONO_ASSERT_THREAD_ATTACHED;
-
-	GDMonoClass *top = script->script_class;
-
-	while (top && top != script->native) {
-		GDMonoMethod *method = top->get_method(p_method, p_argcount);
-
-		if (method) {
-			method->invoke(p_mono_object, p_args);
-			return;
-		}
-
-		top = top->get_parent_class();
-	}
-}
-
-void CSharpInstance::call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) {
-	// Sorry, the method is the one that controls the call order
-
-	call_multilevel(p_method, p_args, p_argcount);
-}
-
 bool CSharpInstance::_reference_owner_unsafe() {
 bool CSharpInstance::_reference_owner_unsafe() {
 #ifdef DEBUG_ENABLED
 #ifdef DEBUG_ENABLED
 	CRASH_COND(!base_ref);
 	CRASH_COND(!base_ref);

+ 0 - 4
modules/mono/csharp_script.h

@@ -265,8 +265,6 @@ class CSharpInstance : public ScriptInstance {
 	friend void GDMonoInternals::tie_managed_to_unmanaged(MonoObject *, Object *);
 	friend void GDMonoInternals::tie_managed_to_unmanaged(MonoObject *, Object *);
 	static CSharpInstance *create_for_managed_type(Object *p_owner, CSharpScript *p_script, const MonoGCHandleData &p_gchandle);
 	static CSharpInstance *create_for_managed_type(Object *p_owner, CSharpScript *p_script, const MonoGCHandleData &p_gchandle);
 
 
-	void _call_multilevel(MonoObject *p_mono_object, const StringName &p_method, const Variant **p_args, int p_argcount);
-
 	void get_properties_state_for_reloading(List<Pair<StringName, Variant>> &r_state);
 	void get_properties_state_for_reloading(List<Pair<StringName, Variant>> &r_state);
 	void get_event_signals_state_for_reloading(List<Pair<StringName, Array>> &r_state);
 	void get_event_signals_state_for_reloading(List<Pair<StringName, Array>> &r_state);
 
 
@@ -285,8 +283,6 @@ public:
 	/* TODO */ void get_method_list(List<MethodInfo> *p_list) const override {}
 	/* TODO */ void get_method_list(List<MethodInfo> *p_list) const override {}
 	bool has_method(const StringName &p_method) const override;
 	bool has_method(const StringName &p_method) const override;
 	Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;
 	Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;
-	void call_multilevel(const StringName &p_method, const Variant **p_args, int p_argcount) override;
-	void call_multilevel_reversed(const StringName &p_method, const Variant **p_args, int p_argcount) override;
 
 
 	void mono_object_disposed(MonoObject *p_obj);
 	void mono_object_disposed(MonoObject *p_obj);
 
 

+ 2 - 2
scene/3d/node_3d.cpp

@@ -174,7 +174,7 @@ void Node3D::_notification(int p_what) {
 			ERR_FAIL_COND(!data.viewport);
 			ERR_FAIL_COND(!data.viewport);
 
 
 			if (get_script_instance()) {
 			if (get_script_instance()) {
-				get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_enter_world, nullptr, 0);
+				get_script_instance()->call(SceneStringNames::get_singleton()->_enter_world);
 			}
 			}
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 			if (Engine::get_singleton()->is_editor_hint() && get_tree()->is_node_being_edited(this)) {
 			if (Engine::get_singleton()->is_editor_hint() && get_tree()->is_node_being_edited(this)) {
@@ -202,7 +202,7 @@ void Node3D::_notification(int p_what) {
 #endif
 #endif
 
 
 			if (get_script_instance()) {
 			if (get_script_instance()) {
-				get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_exit_world, nullptr, 0);
+				get_script_instance()->call(SceneStringNames::get_singleton()->_exit_world);
 			}
 			}
 
 
 			data.viewport = nullptr;
 			data.viewport = nullptr;

+ 1 - 1
scene/main/canvas_item.cpp

@@ -434,7 +434,7 @@ void CanvasItem::_update_callback() {
 		notification(NOTIFICATION_DRAW);
 		notification(NOTIFICATION_DRAW);
 		emit_signal(SceneStringNames::get_singleton()->draw);
 		emit_signal(SceneStringNames::get_singleton()->draw);
 		if (get_script_instance()) {
 		if (get_script_instance()) {
-			get_script_instance()->call_multilevel_reversed(SceneStringNames::get_singleton()->_draw, nullptr, 0);
+			get_script_instance()->call(SceneStringNames::get_singleton()->_draw);
 		}
 		}
 		current_item_drawn = nullptr;
 		current_item_drawn = nullptr;
 		drawing = false;
 		drawing = false;

+ 5 - 7
scene/main/node.cpp

@@ -55,15 +55,13 @@ void Node::_notification(int p_notification) {
 		case NOTIFICATION_PROCESS: {
 		case NOTIFICATION_PROCESS: {
 			if (get_script_instance()) {
 			if (get_script_instance()) {
 				Variant time = get_process_delta_time();
 				Variant time = get_process_delta_time();
-				const Variant *ptr[1] = { &time };
-				get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_process, ptr, 1);
+				get_script_instance()->call(SceneStringNames::get_singleton()->_process, time);
 			}
 			}
 		} break;
 		} break;
 		case NOTIFICATION_PHYSICS_PROCESS: {
 		case NOTIFICATION_PHYSICS_PROCESS: {
 			if (get_script_instance()) {
 			if (get_script_instance()) {
 				Variant time = get_physics_process_delta_time();
 				Variant time = get_physics_process_delta_time();
-				const Variant *ptr[1] = { &time };
-				get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_physics_process, ptr, 1);
+				get_script_instance()->call(SceneStringNames::get_singleton()->_physics_process, time);
 			}
 			}
 
 
 		} break;
 		} break;
@@ -146,7 +144,7 @@ void Node::_notification(int p_notification) {
 					set_physics_process(true);
 					set_physics_process(true);
 				}
 				}
 
 
-				get_script_instance()->call_multilevel_reversed(SceneStringNames::get_singleton()->_ready, nullptr, 0);
+				get_script_instance()->call(SceneStringNames::get_singleton()->_ready);
 			}
 			}
 
 
 		} break;
 		} break;
@@ -216,7 +214,7 @@ void Node::_propagate_enter_tree() {
 	notification(NOTIFICATION_ENTER_TREE);
 	notification(NOTIFICATION_ENTER_TREE);
 
 
 	if (get_script_instance()) {
 	if (get_script_instance()) {
-		get_script_instance()->call_multilevel_reversed(SceneStringNames::get_singleton()->_enter_tree, nullptr, 0);
+		get_script_instance()->call(SceneStringNames::get_singleton()->_enter_tree);
 	}
 	}
 
 
 	emit_signal(SceneStringNames::get_singleton()->tree_entered);
 	emit_signal(SceneStringNames::get_singleton()->tree_entered);
@@ -264,7 +262,7 @@ void Node::_propagate_exit_tree() {
 	data.blocked--;
 	data.blocked--;
 
 
 	if (get_script_instance()) {
 	if (get_script_instance()) {
-		get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_exit_tree, nullptr, 0);
+		get_script_instance()->call(SceneStringNames::get_singleton()->_exit_tree);
 	}
 	}
 	emit_signal(SceneStringNames::get_singleton()->tree_exiting);
 	emit_signal(SceneStringNames::get_singleton()->tree_exiting);
 
 

+ 3 - 11
scene/main/scene_tree.cpp

@@ -250,11 +250,7 @@ void SceneTree::call_group_flags(uint32_t p_call_flags, const StringName &p_grou
 			}
 			}
 
 
 			if (p_call_flags & GROUP_CALL_REALTIME) {
 			if (p_call_flags & GROUP_CALL_REALTIME) {
-				if (p_call_flags & GROUP_CALL_MULTILEVEL) {
-					nodes[i]->call_multilevel(p_function, VARIANT_ARG_PASS);
-				} else {
-					nodes[i]->call(p_function, VARIANT_ARG_PASS);
-				}
+				nodes[i]->call(p_function, VARIANT_ARG_PASS);
 			} else {
 			} else {
 				MessageQueue::get_singleton()->push_call(nodes[i], p_function, VARIANT_ARG_PASS);
 				MessageQueue::get_singleton()->push_call(nodes[i], p_function, VARIANT_ARG_PASS);
 			}
 			}
@@ -267,11 +263,7 @@ void SceneTree::call_group_flags(uint32_t p_call_flags, const StringName &p_grou
 			}
 			}
 
 
 			if (p_call_flags & GROUP_CALL_REALTIME) {
 			if (p_call_flags & GROUP_CALL_REALTIME) {
-				if (p_call_flags & GROUP_CALL_MULTILEVEL) {
-					nodes[i]->call_multilevel(p_function, VARIANT_ARG_PASS);
-				} else {
-					nodes[i]->call(p_function, VARIANT_ARG_PASS);
-				}
+				nodes[i]->call(p_function, VARIANT_ARG_PASS);
 			} else {
 			} else {
 				MessageQueue::get_singleton()->push_call(nodes[i], p_function, VARIANT_ARG_PASS);
 				MessageQueue::get_singleton()->push_call(nodes[i], p_function, VARIANT_ARG_PASS);
 			}
 			}
@@ -883,7 +875,7 @@ void SceneTree::_call_input_pause(const StringName &p_group, const StringName &p
 			continue;
 			continue;
 		}
 		}
 
 
-		n->call_multilevel(p_method, (const Variant **)v, 1);
+		n->call(p_method, (const Variant **)v, 1);
 		//ERR_FAIL_COND(node_count != g.nodes.size());
 		//ERR_FAIL_COND(node_count != g.nodes.size());
 	}
 	}
 
 

+ 0 - 1
scene/main/scene_tree.h

@@ -223,7 +223,6 @@ public:
 		GROUP_CALL_REVERSE = 1,
 		GROUP_CALL_REVERSE = 1,
 		GROUP_CALL_REALTIME = 2,
 		GROUP_CALL_REALTIME = 2,
 		GROUP_CALL_UNIQUE = 4,
 		GROUP_CALL_UNIQUE = 4,
-		GROUP_CALL_MULTILEVEL = 8,
 	};
 	};
 
 
 	_FORCE_INLINE_ Window *get_root() const { return root; }
 	_FORCE_INLINE_ Window *get_root() const { return root; }

+ 4 - 4
scene/main/viewport.cpp

@@ -1607,7 +1607,7 @@ void Viewport::_gui_call_input(Control *p_control, const Ref<InputEvent> &p_inpu
 			}
 			}
 
 
 			if (control->data.mouse_filter != Control::MOUSE_FILTER_IGNORE) {
 			if (control->data.mouse_filter != Control::MOUSE_FILTER_IGNORE) {
-				control->call_multilevel(SceneStringNames::get_singleton()->_gui_input, ev);
+				control->call(SceneStringNames::get_singleton()->_gui_input, ev);
 			}
 			}
 
 
 			if (!control->is_inside_tree() || control->is_set_as_toplevel()) {
 			if (!control->is_inside_tree() || control->is_set_as_toplevel()) {
@@ -2306,7 +2306,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
 		if (gui.key_focus) {
 		if (gui.key_focus) {
 			gui.key_event_accepted = false;
 			gui.key_event_accepted = false;
 			if (gui.key_focus->can_process()) {
 			if (gui.key_focus->can_process()) {
-				gui.key_focus->call_multilevel(SceneStringNames::get_singleton()->_gui_input, p_event);
+				gui.key_focus->call(SceneStringNames::get_singleton()->_gui_input, p_event);
 				if (gui.key_focus) { //maybe lost it
 				if (gui.key_focus) { //maybe lost it
 					gui.key_focus->emit_signal(SceneStringNames::get_singleton()->gui_input, p_event);
 					gui.key_focus->emit_signal(SceneStringNames::get_singleton()->gui_input, p_event);
 				}
 				}
@@ -2516,7 +2516,7 @@ void Viewport::_drop_mouse_focus() {
 			mb->set_global_position(c->get_local_mouse_position());
 			mb->set_global_position(c->get_local_mouse_position());
 			mb->set_button_index(i + 1);
 			mb->set_button_index(i + 1);
 			mb->set_pressed(false);
 			mb->set_pressed(false);
-			c->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb);
+			c->call(SceneStringNames::get_singleton()->_gui_input, mb);
 		}
 		}
 	}
 	}
 }
 }
@@ -2581,7 +2581,7 @@ void Viewport::_post_gui_grab_click_focus() {
 				mb->set_position(click);
 				mb->set_position(click);
 				mb->set_button_index(i + 1);
 				mb->set_button_index(i + 1);
 				mb->set_pressed(false);
 				mb->set_pressed(false);
-				gui.mouse_focus->call_multilevel(SceneStringNames::get_singleton()->_gui_input, mb);
+				gui.mouse_focus->call(SceneStringNames::get_singleton()->_gui_input, mb);
 			}
 			}
 		}
 		}