ソースを参照

LibJS: Stop generating switch case statements on block termination

After we terminate a block (e.g. break, continue), we cannot generate
anymore bytecode for the block. This caused us to crash with this
example code:
```
a = 0;
switch (a) {
    case 0:
        break;
        console.log("hello world");
}
```
Anything after a block terminating instruction is considered
unreachable code, so we can safely skip any statements after it.
Luke Wilde 3 年 前
コミット
1fc6bbcdc3
1 ファイル変更2 行追加0 行削除
  1. 2 0
      Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

+ 2 - 0
Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

@@ -1627,6 +1627,8 @@ Bytecode::CodeGenerationErrorOr<void> SwitchStatement::generate_bytecode(Bytecod
         generator.emit<Bytecode::Op::LoadImmediate>(js_undefined());
         generator.emit<Bytecode::Op::LoadImmediate>(js_undefined());
         for (auto& statement : switch_case.children()) {
         for (auto& statement : switch_case.children()) {
             TRY(statement.generate_bytecode(generator));
             TRY(statement.generate_bytecode(generator));
+            if (generator.is_current_block_terminated())
+                break;
         }
         }
         if (!generator.is_current_block_terminated()) {
         if (!generator.is_current_block_terminated()) {
             auto next_block = current_block;
             auto next_block = current_block;