mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-29 13:42:37 +00:00 
			
		
		
		
	 392b5c3b19
			
		
	
	
		392b5c3b19
		
	
	
	
	
		
			
			Cell::heap() and Cell::vm() needed to access member functions from HeapBlock, and wanted to be inline, so they were moved to VM.h. That approach will no longer work with VM.h not being included in every file (starting from the next commit), so this commit fixes that circular import issue by introducing secondary base classes to host the references to Heap and VM, respectively.
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			928 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			928 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
 | |
|  * Copyright (c) 2020-2023, the SerenityOS developers.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Types.h>
 | |
| #include <LibJS/Forward.h>
 | |
| 
 | |
| namespace JS {
 | |
| 
 | |
| class HeapBase {
 | |
|     AK_MAKE_NONCOPYABLE(HeapBase);
 | |
|     AK_MAKE_NONMOVABLE(HeapBase);
 | |
| 
 | |
| public:
 | |
|     VM& vm() { return m_vm; }
 | |
| 
 | |
| protected:
 | |
|     HeapBase(VM& vm)
 | |
|         : m_vm(vm)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     VM& m_vm;
 | |
| };
 | |
| 
 | |
| class HeapBlockBase {
 | |
|     AK_MAKE_NONMOVABLE(HeapBlockBase);
 | |
|     AK_MAKE_NONCOPYABLE(HeapBlockBase);
 | |
| 
 | |
| public:
 | |
|     static constexpr auto block_size = 16 * KiB;
 | |
|     static HeapBlockBase* from_cell(Cell const* cell)
 | |
|     {
 | |
|         return reinterpret_cast<HeapBlockBase*>(bit_cast<FlatPtr>(cell) & ~(HeapBlockBase::block_size - 1));
 | |
|     }
 | |
| 
 | |
|     Heap& heap() { return m_heap; }
 | |
| 
 | |
| protected:
 | |
|     HeapBlockBase(Heap& heap)
 | |
|         : m_heap(heap)
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Heap& m_heap;
 | |
| };
 | |
| 
 | |
| }
 |