diff options
Diffstat (limited to 'core/object.cpp')
| -rw-r--r-- | core/object.cpp | 70 | 
1 files changed, 38 insertions, 32 deletions
diff --git a/core/object.cpp b/core/object.cpp index 54a9bb0d7c..f860423a27 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -703,40 +703,38 @@ Variant Object::_call_deferred_bind(const Variant **p_args, int p_argcount, Vari  }  #ifdef DEBUG_ENABLED -static bool _test_call_error(const StringName &p_func, const Variant::CallError &error) { +static void _test_call_error(const StringName &p_func, const Variant::CallError &error) {  	switch (error.error) {  		case Variant::CallError::CALL_OK: -			return true;  		case Variant::CallError::CALL_ERROR_INVALID_METHOD: -			return false; +			break;  		case Variant::CallError::CALL_ERROR_INVALID_ARGUMENT: {  			ERR_EXPLAIN("Error Calling Function: " + String(p_func) + " - Invalid type for argument " + itos(error.argument) + ", expected " + Variant::get_type_name(error.expected)); -			ERR_FAIL_V(true); -		} break; +			ERR_FAIL(); +			break; +		}  		case Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS: {  			ERR_EXPLAIN("Error Calling Function: " + String(p_func) + " - Too many arguments, expected " + itos(error.argument)); -			ERR_FAIL_V(true); - -		} break; +			ERR_FAIL(); +			break; +		}  		case Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS: {  			ERR_EXPLAIN("Error Calling Function: " + String(p_func) + " - Too few arguments, expected " + itos(error.argument)); -			ERR_FAIL_V(true); - -		} break; -		case Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL: { -		} //? +			ERR_FAIL(); +			break; +		} +		case Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL: +			break;  	} - -	return true;  }  #else -#define _test_call_error(m_str, m_err) ((m_err.error == Variant::CallError::CALL_ERROR_INVALID_METHOD) ? false : true) +#define _test_call_error(m_str, m_err)  #endif @@ -834,23 +832,22 @@ void Object::setvar(const Variant &p_key, const Variant &p_value, bool *r_valid)  }  Variant Object::callv(const StringName &p_method, const Array &p_args) { +	const Variant **argptrs = NULL; -	if (p_args.size() == 0) { -		return call(p_method); -	} - -	Vector<Variant> args; -	args.resize(p_args.size()); -	Vector<const Variant *> argptrs; -	argptrs.resize(p_args.size()); - -	for (int i = 0; i < p_args.size(); i++) { -		args.write[i] = p_args[i]; -		argptrs.write[i] = &args[i]; +	if (p_args.size() > 0) { +		argptrs = (const Variant **)alloca(sizeof(Variant *) * p_args.size()); +		for (int i = 0; i < p_args.size(); i++) { +			argptrs[i] = &p_args[i]; +		}  	}  	Variant::CallError ce; -	return call(p_method, (const Variant **)argptrs.ptr(), p_args.size(), ce); +	Variant ret = call(p_method, argptrs, p_args.size(), ce); +	if (ce.error != Variant::CallError::CALL_OK) { +		ERR_EXPLAIN("Error calling method from 'callv': " + Variant::get_call_error_text(this, p_method, argptrs, p_args.size(), ce)); +		ERR_FAIL_V(Variant()); +	} +	return ret;  }  Variant Object::call(const StringName &p_name, VARIANT_ARG_DECLARE) { @@ -1016,7 +1013,7 @@ void Object::set_script(const RefPtr &p_script) {  		}  	} -	_change_notify("script"); +	_change_notify(); //scripts may add variables, so refresh is desired  	emit_signal(CoreStringNames::get_singleton()->script_changed);  } @@ -1062,6 +1059,10 @@ Variant Object::get_meta(const String &p_name) const {  	return metadata[p_name];  } +void Object::remove_meta(const String &p_name) { +	metadata.erase(p_name); +} +  Array Object::_get_property_list_bind() const {  	List<PropertyInfo> lpi; @@ -1369,7 +1370,10 @@ Array Object::_get_incoming_connections() const {  void Object::get_signal_list(List<MethodInfo> *p_signals) const {  	if (!script.is_null()) { -		Ref<Script>(script)->get_script_signal_list(p_signals); +		Ref<Script> scr = script; +		if (scr.is_valid()) { +			scr->get_script_signal_list(p_signals); +		}  	}  	ClassDB::get_signal_list(get_class_name(), p_signals); @@ -1640,7 +1644,8 @@ void Object::_clear_internal_resource_paths(const Variant &p_var) {  				_clear_internal_resource_paths(d[E->get()]);  			}  		} break; -		default: {} +		default: { +		}  	}  } @@ -1690,6 +1695,7 @@ void Object::_bind_methods() {  	ClassDB::bind_method(D_METHOD("get_script"), &Object::get_script);  	ClassDB::bind_method(D_METHOD("set_meta", "name", "value"), &Object::set_meta); +	ClassDB::bind_method(D_METHOD("remove_meta", "name"), &Object::remove_meta);  	ClassDB::bind_method(D_METHOD("get_meta", "name"), &Object::get_meta);  	ClassDB::bind_method(D_METHOD("has_meta", "name"), &Object::has_meta);  	ClassDB::bind_method(D_METHOD("get_meta_list"), &Object::_get_meta_list_bind);  |