Made bool constructor explicit in Variant to avoid bugs, fixes #7843
This commit is contained in:
parent
435bedd9ef
commit
a3a7fb83e6
5 changed files with 20 additions and 10 deletions
|
@ -1182,10 +1182,10 @@ Variant Object::_emit_signal(const Variant **p_args, int p_argcount, Variant::Ca
|
||||||
return Variant();
|
return Variant();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::emit_signal(const StringName &p_name, const Variant **p_args, int p_argcount) {
|
Error Object::emit_signal(const StringName &p_name, const Variant **p_args, int p_argcount) {
|
||||||
|
|
||||||
if (_block_signals)
|
if (_block_signals)
|
||||||
return; //no emit, signals blocked
|
return ERR_CANT_AQUIRE_RESOURCE; //no emit, signals blocked
|
||||||
|
|
||||||
Signal *s = signal_map.getptr(p_name);
|
Signal *s = signal_map.getptr(p_name);
|
||||||
if (!s) {
|
if (!s) {
|
||||||
|
@ -1194,11 +1194,11 @@ void Object::emit_signal(const StringName &p_name, const Variant **p_args, int p
|
||||||
//check in script
|
//check in script
|
||||||
if (!signal_is_valid && !script.is_null() && !Ref<Script>(script)->has_script_signal(p_name)) {
|
if (!signal_is_valid && !script.is_null() && !Ref<Script>(script)->has_script_signal(p_name)) {
|
||||||
ERR_EXPLAIN("Can't emit non-existing signal " + String("\"") + p_name + "\".");
|
ERR_EXPLAIN("Can't emit non-existing signal " + String("\"") + p_name + "\".");
|
||||||
ERR_FAIL();
|
ERR_FAIL_V(ERR_UNAVAILABLE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
//not connected? just return
|
//not connected? just return
|
||||||
return;
|
return ERR_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<_ObjectSignalDisconnectData> disconnect_data;
|
List<_ObjectSignalDisconnectData> disconnect_data;
|
||||||
|
@ -1214,6 +1214,8 @@ void Object::emit_signal(const StringName &p_name, const Variant **p_args, int p
|
||||||
|
|
||||||
Vector<const Variant *> bind_mem;
|
Vector<const Variant *> bind_mem;
|
||||||
|
|
||||||
|
Error err = OK;
|
||||||
|
|
||||||
for (int i = 0; i < ssize; i++) {
|
for (int i = 0; i < ssize; i++) {
|
||||||
|
|
||||||
const Connection &c = slot_map.getv(i).conn;
|
const Connection &c = slot_map.getv(i).conn;
|
||||||
|
@ -1249,12 +1251,14 @@ void Object::emit_signal(const StringName &p_name, const Variant **p_args, int p
|
||||||
} else {
|
} else {
|
||||||
Variant::CallError ce;
|
Variant::CallError ce;
|
||||||
target->call(c.method, args, argc, ce);
|
target->call(c.method, args, argc, ce);
|
||||||
|
|
||||||
if (ce.error != Variant::CallError::CALL_OK) {
|
if (ce.error != Variant::CallError::CALL_OK) {
|
||||||
|
|
||||||
if (ce.error == Variant::CallError::CALL_ERROR_INVALID_METHOD && !ClassDB::class_exists(target->get_class_name())) {
|
if (ce.error == Variant::CallError::CALL_ERROR_INVALID_METHOD && !ClassDB::class_exists(target->get_class_name())) {
|
||||||
//most likely object is not initialized yet, do not throw error.
|
//most likely object is not initialized yet, do not throw error.
|
||||||
} else {
|
} else {
|
||||||
ERR_PRINTS("Error calling method from signal '" + String(p_name) + "': " + Variant::get_call_error_text(target, c.method, args, argc, ce));
|
ERR_PRINTS("Error calling method from signal '" + String(p_name) + "': " + Variant::get_call_error_text(target, c.method, args, argc, ce));
|
||||||
|
err = ERR_METHOD_NOT_FOUND;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1274,21 +1278,24 @@ void Object::emit_signal(const StringName &p_name, const Variant **p_args, int p
|
||||||
disconnect(dd.signal, dd.target, dd.method);
|
disconnect(dd.signal, dd.target, dd.method);
|
||||||
disconnect_data.pop_front();
|
disconnect_data.pop_front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::emit_signal(const StringName &p_name, VARIANT_ARG_DECLARE) {
|
Error Object::emit_signal(const StringName &p_name, VARIANT_ARG_DECLARE) {
|
||||||
|
|
||||||
VARIANT_ARGPTRS;
|
VARIANT_ARGPTRS;
|
||||||
|
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
|
|
||||||
for (int i = 0; i < VARIANT_ARG_MAX; i++) {
|
for (int i = 0; i < VARIANT_ARG_MAX; i++) {
|
||||||
|
|
||||||
if (argptr[i]->get_type() == Variant::NIL)
|
if (argptr[i]->get_type() == Variant::NIL)
|
||||||
break;
|
break;
|
||||||
argc++;
|
argc++;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_signal(p_name, argptr, argc);
|
return emit_signal(p_name, argptr, argc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::_add_user_signal(const String &p_name, const Array &p_args) {
|
void Object::_add_user_signal(const String &p_name, const Array &p_args) {
|
||||||
|
|
|
@ -654,8 +654,8 @@ public:
|
||||||
void set_script_and_instance(const RefPtr &p_script, ScriptInstance *p_instance); //some script languages can't control instance creation, so this function eases the process
|
void set_script_and_instance(const RefPtr &p_script, ScriptInstance *p_instance); //some script languages can't control instance creation, so this function eases the process
|
||||||
|
|
||||||
void add_user_signal(const MethodInfo &p_signal);
|
void add_user_signal(const MethodInfo &p_signal);
|
||||||
void emit_signal(const StringName &p_name, VARIANT_ARG_LIST);
|
Error emit_signal(const StringName &p_name, VARIANT_ARG_LIST);
|
||||||
void emit_signal(const StringName &p_name, const Variant **p_args, int p_argcount);
|
Error emit_signal(const StringName &p_name, const Variant **p_args, int p_argcount);
|
||||||
void get_signal_list(List<MethodInfo> *p_signals) const;
|
void get_signal_list(List<MethodInfo> *p_signals) const;
|
||||||
void get_signal_connection_list(const StringName &p_signal, List<Connection> *p_connections) const;
|
void get_signal_connection_list(const StringName &p_signal, List<Connection> *p_connections) const;
|
||||||
void get_all_signal_connections(List<Connection> *p_connections) const;
|
void get_all_signal_connections(List<Connection> *p_connections) const;
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "core_string_names.h"
|
#include "core_string_names.h"
|
||||||
#include "io/resource_loader.h"
|
#include "io/resource_loader.h"
|
||||||
#include "os/file_access.h"
|
#include "os/file_access.h"
|
||||||
|
#include "scene/main/node.h" //only so casting works
|
||||||
#include "script_language.h"
|
#include "script_language.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,8 @@
|
||||||
#include "io/ip_address.h"
|
#include "io/ip_address.h"
|
||||||
#include "math_2d.h"
|
#include "math_2d.h"
|
||||||
#include "matrix3.h"
|
#include "matrix3.h"
|
||||||
#include "os/power.h"
|
|
||||||
#include "node_path.h"
|
#include "node_path.h"
|
||||||
|
#include "os/power.h"
|
||||||
#include "plane.h"
|
#include "plane.h"
|
||||||
#include "quat.h"
|
#include "quat.h"
|
||||||
#include "rect3.h"
|
#include "rect3.h"
|
||||||
|
@ -239,7 +239,7 @@ public:
|
||||||
|
|
||||||
operator IP_Address() const;
|
operator IP_Address() const;
|
||||||
|
|
||||||
Variant(bool p_bool);
|
explicit Variant(bool p_bool);
|
||||||
Variant(signed int p_int); // real one
|
Variant(signed int p_int); // real one
|
||||||
Variant(unsigned int p_int);
|
Variant(unsigned int p_int);
|
||||||
#ifdef NEED_LONG_INT
|
#ifdef NEED_LONG_INT
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
#include "visibility_notifier.h"
|
#include "visibility_notifier.h"
|
||||||
|
|
||||||
|
#include "scene/3d/camera.h"
|
||||||
#include "scene/3d/physics_body.h"
|
#include "scene/3d/physics_body.h"
|
||||||
#include "scene/animation/animation_player.h"
|
#include "scene/animation/animation_player.h"
|
||||||
#include "scene/scene_string_names.h"
|
#include "scene/scene_string_names.h"
|
||||||
|
@ -42,6 +43,7 @@ void VisibilityNotifier::_enter_camera(Camera *p_camera) {
|
||||||
emit_signal(SceneStringNames::get_singleton()->screen_entered);
|
emit_signal(SceneStringNames::get_singleton()->screen_entered);
|
||||||
_screen_enter();
|
_screen_enter();
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_signal(SceneStringNames::get_singleton()->camera_entered, p_camera);
|
emit_signal(SceneStringNames::get_singleton()->camera_entered, p_camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue