Parcourir la source

Merge pull request #294 from aqnuep/error_msg

Error message improvements
Bastiaan Olij il y a 6 ans
Parent
commit
743100b401
2 fichiers modifiés avec 190 ajouts et 76 suppressions
  1. 36 1
      include/core/Array.hpp
  2. 154 75
      include/core/Defs.hpp

+ 36 - 1
include/core/Array.hpp

@@ -3,11 +3,46 @@
 
 
 #include <gdnative/array.h>
 #include <gdnative/array.h>
 
 
-#include "Defs.hpp"
 #include "String.hpp"
 #include "String.hpp"
 
 
 namespace godot {
 namespace godot {
 
 
+namespace helpers {
+template <typename T, typename ValueT>
+T append_all(T appendable, ValueT value) {
+	appendable.append(value);
+	return appendable;
+}
+
+template <typename T, typename ValueT, typename... Args>
+T append_all(T appendable, ValueT value, Args... args) {
+	appendable.append(value);
+	return append_all(appendable, args...);
+}
+
+template <typename T>
+T append_all(T appendable) {
+	return appendable;
+}
+
+template <typename KV, typename KeyT, typename ValueT>
+KV add_all(KV kv, KeyT key, ValueT value) {
+	kv[key] = value;
+	return kv;
+}
+
+template <typename KV, typename KeyT, typename ValueT, typename... Args>
+KV add_all(KV kv, KeyT key, ValueT value, Args... args) {
+	kv[key] = value;
+	return add_all(kv, args...);
+}
+
+template <typename KV>
+KV add_all(KV kv) {
+	return kv;
+}
+} // namespace helpers
+
 class Variant;
 class Variant;
 class PoolByteArray;
 class PoolByteArray;
 class PoolIntArray;
 class PoolIntArray;

+ 154 - 75
include/core/Defs.hpp

@@ -57,45 +57,9 @@ enum class Error {
 	ERR_WTF = ERR_OMFG_THIS_IS_VERY_VERY_BAD ///< short version of the above
 	ERR_WTF = ERR_OMFG_THIS_IS_VERY_VERY_BAD ///< short version of the above
 };
 };
 
 
-namespace helpers {
-template <typename T, typename ValueT>
-T append_all(T appendable, ValueT value) {
-	appendable.append(value);
-	return appendable;
-}
-
-template <typename T, typename ValueT, typename... Args>
-T append_all(T appendable, ValueT value, Args... args) {
-	appendable.append(value);
-	return append_all(appendable, args...);
-}
-
-template <typename T>
-T append_all(T appendable) {
-	return appendable;
-}
-
-template <typename KV, typename KeyT, typename ValueT>
-KV add_all(KV kv, KeyT key, ValueT value) {
-	kv[key] = value;
-	return kv;
-}
-
-template <typename KV, typename KeyT, typename ValueT, typename... Args>
-KV add_all(KV kv, KeyT key, ValueT value, Args... args) {
-	kv[key] = value;
-	return add_all(kv, args...);
-}
-
-template <typename KV>
-KV add_all(KV kv) {
-	return kv;
-}
-} // namespace helpers
-
 } // namespace godot
 } // namespace godot
 
 
-#include <stdio.h>
+#include <GodotGlobal.hpp>
 
 
 typedef float real_t;
 typedef float real_t;
 
 
@@ -106,11 +70,28 @@ typedef float real_t;
 #define _PLANE_EQ_DOT_EPSILON 0.999
 #define _PLANE_EQ_DOT_EPSILON 0.999
 #define _PLANE_EQ_D_EPSILON 0.0001
 #define _PLANE_EQ_D_EPSILON 0.0001
 
 
+#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
+
+// Don't use this directly; instead, use any of the CRASH_* macros
+#ifdef _MSC_VER
+#define GENERATE_TRAP                       \
+	__debugbreak();                         \
+	/* Avoid warning about control paths */ \
+	for (;;) {                              \
+	}
+#else
+#define GENERATE_TRAP __builtin_trap();
+#endif
+
 // ERR/WARN macros
 // ERR/WARN macros
 #ifndef WARN_PRINT
 #ifndef WARN_PRINT
