浏览代码

LibJS: Remeber which instruction terminated a block

Hendiadyoin1 2 年之前
父节点
当前提交
192897c269
共有 2 个文件被更改,包括 6 次插入5 次删除
  1. 4 3
      Userland/Libraries/LibJS/Bytecode/BasicBlock.h
  2. 2 2
      Userland/Libraries/LibJS/Bytecode/Generator.h

+ 4 - 3
Userland/Libraries/LibJS/Bytecode/BasicBlock.h

@@ -36,8 +36,9 @@ public:
     bool can_grow(size_t additional_size) const { return m_buffer_size + additional_size <= m_buffer_capacity; }
     void grow(size_t additional_size);
 
-    void terminate(Badge<Generator>) { m_is_terminated = true; }
-    bool is_terminated() const { return m_is_terminated; }
+    void terminate(Badge<Generator>, Instruction const* terminator) { m_terminator = terminator; }
+    bool is_terminated() const { return m_terminator != nullptr; }
+    Instruction const* terminator() const { return m_terminator; }
 
     String const& name() const { return m_name; }
 
@@ -45,9 +46,9 @@ private:
     BasicBlock(String name, size_t size);
 
     u8* m_buffer { nullptr };
+    Instruction const* m_terminator { nullptr };
     size_t m_buffer_capacity { 0 };
     size_t m_buffer_size { 0 };
-    bool m_is_terminated { false };
     String m_name;
 };
 

+ 2 - 2
Userland/Libraries/LibJS/Bytecode/Generator.h

@@ -57,7 +57,7 @@ public:
         grow(sizeof(OpType));
         new (slot) OpType(forward<Args>(args)...);
         if constexpr (OpType::IsTerminator)
-            m_current_basic_block->terminate({});
+            m_current_basic_block->terminate({}, static_cast<Instruction const*>(slot));
         return *static_cast<OpType*>(slot);
     }
 
@@ -76,7 +76,7 @@ public:
         grow(size_to_allocate);
         new (slot) OpType(forward<Args>(args)...);
         if constexpr (OpType::IsTerminator)
-            m_current_basic_block->terminate({});
+            m_current_basic_block->terminate({}, static_cast<Instruction const*>(slot));
         return *static_cast<OpType*>(slot);
     }