Error message improvements
Changed error message macros to actually use Godot's error reporting facilities instead of outputting straight to stderr. This enables GDNative errors to actually show up inside the editor. Messages and set of available macros now also better matches that of the engine itself.pull/294/head
parent
04548011e3
commit
bb4a837ad3
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue