luau/Analysis/include/Luau/RecursionCounter.h

69 lines
1.4 KiB
C
Raw Normal View History

// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
#pragma once
#include "Luau/Common.h"
2022-10-28 06:22:49 +08:00
#include "Luau/Error.h"
#include <stdexcept>
2022-04-15 05:57:15 +08:00
#include <exception>
namespace Luau
{
2022-10-28 06:22:49 +08:00
struct RecursionLimitException : public InternalCompilerError
{
RecursionLimitException()
: InternalCompilerError("Internal recursion counter limit exceeded")
{
LUAU_ASSERT(FFlag::LuauIceExceptionInheritanceChange);
}
};
struct RecursionLimitException_DEPRECATED : public std::exception
2022-04-15 05:57:15 +08:00
{
const char* what() const noexcept
{
2022-10-28 06:22:49 +08:00
LUAU_ASSERT(!FFlag::LuauIceExceptionInheritanceChange);
2022-04-15 05:57:15 +08:00
return "Internal recursion counter limit exceeded";
}
};
struct RecursionCounter
{
RecursionCounter(int* count)
: count(count)
{
++(*count);
}
~RecursionCounter()
{
LUAU_ASSERT(*count > 0);
--(*count);
}
private:
int* count;
};
struct RecursionLimiter : RecursionCounter
{
2022-06-24 09:44:07 +08:00
RecursionLimiter(int* count, int limit)
: RecursionCounter(count)
{
if (limit > 0 && *count > limit)
2022-04-15 05:57:15 +08:00
{
2022-10-28 06:22:49 +08:00
if (FFlag::LuauIceExceptionInheritanceChange)
{
throw RecursionLimitException();
}
else
{
throw RecursionLimitException_DEPRECATED();
}
2022-04-15 05:57:15 +08:00
}
}
};
} // namespace Luau