mirror of
https://github.com/godotengine/godot.git
synced 2025-10-20 08:23:29 +00:00
Reworked signal connection system, added support for Callable and Signal objects and made them default.
This commit is contained in:
parent
1a4be2cd8f
commit
69c95f4b4c
275 changed files with 3831 additions and 2948 deletions
|
@ -160,11 +160,11 @@ static String _get_var_type(const Variant *p_var) {
|
|||
}
|
||||
#endif // DEBUG_ENABLED
|
||||
|
||||
String GDScriptFunction::_get_call_error(const Variant::CallError &p_err, const String &p_where, const Variant **argptrs) const {
|
||||
String GDScriptFunction::_get_call_error(const Callable::CallError &p_err, const String &p_where, const Variant **argptrs) const {
|
||||
|
||||
String err_text;
|
||||
|
||||
if (p_err.error == Variant::CallError::CALL_ERROR_INVALID_ARGUMENT) {
|
||||
if (p_err.error == Callable::CallError::CALL_ERROR_INVALID_ARGUMENT) {
|
||||
int errorarg = p_err.argument;
|
||||
// Handle the Object to Object case separately as we don't have further class details.
|
||||
#ifdef DEBUG_ENABLED
|
||||
|
@ -173,15 +173,15 @@ String GDScriptFunction::_get_call_error(const Variant::CallError &p_err, const
|
|||
} else
|
||||
#endif // DEBUG_ENABLED
|
||||
{
|
||||
err_text = "Invalid type in " + p_where + ". Cannot convert argument " + itos(errorarg + 1) + " from " + Variant::get_type_name(argptrs[errorarg]->get_type()) + " to " + Variant::get_type_name(p_err.expected) + ".";
|
||||
err_text = "Invalid type in " + p_where + ". Cannot convert argument " + itos(errorarg + 1) + " from " + Variant::get_type_name(argptrs[errorarg]->get_type()) + " to " + Variant::get_type_name(Variant::Type(p_err.expected)) + ".";
|
||||
}
|
||||
} else if (p_err.error == Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS) {
|
||||
} else if (p_err.error == Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS) {
|
||||
err_text = "Invalid call to " + p_where + ". Expected " + itos(p_err.argument) + " arguments.";
|
||||
} else if (p_err.error == Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS) {
|
||||
} else if (p_err.error == Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS) {
|
||||
err_text = "Invalid call to " + p_where + ". Expected " + itos(p_err.argument) + " arguments.";
|
||||
} else if (p_err.error == Variant::CallError::CALL_ERROR_INVALID_METHOD) {
|
||||
} else if (p_err.error == Callable::CallError::CALL_ERROR_INVALID_METHOD) {
|
||||
err_text = "Invalid call. Nonexistent " + p_where + ".";
|
||||
} else if (p_err.error == Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL) {
|
||||
} else if (p_err.error == Callable::CallError::CALL_ERROR_INSTANCE_IS_NULL) {
|
||||
err_text = "Attempt to call " + p_where + " on a null instance.";
|
||||
} else {
|
||||
err_text = "Bug, call error: #" + itos(p_err.error);
|
||||
|
@ -258,7 +258,7 @@ String GDScriptFunction::_get_call_error(const Variant::CallError &p_err, const
|
|||
#define OPCODE_OUT break
|
||||
#endif
|
||||
|
||||
Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_args, int p_argcount, Variant::CallError &r_err, CallState *p_state) {
|
||||
Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_args, int p_argcount, Callable::CallError &r_err, CallState *p_state) {
|
||||
|
||||
OPCODES_TABLE;
|
||||
|
||||
|
@ -267,7 +267,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
return Variant();
|
||||
}
|
||||
|
||||
r_err.error = Variant::CallError::CALL_OK;
|
||||
r_err.error = Callable::CallError::CALL_OK;
|
||||
|
||||
Variant self;
|
||||
Variant static_ref;
|
||||
|
@ -306,13 +306,13 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
|
||||
if (p_argcount > _argument_count) {
|
||||
|
||||
r_err.error = Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||
r_err.error = Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS;
|
||||
r_err.argument = _argument_count;
|
||||
|
||||
return Variant();
|
||||
} else if (p_argcount < _argument_count - _default_arg_count) {
|
||||
|
||||
r_err.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||
r_err.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||
r_err.argument = _argument_count - _default_arg_count;
|
||||
return Variant();
|
||||
} else {
|
||||
|
@ -341,7 +341,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
memnew_placement(&stack[i], Variant);
|
||||
continue;
|
||||
} else {
|
||||
r_err.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_err.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_err.argument = i;
|
||||
r_err.expected = argument_types[i].kind == GDScriptDataType::BUILTIN ? argument_types[i].builtin_type : Variant::OBJECT;
|
||||
return Variant();
|
||||
|
@ -792,7 +792,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
#ifdef DEBUG_ENABLED
|
||||
if (Variant::can_convert_strict(src->get_type(), var_type)) {
|
||||
#endif // DEBUG_ENABLED
|
||||
Variant::CallError ce;
|
||||
Callable::CallError ce;
|
||||
*dst = Variant::construct(var_type, const_cast<const Variant **>(&src), 1, ce);
|
||||
} else {
|
||||
#ifdef DEBUG_ENABLED
|
||||
|
@ -898,11 +898,11 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
|
||||
GD_ERR_BREAK(to_type < 0 || to_type >= Variant::VARIANT_MAX);
|
||||
|
||||
Variant::CallError err;
|
||||
Callable::CallError err;
|
||||
*dst = Variant::construct(to_type, (const Variant **)&src, 1, err);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (err.error != Variant::CallError::CALL_OK) {
|
||||
if (err.error != Callable::CallError::CALL_OK) {
|
||||
err_text = "Invalid cast: could not convert value to '" + Variant::get_type_name(to_type) + "'.";
|
||||
OPCODE_BREAK;
|
||||
}
|
||||
|
@ -1001,11 +1001,11 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
}
|
||||
|
||||
GET_VARIANT_PTR(dst, 3 + argc);
|
||||
Variant::CallError err;
|
||||
Callable::CallError err;
|
||||
*dst = Variant::construct(t, (const Variant **)argptrs, argc, err);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (err.error != Variant::CallError::CALL_OK) {
|
||||
if (err.error != Callable::CallError::CALL_OK) {
|
||||
|
||||
err_text = _get_call_error(err, "'" + Variant::get_type_name(t) + "' constructor", (const Variant **)argptrs);
|
||||
OPCODE_BREAK;
|
||||
|
@ -1092,7 +1092,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
}
|
||||
|
||||
#endif
|
||||
Variant::CallError err;
|
||||
Callable::CallError err;
|
||||
if (call_ret) {
|
||||
|
||||
GET_VARIANT_PTR(ret, argc);
|
||||
|
@ -1106,7 +1106,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
function_call_time += OS::get_singleton()->get_ticks_usec() - call_time;
|
||||
}
|
||||
|
||||
if (err.error != Variant::CallError::CALL_OK) {
|
||||
if (err.error != Callable::CallError::CALL_OK) {
|
||||
|
||||
String methodstr = *methodname;
|
||||
String basestr = _get_var_type(base);
|
||||
|
@ -1114,13 +1114,13 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
if (methodstr == "call") {
|
||||
if (argc >= 1) {
|
||||
methodstr = String(*argptrs[0]) + " (via call)";
|
||||
if (err.error == Variant::CallError::CALL_ERROR_INVALID_ARGUMENT) {
|
||||
if (err.error == Callable::CallError::CALL_ERROR_INVALID_ARGUMENT) {
|
||||
err.argument += 1;
|
||||
}
|
||||
}
|
||||
} else if (methodstr == "free") {
|
||||
|
||||
if (err.error == Variant::CallError::CALL_ERROR_INVALID_METHOD) {
|
||||
if (err.error == Callable::CallError::CALL_ERROR_INVALID_METHOD) {
|
||||
|
||||
if (base->is_ref()) {
|
||||
err_text = "Attempted to free a reference.";
|
||||
|
@ -1161,12 +1161,12 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
|
||||
GET_VARIANT_PTR(dst, argc);
|
||||
|
||||
Variant::CallError err;
|
||||
Callable::CallError err;
|
||||
|
||||
GDScriptFunctions::call(func, (const Variant **)argptrs, argc, *dst, err);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (err.error != Variant::CallError::CALL_OK) {
|
||||
if (err.error != Callable::CallError::CALL_OK) {
|
||||
|
||||
String methodstr = GDScriptFunctions::get_func_name(func);
|
||||
if (dst->get_type() == Variant::STRING) {
|
||||
|
@ -1224,7 +1224,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
break;
|
||||
}
|
||||
|
||||
Variant::CallError err;
|
||||
Callable::CallError err;
|
||||
|
||||
if (E) {
|
||||
|
||||
|
@ -1235,23 +1235,23 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
|
||||
MethodBind *mb = ClassDB::get_method(gds->native->get_name(), *methodname);
|
||||
if (!mb) {
|
||||
err.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
|
||||
err.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
|
||||
} else {
|
||||
*dst = mb->call(p_instance->owner, (const Variant **)argptrs, argc, err);
|
||||
}
|
||||
} else {
|
||||
err.error = Variant::CallError::CALL_OK;
|
||||
err.error = Callable::CallError::CALL_OK;
|
||||
}
|
||||
} else {
|
||||
|
||||
if (*methodname != GDScriptLanguage::get_singleton()->strings._init) {
|
||||
err.error = Variant::CallError::CALL_ERROR_INVALID_METHOD;
|
||||
err.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
|
||||
} else {
|
||||
err.error = Variant::CallError::CALL_OK;
|
||||
err.error = Callable::CallError::CALL_OK;
|
||||
}
|
||||
}
|
||||
|
||||
if (err.error != Variant::CallError::CALL_OK) {
|
||||
if (err.error != Callable::CallError::CALL_OK) {
|
||||
|
||||
String methodstr = *methodname;
|
||||
err_text = _get_call_error(err, "function '" + methodstr + "'", (const Variant **)argptrs);
|
||||
|
@ -1332,7 +1332,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
OPCODE_BREAK;
|
||||
}
|
||||
|
||||
Error err = obj->connect(signal, gdfs.ptr(), "_signal_callback", varray(gdfs), Object::CONNECT_ONESHOT);
|
||||
Error err = obj->connect_compat(signal, gdfs.ptr(), "_signal_callback", varray(gdfs), Object::CONNECT_ONESHOT);
|
||||
if (err != OK) {
|
||||
err_text = "Error connecting to signal: " + signal + " during yield().";
|
||||
OPCODE_BREAK;
|
||||
|
@ -1341,7 +1341,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
|||
Object *obj = argobj->operator Object *();
|
||||
String signal = argname->operator String();
|
||||
|
||||
obj->connect(signal, gdfs.ptr(), "_signal_callback", varray(gdfs), Object::CONNECT_ONESHOT);
|
||||
obj->connect_compat(signal, gdfs.ptr(), "_signal_callback", varray(gdfs), Object::CONNECT_ONESHOT);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1806,13 +1806,13 @@ GDScriptFunction::~GDScriptFunction() {
|
|||
|
||||
/////////////////////
|
||||
|
||||
Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_argcount, Variant::CallError &r_error) {
|
||||
Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_argcount, Callable::CallError &r_error) {
|
||||
|
||||
Variant arg;
|
||||
r_error.error = Variant::CallError::CALL_OK;
|
||||
r_error.error = Callable::CallError::CALL_OK;
|
||||
|
||||
if (p_argcount == 0) {
|
||||
r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||
r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS;
|
||||
r_error.argument = 1;
|
||||
return Variant();
|
||||
} else if (p_argcount == 1) {
|
||||
|
@ -1830,7 +1830,7 @@ Variant GDScriptFunctionState::_signal_callback(const Variant **p_args, int p_ar
|
|||
Ref<GDScriptFunctionState> self = *p_args[p_argcount - 1];
|
||||
|
||||
if (self.is_null()) {
|
||||
r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
|
||||
r_error.argument = p_argcount - 1;
|
||||
r_error.expected = Variant::OBJECT;
|
||||
return Variant();
|
||||
|
@ -1865,7 +1865,7 @@ Variant GDScriptFunctionState::resume(const Variant &p_arg) {
|
|||
}
|
||||
|
||||
state.result = p_arg;
|
||||
Variant::CallError err;
|
||||
Callable::CallError err;
|
||||
Variant ret = function->call(NULL, NULL, 0, err, &state);
|
||||
|
||||
bool completed = true;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue