ladybird/Userland/Libraries/LibJS/SourceRange.h
Andreas Kling 44b2735b9e LibJS: Make line-and-column resolution fast for large minified JS
Instead of caching start-of-line offsets, we now cache byte offsets
at regular intervals. This fixes an issue where we had terrible
performance on large minified JS, since that often means one very,
VERY long line (with no line endings to cache).

My machine was spending ~35ms per stack frame when throwing errors
on some heavy minified websites, and after this patch, we now spend
<1ms per stack frame.
2023-09-12 17:21:42 +02:00

40 lines
912 B
C++

/*
* Copyright (c) 2020, the SerenityOS developers.
* Copyright (c) 2023, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/NonnullRefPtr.h>
#include <AK/StringView.h>
#include <AK/Types.h>
#include <LibJS/Position.h>
#include <LibJS/SourceCode.h>
namespace JS {
struct SourceRange {
[[nodiscard]] bool contains(Position const& position) const { return position.offset <= end.offset && position.offset >= start.offset; }
NonnullRefPtr<SourceCode const> code;
Position start;
Position end;
DeprecatedString filename() const;
};
struct UnrealizedSourceRange {
[[nodiscard]] SourceRange realize() const
{
VERIFY(source_code);
return source_code->range_from_offsets(start_offset, end_offset);
}
RefPtr<SourceCode const> source_code;
u32 start_offset { 0 };
u32 end_offset { 0 };
};
}