mirror of
https://github.com/luau-lang/luau.git
synced 2024-11-15 14:25:44 +08:00
1212fdacbf
Once again, all of our changes this week are for new type solver and the JIT. In the new type solver, we fixed cyclic type alias handling and multiple stability issues. In the JIT, our main progress was for arm64, where, after lowering 36% of instructions, we start seeing first Luau functions executing natively. For x64, we performed code cleanup and refactoring to allow for future optimizations.
54 lines
1.8 KiB
C++
54 lines
1.8 KiB
C++
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
#include <string>
|
|
|
|
#include "Luau/BuiltinDefinitions.h"
|
|
#include "Luau/Common.h"
|
|
#include "Luau/Frontend.h"
|
|
#include "Luau/ModuleResolver.h"
|
|
#include "Luau/Parser.h"
|
|
|
|
LUAU_FASTINT(LuauTypeInferRecursionLimit)
|
|
LUAU_FASTINT(LuauTypeInferTypePackLoopLimit)
|
|
|
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size)
|
|
{
|
|
FInt::LuauTypeInferRecursionLimit.value = 100;
|
|
FInt::LuauTypeInferTypePackLoopLimit.value = 100;
|
|
|
|
Luau::ParseOptions options;
|
|
|
|
Luau::Allocator allocator;
|
|
Luau::AstNameTable names(allocator);
|
|
|
|
Luau::ParseResult parseResult = Luau::Parser::parse(reinterpret_cast<const char*>(Data), Size, names, allocator, options);
|
|
|
|
// "static" here is to accelerate fuzzing process by only creating and populating the type environment once
|
|
static Luau::NullFileResolver fileResolver;
|
|
static Luau::NullConfigResolver configResolver;
|
|
static Luau::Frontend frontend{&fileResolver, &configResolver};
|
|
static int once = (Luau::registerBuiltinGlobals(frontend), 1);
|
|
(void)once;
|
|
static int once2 = (Luau::freeze(frontend.globals.globalTypes), 1);
|
|
(void)once2;
|
|
|
|
if (parseResult.errors.empty())
|
|
{
|
|
Luau::TypeChecker typeck(frontend.globals.globalScope, &frontend.moduleResolver, frontend.builtinTypes, &frontend.iceHandler);
|
|
|
|
Luau::SourceModule module;
|
|
module.root = parseResult.root;
|
|
module.mode = Luau::Mode::Nonstrict;
|
|
|
|
try
|
|
{
|
|
typeck.check(module, Luau::Mode::Nonstrict);
|
|
}
|
|
catch (std::exception&)
|
|
{
|
|
// This catches internal errors that the type checker currently (unfortunately) throws in some cases
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|