浏览代码

LibJS: Remove the seal/unseal of Bytecode::Block again

This partially reverts c6ce7c9326f8e745e29ede503ea011f10c76fc5f.
The munmap part of that change was good, but we can't seal the blocks
since that breaks NewString and other ops that have String members.
Andreas Kling 4 年之前
父节点
当前提交
949ceedaed
共有 2 个文件被更改,包括 6 次插入16 次删除
  1. 5 14
      Userland/Libraries/LibJS/Bytecode/Block.cpp
  2. 1 2
      Userland/Libraries/LibJS/Bytecode/Block.h

+ 5 - 14
Userland/Libraries/LibJS/Bytecode/Block.cpp

@@ -28,7 +28,6 @@ Block::Block()
 
 
 Block::~Block()
 Block::~Block()
 {
 {
-    unseal();
     Bytecode::InstructionStreamIterator it(instruction_stream());
     Bytecode::InstructionStreamIterator it(instruction_stream());
     while (!it.at_end()) {
     while (!it.at_end()) {
         auto& to_destroy = (*it);
         auto& to_destroy = (*it);
@@ -39,20 +38,12 @@ Block::~Block()
     munmap(m_buffer, m_buffer_capacity);
     munmap(m_buffer, m_buffer_capacity);
 }
 }
 
 
-void Block::seal() const
+void Block::seal()
 {
 {
-    if (mprotect(m_buffer, m_buffer_capacity, PROT_READ) < 0) {
-        perror("ByteCode::Block::seal: mprotect");
-        VERIFY_NOT_REACHED();
-    }
-}
-
-void Block::unseal()
-{
-    if (mprotect(m_buffer, m_buffer_capacity, PROT_READ | PROT_WRITE) < 0) {
-        perror("ByteCode::Block::unseal: mprotect");
-        VERIFY_NOT_REACHED();
-    }
+    // FIXME: mprotect the instruction stream as PROT_READ
+    // This is currently not possible because instructions can have destructors (that clean up strings)
+    // Instructions should instead be destructor-less and refer to strings in a string table on the Bytecode::Block.
+    // It also doesn't work because instructions that have String members use RefPtr internally which must be in writable memory.
 }
 }
 
 
 void Block::dump() const
 void Block::dump() const

+ 1 - 2
Userland/Libraries/LibJS/Bytecode/Block.h

@@ -42,8 +42,7 @@ public:
     static NonnullOwnPtr<Block> create();
     static NonnullOwnPtr<Block> create();
     ~Block();
     ~Block();
 
 
-    void seal() const;
-    void unseal();
+    void seal();
 
 
     void dump() const;
     void dump() const;
     ReadonlyBytes instruction_stream() const { return ReadonlyBytes { m_buffer, m_buffer_size }; }
     ReadonlyBytes instruction_stream() const { return ReadonlyBytes { m_buffer, m_buffer_size }; }