-#define WARN_PRINT(msg)                  \
-	fprintf(stdout, "ERROR: %s\n", msg); \
-	fflush(stdout)
+#define WARN_PRINT(msg) Godot::print_warning(msg, __func__, __FILE__, __LINE__)
 #endif
 #endif
 
 
 #ifndef WARN_PRINTS
 #ifndef WARN_PRINTS
@@ -118,62 +99,160 @@ typedef float real_t;
 #endif
 #endif
 
 
 #ifndef ERR_PRINT
 #ifndef ERR_PRINT
-#define ERR_PRINT(x) fprintf(stderr, "ERROR: %s\n", x)
+#define ERR_PRINT(msg) Godot::print_error(msg, __func__, __FILE__, __LINE__)
 #endif
 #endif
 
 
 #ifndef ERR_PRINTS
 #ifndef ERR_PRINTS
 #define ERR_PRINTS(msg) ERR_PRINT((msg).utf8().get_data())
 #define ERR_PRINTS(msg) ERR_PRINT((msg).utf8().get_data())
 #endif
 #endif
 
 
-#ifndef ERR_FAIL
-#define ERR_FAIL() ERR_PRINT("Failed")
+#ifndef FATAL_PRINT
+#define FATAL_PRINT(msg) ERR_PRINT(String("FATAL: ") + (msg))
 #endif
 #endif
 
 
-#ifndef ERR_FAIL_V
-#define ERR_FAIL_V(a) \
-	{                 \
-		ERR_FAIL();   \
-		return a;     \
-	}
+#ifndef ERR_MSG_INDEX
+#define ERR_MSG_INDEX(index, size) (String("Index ") + #index + "=" + String::num_int64(index) + " out of size (" + #size + "=" + String::num_int64(size) + ")")
+#endif
+
+#ifndef ERR_MSG_NULL
+#define ERR_MSG_NULL(param) (String("Parameter '") + #param + "' is null.")
+#endif
+
+#ifndef ERR_MSG_COND
+#define ERR_MSG_COND(cond) (String("Condition '") + #cond + "' is true.")
+#endif
+
+#ifndef ERR_FAIL_INDEX
+#define ERR_FAIL_INDEX(index, size)                       \
+	do {                                                  \
+		if (unlikely((index) < 0 || (index) >= (size))) { \
+			ERR_PRINT(ERR_MSG_INDEX(index, size));        \
+			return;                                       \
+		}                                                 \
+	} while (0)
+#endif
+
+#ifndef ERR_FAIL_INDEX_V
+#define ERR_FAIL_INDEX_V(index, size, ret)                \
+	do {                                                  \
+		if (unlikely((index) < 0 || (index) >= (size))) { \
+			ERR_PRINT(ERR_MSG_INDEX(index, size));        \
+			return ret;                                   \
+		}                                                 \
+	} while (0)
+#endif
+
+#ifndef ERR_FAIL_UNSIGNED_INDEX_V
+#define ERR_FAIL_UNSIGNED_INDEX_V(index, size, ret) \
+	do {                                            \
+		if (unlikely((index) >= (size))) {          \
+			ERR_PRINT(ERR_MSG_INDEX(index, size));  \
+			return ret;                             \
+		}                                           \
+	} while (0)
+#endif
+
+#ifndef CRASH_BAD_INDEX
+#define CRASH_BAD_INDEX(index, size)                      \
+	do {                                                  \
+		if (unlikely((index) < 0 || (index) >= (size))) { \
+			FATAL_PRINT(ERR_MSG_INDEX(index, size));      \
+			GENERATE_TRAP;                                \
+		}                                                 \
+	} while (0)
+#endif
+
+#ifndef ERR_FAIL_NULL
+#define ERR_FAIL_NULL(param)                \
+	do {                                    \
+		if (unlikely(!param)) {             \
+			ERR_PRINT(ERR_MSG_NULL(param)); \
+			return;                         \
+		}                                   \
+	} while (0)
+#endif
+
+#ifndef ERR_FAIL_NULL_V
+#define ERR_FAIL_NULL_V(param, ret)         \
+	do {                                    \
+		if (unlikely(!param)) {             \
+			ERR_PRINT(ERR_MSG_NULL(param)); \
+			return ret;                     \
+		}                                   \
+	} while (0)
 #endif
 #endif
 
 
 #ifndef ERR_FAIL_COND
 #ifndef ERR_FAIL_COND
