Browse Source

LibJS: Rearrange ASTNode members so there's a padding hole at the end

ASTNode inherits from RefCounted, which has a single 32-bit member.
This means that there's a 32-bit padding hole after RefCounted,
where we are free to put something (or it will go to waste!)

This patch moves ASTNode::m_start_offset into that padding hole,
and we now have a 32-bit padding hole at the end of ASTNode instead.

This will allow ASTNode subclasses to put things in the ASTNode hole
by moving them to the head of the member list.
Andreas Kling 2 years ago
parent
commit
e70f944e11
2 changed files with 5 additions and 3 deletions
  1. 2 2
      Userland/Libraries/LibJS/AST.cpp
  2. 3 1
      Userland/Libraries/LibJS/AST.h

+ 2 - 2
Userland/Libraries/LibJS/AST.cpp

@@ -62,8 +62,8 @@ private:
 };
 };
 
 
 ASTNode::ASTNode(SourceRange source_range)
 ASTNode::ASTNode(SourceRange source_range)
-    : m_source_code(source_range.code)
-    , m_start_offset(source_range.start.offset)
+    : m_start_offset(source_range.start.offset)
+    , m_source_code(source_range.code)
     , m_end_offset(source_range.end.offset)
     , m_end_offset(source_range.end.offset)
 {
 {
 }
 }

+ 3 - 1
Userland/Libraries/LibJS/AST.h

@@ -90,8 +90,10 @@ protected:
     explicit ASTNode(SourceRange);
     explicit ASTNode(SourceRange);
 
 
 private:
 private:
-    RefPtr<SourceCode> m_source_code;
+    // NOTE: These members are carefully ordered so that `m_start_offset` is packed with the padding after RefCounted::m_ref_count.
+    //       This creates a 4-byte padding hole after `m_end_offset` which is used to pack subclasses better.
     u32 m_start_offset { 0 };
     u32 m_start_offset { 0 };
+    RefPtr<SourceCode> m_source_code;
     u32 m_end_offset { 0 };
     u32 m_end_offset { 0 };
 };
 };