Merge pull request #294 from aqnuep/error_msg

Error message improvements
pull/316/head
Bastiaan Olij 2019-06-15 20:18:45 +10:00 committed by GitHub
commit 743100b401
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 192 additions and 78 deletions

View File

@ -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;

View File

@ -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) \ #define WARN_PRINT(msg) Godot::print_warning(msg, __func__, __FILE__, __LINE__)
fprintf(stdout, "ERROR: %s\n", msg); \
fflush(stdout)
#endif #endif
#ifndef WARN_PRINTS #ifndef WARN_PRINTS
@ -118,30 +99,104 @@ 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 #ifndef FATAL_PRINT
#define ERR_FAIL() ERR_PRINT("Failed") #define FATAL_PRINT(msg) ERR_PRINT(String("FATAL: ") + (msg))
#endif #endif
#ifndef ERR_FAIL_V #ifndef ERR_MSG_INDEX
#define ERR_FAIL_V(a) \ #define ERR_MSG_INDEX(index, size) (String("Index ") + #index + "=" + String::num_int64(index) + " out of size (" + #size + "=" + String::num_int64(size) + ")")
{ \ #endif
ERR_FAIL(); \
return a; \ #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) \ #define ERR_FAIL_COND(cond) \
do { \ do { \
if (a) { \ if (unlikely(cond)) { \
ERR_PRINT(#a); \ 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; \ return; \
} \ } \
} while (0) } while (0)
@ -150,30 +205,54 @@ typedef float real_t;
#ifndef ERR_FAIL_COND_V #ifndef ERR_FAIL_COND_V
#define ERR_FAIL_COND_V(cond, ret) \ #define ERR_FAIL_COND_V(cond, ret) \
do { \ do { \
if (cond) { \ if (unlikely(cond)) { \
ERR_PRINT(#cond); \ ERR_PRINT(ERR_MSG_COND(cond)); \
return ret; \ return ret; \
} \ } \
} while (0) } while (0)
#endif #endif
#ifndef ERR_FAIL_INDEX #ifndef ERR_CONTINUE
#define ERR_FAIL_INDEX(a, b) \ #define ERR_CONTINUE(cond) \
do { \ { \
if (a < 0 || a >= b) { \ if (unlikely(cond)) { \
ERR_FAIL(); \ ERR_PRINT(ERR_MSG_COND(cond)); \
return; \ 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 #ifndef ERR_FAIL_V
#define ERR_FAIL_INDEX_V(a, b, c) \ #define ERR_FAIL_V(ret) \
do { \ do { \
if (a < 0 || a >= b) { \ ERR_PRINT("Method/Function Failed."); \
ERR_FAIL(); \ return ret; \
return c; \ } while (0)
} \ #endif
#ifndef CRASH_NOW
#define CRASH_NOW() \
do { \
FATAL_PRINT("Method/Function Failed."); \
GENERATE_TRAP; \
} while (0) } while (0)
#endif #endif