Ver Fonte

LibJS/Bytecode: Allow all basic blocks to use cached `this` from block 0

The first block in every executable will always execute first, so if it
ends up doing a ResolveThisBinding, it's fine for all other blocks
within the same executable to use the same `this` value.
Andreas Kling há 1 ano atrás
pai
commit
f537d0b3cf
1 ficheiros alterados com 4 adições e 0 exclusões
  1. 4 0
      Userland/Libraries/LibJS/Bytecode/Generator.cpp

+ 4 - 0
Userland/Libraries/LibJS/Bytecode/Generator.cpp

@@ -802,6 +802,10 @@ Operand Generator::get_this(Optional<Operand> preferred_dst)
 {
 {
     if (m_current_basic_block->this_().has_value())
     if (m_current_basic_block->this_().has_value())
         return m_current_basic_block->this_().value();
         return m_current_basic_block->this_().value();
+    if (m_root_basic_blocks[0]->this_().has_value()) {
+        m_current_basic_block->set_this(m_root_basic_blocks[0]->this_().value());
+        return m_root_basic_blocks[0]->this_().value();
+    }
     auto dst = preferred_dst.has_value() ? preferred_dst.value() : Operand(allocate_register());
     auto dst = preferred_dst.has_value() ? preferred_dst.value() : Operand(allocate_register());
     emit<Bytecode::Op::ResolveThisBinding>(dst);
     emit<Bytecode::Op::ResolveThisBinding>(dst);
     m_current_basic_block->set_this(dst);
     m_current_basic_block->set_this(dst);