-#define ERR_FAIL_COND(a)   \
-	do {                   \
-		if (a) {           \
-			ERR_PRINT(#a); \
-			return;        \
-		}                  \
+#define ERR_FAIL_COND(cond)                \
+	do {                                   \
+		if (unlikely(cond)) {              \
+			ERR_PRINT(ERR_MSG_COND(cond)); \
+			return;                        \
+		}                                  \
+	} while (0)
+#endif
+
+#ifndef CRASH_COND
+#define CRASH_COND(cond)                     \
+	do {                                     \
+		if (unlikely(cond)) {                \
+			FATAL_PRINT(ERR_MSG_COND(cond)); \
+			return;                          \
+		}                                    \
 	} while (0)
 	} while (0)
 #endif
 #endif
 
 
 #ifndef ERR_FAIL_COND_V
 #ifndef ERR_FAIL_COND_V
-#define ERR_FAIL_COND_V(cond, ret) \
-	do {                           \
-		if (cond) {                \
-			ERR_PRINT(#cond);      \
-			return ret;            \
-		}                          \
+#define ERR_FAIL_COND_V(cond, ret)         \
+	do {                                   \
+		if (unlikely(cond)) {              \
+			ERR_PRINT(ERR_MSG_COND(cond)); \
+			return ret;                    \
+		}                                  \
 	} while (0)
 	} while (0)
 #endif
 #endif
 
 
-#ifndef ERR_FAIL_INDEX
-#define ERR_FAIL_INDEX(a, b)   \
-	do {                       \
-		if (a < 0 || a >= b) { \
-			ERR_FAIL();        \
-			return;            \
-		}                      \
+#ifndef ERR_CONTINUE
+#define ERR_CONTINUE(cond)                 \
+	{                                      \
+		if (unlikely(cond)) {              \
+			ERR_PRINT(ERR_MSG_COND(cond)); \
+			continue;                      \
+		}                                  \
+	}
+#endif
+
+#ifndef ERR_BREAK
+#define ERR_BREAK(cond)                    \
+	{                                      \
+		if (unlikely(cond)) {              \
+			ERR_PRINT(ERR_MSG_COND(cond)); \
+			break;                         \
+		}                                  \
+	}
+#endif
+
+#ifndef ERR_FAIL
+#define ERR_FAIL()                            \
+	do {                                      \
+		ERR_PRINT("Method/Function Failed."); \
+		return;                               \
 	} while (0)
 	} while (0)
 #endif
 #endif
 
 
-#ifndef ERR_FAIL_INDEX_V
-#define ERR_FAIL_INDEX_V(a, b, c) \
-	do {                          \
-		if (a < 0 || a >= b) {    \
-			ERR_FAIL();           \
-			return c;             \
-		}                         \
+#ifndef ERR_FAIL_V
+#define ERR_FAIL_V(ret)                       \
+	do {                                      \
+		ERR_PRINT("Method/Function Failed."); \
+		return ret;                           \
+	} while (0)
+#endif
+
+#ifndef CRASH_NOW
+#define CRASH_NOW()                             \
+	do {                                        \
+		FATAL_PRINT("Method/Function Failed."); \
+		GENERATE_TRAP;                          \
 	} while (0)
 	} while (0)
 #endif
 #endif