mirror of
https://github.com/luau-lang/luau.git
synced 2025-04-19 11:13:49 +01:00
### What's New? * Fragment Autocomplete: a new API allows for type checking a small fragment of code against an existing file, significantly speeding up autocomplete performance in large files. ### New Solver * E-Graphs have landed: this is an ongoing approach to make the new type solver simplify types in a more consistent and principled manner, based on similar work (see: https://egraphs-good.github.io/). * Adds support for exporting / local user type functions (previously they were always exported). * Fixes a set of bugs in which the new solver will fail to complete inference for simple expressions with just literals and operators. ### General Updates * Requiring a path with a ".lua" or ".luau" extension will now have a bespoke error suggesting to remove said extension. * Fixes a bug in which whether two `Luau::Symbol`s are equal depends on whether the new solver is enabled. --- Internal Contributors: Co-authored-by: Aaron Weiss <aaronweiss@roblox.com> Co-authored-by: Andy Friesen <afriesen@roblox.com> Co-authored-by: David Cope <dcope@roblox.com> Co-authored-by: Hunter Goldstein <hgoldstein@roblox.com> Co-authored-by: Varun Saini <vsaini@roblox.com> Co-authored-by: Vighnesh Vijay <vvijay@roblox.com> Co-authored-by: Vyacheslav Egorov <vegorov@roblox.com>
66 lines
1.3 KiB
C++
66 lines
1.3 KiB
C++
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
|
|
#include "Luau/Allocator.h"
|
|
|
|
namespace Luau
|
|
{
|
|
|
|
Allocator::Allocator()
|
|
: root(static_cast<Page*>(operator new(sizeof(Page))))
|
|
, offset(0)
|
|
{
|
|
root->next = nullptr;
|
|
}
|
|
|
|
Allocator::Allocator(Allocator&& rhs)
|
|
: root(rhs.root)
|
|
, offset(rhs.offset)
|
|
{
|
|
rhs.root = nullptr;
|
|
rhs.offset = 0;
|
|
}
|
|
|
|
Allocator::~Allocator()
|
|
{
|
|
Page* page = root;
|
|
|
|
while (page)
|
|
{
|
|
Page* next = page->next;
|
|
|
|
operator delete(page);
|
|
|
|
page = next;
|
|
}
|
|
}
|
|
|
|
void* Allocator::allocate(size_t size)
|
|
{
|
|
constexpr size_t align = alignof(void*) > alignof(double) ? alignof(void*) : alignof(double);
|
|
|
|
if (root)
|
|
{
|
|
uintptr_t data = reinterpret_cast<uintptr_t>(root->data);
|
|
uintptr_t result = (data + offset + align - 1) & ~(align - 1);
|
|
if (result + size <= data + sizeof(root->data))
|
|
{
|
|
offset = result - data + size;
|
|
return reinterpret_cast<void*>(result);
|
|
}
|
|
}
|
|
|
|
// allocate new page
|
|
size_t pageSize = size > sizeof(root->data) ? size : sizeof(root->data);
|
|
void* pageData = operator new(offsetof(Page, data) + pageSize);
|
|
|
|
Page* page = static_cast<Page*>(pageData);
|
|
|
|
page->next = root;
|
|
|
|
root = page;
|
|
offset = size;
|
|
|
|
return page->data;
|
|
}
|
|
|
|
}
|