diff options
-rw-r--r-- | core/error_macros.h | 21 | ||||
-rw-r--r-- | core/typedefs.h | 8 | ||||
-rw-r--r-- | core/variant.cpp | 4 | ||||
-rw-r--r-- | modules/gdscript/gd_function.cpp | 6 |
4 files changed, 24 insertions, 15 deletions
diff --git a/core/error_macros.h b/core/error_macros.h index 005b0e32a3..1fa7f2c134 100644 --- a/core/error_macros.h +++ b/core/error_macros.h @@ -30,6 +30,7 @@ #ifndef ERROR_MACROS_H #define ERROR_MACROS_H +#include "typedefs.h" /** * Error macros. Unlike exceptions and asserts, these macros try to mantain consistency and stability * inside the code. It is recommended to always return processable data, so in case of an error, the @@ -130,7 +131,7 @@ extern bool _err_error_exists; #define ERR_FAIL_INDEX(m_index, m_size) \ do { \ - if ((m_index) < 0 || (m_index) >= (m_size)) { \ + if (unlikely((m_index) < 0 || (m_index) >= (m_size))) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Index " _STR(m_index) " out of size (" _STR(m_size) ")."); \ return; \ } else \ @@ -144,7 +145,7 @@ extern bool _err_error_exists; #define ERR_FAIL_INDEX_V(m_index, m_size, m_retval) \ do { \ - if ((m_index) < 0 || (m_index) >= (m_size)) { \ + if (unlikely((m_index) < 0 || (m_index) >= (m_size))) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Index " _STR(m_index) " out of size (" _STR(m_size) ")."); \ return m_retval; \ } else \ @@ -156,7 +157,7 @@ extern bool _err_error_exists; */ #define CRASH_BAD_INDEX(m_index, m_size) \ do { \ - if ((m_index) < 0 || (m_index) >= (m_size)) { \ + if (unlikely((m_index) < 0 || (m_index) >= (m_size))) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "FATAL: Index " _STR(m_index) " out of size (" _STR(m_size) ")."); \ GENERATE_TRAP \ } \ @@ -168,7 +169,7 @@ extern bool _err_error_exists; #define ERR_FAIL_NULL(m_param) \ { \ - if (!m_param) { \ + if (unlikely(!m_param)) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Parameter ' " _STR(m_param) " ' is null."); \ return; \ } else \ @@ -177,7 +178,7 @@ extern bool _err_error_exists; #define ERR_FAIL_NULL_V(m_param, m_retval) \ { \ - if (!m_param) { \ + if (unlikely(!m_param)) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Parameter ' " _STR(m_param) " ' is null."); \ return m_retval; \ } else \ @@ -190,7 +191,7 @@ extern bool _err_error_exists; #define ERR_FAIL_COND(m_cond) \ { \ - if (m_cond) { \ + if (unlikely(m_cond)) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Condition ' " _STR(m_cond) " ' is true."); \ return; \ } else \ @@ -202,7 +203,7 @@ extern bool _err_error_exists; #define CRASH_COND(m_cond) \ { \ - if (m_cond) { \ + if (unlikely(m_cond)) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "FATAL: Condition ' " _STR(m_cond) " ' is true."); \ GENERATE_TRAP \ } \ @@ -216,7 +217,7 @@ extern bool _err_error_exists; #define ERR_FAIL_COND_V(m_cond, m_retval) \ { \ - if (m_cond) { \ + if (unlikely(m_cond)) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Condition ' " _STR(m_cond) " ' is true. returned: " _STR(m_retval)); \ return m_retval; \ } else \ @@ -229,7 +230,7 @@ extern bool _err_error_exists; #define ERR_CONTINUE(m_cond) \ { \ - if (m_cond) { \ + if (unlikely(m_cond)) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Condition ' " _STR(m_cond) " ' is true. Continuing..:"); \ continue; \ } else \ @@ -242,7 +243,7 @@ extern bool _err_error_exists; #define ERR_BREAK(m_cond) \ { \ - if (m_cond) { \ + if (unlikely(m_cond)) { \ _err_print_error(FUNCTION_STR, __FILE__, __LINE__, "Condition ' " _STR(m_cond) " ' is true. Breaking..:"); \ break; \ } else \ diff --git a/core/typedefs.h b/core/typedefs.h index 565e28020b..bf5c8b0f75 100644 --- a/core/typedefs.h +++ b/core/typedefs.h @@ -290,4 +290,12 @@ struct _GlobalLock { #define __STRX(m_index) #m_index #define __STR(m_index) __STRX(m_index) +#ifdef __GNUC__ +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) x +#define unlikely(x) x +#endif + #endif /* typedefs.h */ diff --git a/core/variant.cpp b/core/variant.cpp index 52bdd4e22d..f70e4a5218 100644 --- a/core/variant.cpp +++ b/core/variant.cpp @@ -2469,10 +2469,10 @@ Variant::Variant(const Vector<Color> &p_array) { void Variant::operator=(const Variant &p_variant) { - if (this == &p_variant) + if (unlikely(this == &p_variant)) return; - if (type != p_variant.type) { + if (unlikely(type != p_variant.type)) { reference(p_variant); return; } diff --git a/modules/gdscript/gd_function.cpp b/modules/gdscript/gd_function.cpp index df7b16c96e..70340f0823 100644 --- a/modules/gdscript/gd_function.cpp +++ b/modules/gdscript/gd_function.cpp @@ -42,7 +42,7 @@ Variant *GDFunction::_get_variant(int p_address, GDInstance *p_instance, GDScrip case ADDR_TYPE_SELF: { - if (!p_instance) { + if (unlikely(!p_instance)) { r_error = "Cannot access self without instance."; return NULL; } @@ -54,7 +54,7 @@ Variant *GDFunction::_get_variant(int p_address, GDInstance *p_instance, GDScrip } break; case ADDR_TYPE_MEMBER: { //member indexing is O(1) - if (!p_instance) { + if (unlikely(!p_instance)) { r_error = "Cannot access member without instance."; return NULL; } @@ -279,7 +279,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a #define GET_VARIANT_PTR(m_v, m_code_ofs) \ Variant *m_v; \ m_v = _get_variant(_code_ptr[ip + m_code_ofs], p_instance, _class, self, stack, err_text); \ - if (!m_v) \ + if (unlikely(!m_v)) \ break; #else |