2021-10-30 04:25:12 +08:00
|
|
|
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
// Compiler codegen control macros
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#define LUAU_NORETURN __declspec(noreturn)
|
|
|
|
#define LUAU_NOINLINE __declspec(noinline)
|
|
|
|
#define LUAU_FORCEINLINE __forceinline
|
|
|
|
#define LUAU_LIKELY(x) x
|
|
|
|
#define LUAU_UNLIKELY(x) x
|
|
|
|
#define LUAU_UNREACHABLE() __assume(false)
|
|
|
|
#define LUAU_DEBUGBREAK() __debugbreak()
|
|
|
|
#else
|
|
|
|
#define LUAU_NORETURN __attribute__((__noreturn__))
|
|
|
|
#define LUAU_NOINLINE __attribute__((noinline))
|
|
|
|
#define LUAU_FORCEINLINE inline __attribute__((always_inline))
|
|
|
|
#define LUAU_LIKELY(x) __builtin_expect(x, 1)
|
|
|
|
#define LUAU_UNLIKELY(x) __builtin_expect(x, 0)
|
|
|
|
#define LUAU_UNREACHABLE() __builtin_unreachable()
|
|
|
|
#define LUAU_DEBUGBREAK() __builtin_trap()
|
|
|
|
#endif
|
|
|
|
|
2024-09-14 01:14:29 +08:00
|
|
|
// LUAU_FALLTHROUGH is a C++11-compatible alternative to [[fallthrough]] for use in the VM library
|
|
|
|
#if defined(__clang__) && defined(__has_warning)
|
|
|
|
#if __has_feature(cxx_attributes) && __has_warning("-Wimplicit-fallthrough")
|
|
|
|
#define LUAU_FALLTHROUGH [[clang::fallthrough]]
|
|
|
|
#else
|
|
|
|
#define LUAU_FALLTHROUGH
|
|
|
|
#endif
|
|
|
|
#elif defined(__GNUC__) && __GNUC__ >= 7
|
|
|
|
#define LUAU_FALLTHROUGH [[gnu::fallthrough]]
|
|
|
|
#else
|
|
|
|
#define LUAU_FALLTHROUGH
|
|
|
|
#endif
|
|
|
|
|
2022-10-22 01:33:43 +08:00
|
|
|
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
|
|
#define LUAU_BIG_ENDIAN
|
|
|
|
#endif
|
|
|
|
|
2021-10-30 04:25:12 +08:00
|
|
|
namespace Luau
|
|
|
|
{
|
|
|
|
|
2022-01-07 06:10:07 +08:00
|
|
|
using AssertHandler = int (*)(const char* expression, const char* file, int line, const char* function);
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
inline AssertHandler& assertHandler()
|
|
|
|
{
|
|
|
|
static AssertHandler handler = nullptr;
|
|
|
|
return handler;
|
|
|
|
}
|
|
|
|
|
2023-01-20 20:02:39 +08:00
|
|
|
// We want 'inline' to correctly link this function declared in the header
|
|
|
|
// But we also want to prevent compiler from inlining this function when optimization and assertions are enabled together
|
|
|
|
// Reason for that is that compilation times can increase significantly in such a configuration
|
|
|
|
LUAU_NOINLINE inline int assertCallHandler(const char* expression, const char* file, int line, const char* function)
|
2021-10-30 04:25:12 +08:00
|
|
|
{
|
|
|
|
if (AssertHandler handler = assertHandler())
|
2022-01-07 06:10:07 +08:00
|
|
|
return handler(expression, file, line, function);
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace Luau
|
|
|
|
|
|
|
|
#if !defined(NDEBUG) || defined(LUAU_ENABLE_ASSERT)
|
2022-01-07 06:10:07 +08:00
|
|
|
#define LUAU_ASSERT(expr) ((void)(!!(expr) || (Luau::assertCallHandler(#expr, __FILE__, __LINE__, __FUNCTION__) && (LUAU_DEBUGBREAK(), 0))))
|
2021-10-30 04:25:12 +08:00
|
|
|
#define LUAU_ASSERTENABLED
|
|
|
|
#else
|
|
|
|
#define LUAU_ASSERT(expr) (void)sizeof(!!(expr))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
namespace Luau
|
|
|
|
{
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
struct FValue
|
|
|
|
{
|
|
|
|
static FValue* list;
|
|
|
|
|
|
|
|
T value;
|
|
|
|
bool dynamic;
|
|
|
|
const char* name;
|
|
|
|
FValue* next;
|
|
|
|
|
2022-08-05 05:27:28 +08:00
|
|
|
FValue(const char* name, T def, bool dynamic)
|
2021-10-30 04:25:12 +08:00
|
|
|
: value(def)
|
|
|
|
, dynamic(dynamic)
|
|
|
|
, name(name)
|
|
|
|
, next(list)
|
|
|
|
{
|
|
|
|
list = this;
|
|
|
|
}
|
|
|
|
|
2024-03-31 06:49:03 +08:00
|
|
|
LUAU_FORCEINLINE operator T() const
|
2021-10-30 04:25:12 +08:00
|
|
|
{
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
FValue<T>* FValue<T>::list = nullptr;
|
|
|
|
|
|
|
|
} // namespace Luau
|
|
|
|
|
|
|
|
#define LUAU_FASTFLAG(flag) \
|
|
|
|
namespace FFlag \
|
|
|
|
{ \
|
|
|
|
extern Luau::FValue<bool> flag; \
|
|
|
|
}
|
2024-11-02 00:47:10 +08:00
|
|
|
#define LUAU_FASTFLAGVARIABLE(flag) \
|
2021-10-30 04:25:12 +08:00
|
|
|
namespace FFlag \
|
|
|
|
{ \
|
2024-11-02 00:47:10 +08:00
|
|
|
Luau::FValue<bool> flag(#flag, false, false); \
|
2021-10-30 04:25:12 +08:00
|
|
|
}
|
|
|
|
#define LUAU_FASTINT(flag) \
|
|
|
|
namespace FInt \
|
|
|
|
{ \
|
|
|
|
extern Luau::FValue<int> flag; \
|
|
|
|
}
|
|
|
|
#define LUAU_FASTINTVARIABLE(flag, def) \
|
|
|
|
namespace FInt \
|
|
|
|
{ \
|
2022-08-05 05:27:28 +08:00
|
|
|
Luau::FValue<int> flag(#flag, def, false); \
|
2021-10-30 04:25:12 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#define LUAU_DYNAMIC_FASTFLAG(flag) \
|
|
|
|
namespace DFFlag \
|
|
|
|
{ \
|
|
|
|
extern Luau::FValue<bool> flag; \
|
|
|
|
}
|
|
|
|
#define LUAU_DYNAMIC_FASTFLAGVARIABLE(flag, def) \
|
|
|
|
namespace DFFlag \
|
|
|
|
{ \
|
2022-08-05 05:27:28 +08:00
|
|
|
Luau::FValue<bool> flag(#flag, def, true); \
|
2021-10-30 04:25:12 +08:00
|
|
|
}
|
|
|
|
#define LUAU_DYNAMIC_FASTINT(flag) \
|
|
|
|
namespace DFInt \
|
|
|
|
{ \
|
|
|
|
extern Luau::FValue<int> flag; \
|
|
|
|
}
|
|
|
|
#define LUAU_DYNAMIC_FASTINTVARIABLE(flag, def) \
|
|
|
|
namespace DFInt \
|
|
|
|
{ \
|
2022-08-05 05:27:28 +08:00
|
|
|
Luau::FValue<int> flag(#flag, def, true); \
|
2021-10-30 04:25:12 +08:00
|
|
|
}
|
2022-10-14 06:59:53 +08:00
|
|
|
|
|
|
|
#if defined(__GNUC__)
|
|
|
|
#define LUAU_PRINTF_ATTR(fmt, arg) __attribute__((format(printf, fmt, arg)))
|
|
|
|
#else
|
|
|
|
#define LUAU_PRINTF_ATTR(fmt, arg)
|
|
|
|
#endif
|