mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 11:02:43 +00:00 
			
		
		
		
	 44b2735b9e
			
		
	
	
		44b2735b9e
		
	
	
	
	
		
			
			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.
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			912 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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 };
 | |
| };
 | |
| 
 | |
| }
 |