From c2809ef6f16d7a4c6982158c79519666690e8114 Mon Sep 17 00:00:00 2001 From: Kevin Date: Sun, 5 Feb 2023 04:11:32 +0000 Subject: [PATCH] Try-catch-block control flow fix/refactor (#2568) This Pull Request is meant to address #1900. While working on it, there was a decent amount of refactoring/restructuring. Initially, I had kept with the current approach of just keeping track of a kind and counter on the environment stack, especially because that kept the size of each stack entry to a minimum. I did, however, make a switch to having the opcode create the `EnvStackEntry` with a start address and exit address for a bit more precision. It changes the following: - Consolidates `loop_env_stack` and `try_env_stack` into one `EnvStackEntry` struct. - Changes `Continue`, `Break`, `LoopStart`, `LoopContinue`, `FinallyStart`, `FinallyEnd` and various others. Most of this primarily revolves around the creating of `EnvStackEntry` and interacting with the `env_stack`. - Changes/updates the try-catch-finally, break and continue statement compilations as necessary - Adds an `AbruptCompletionRecord` in place of the `finally_jump` vector. - Adds some tests for try-catch-finally blocks with breaks. --- boa_engine/src/bytecompiler/jump_control.rs | 262 ++++++++++-------- .../src/bytecompiler/statement/block.rs | 6 +- .../src/bytecompiler/statement/break.rs | 124 ++++++--- .../src/bytecompiler/statement/continue.rs | 165 ++++++++--- .../src/bytecompiler/statement/labelled.rs | 5 + boa_engine/src/bytecompiler/statement/loop.rs | 54 +++- .../src/bytecompiler/statement/switch.rs | 5 +- boa_engine/src/bytecompiler/statement/try.rs | 192 +++++++------ boa_engine/src/tests.rs | 134 ++++++++- boa_engine/src/vm/call_frame/abrupt_record.rs | 75 +++++ boa_engine/src/vm/call_frame/env_stack.rs | 143 ++++++++++ .../vm/{call_frame.rs => call_frame/mod.rs} | 113 +++----- boa_engine/src/vm/code_block.rs | 17 +- boa_engine/src/vm/flowgraph/mod.rs | 42 ++- boa_engine/src/vm/mod.rs | 197 ++++++++----- .../src/vm/opcode/control_flow/break.rs | 102 +++++++ .../src/vm/opcode/control_flow/catch.rs | 97 +++++++ .../src/vm/opcode/control_flow/finally.rs | 178 ++++++++++++ .../src/vm/opcode/control_flow/labelled.rs | 55 ++++ boa_engine/src/vm/opcode/control_flow/mod.rs | 11 + boa_engine/src/vm/opcode/control_flow/try.rs | 83 ++++++ boa_engine/src/vm/opcode/generator/mod.rs | 8 +- .../src/vm/opcode/iteration/for_await.rs | 3 +- boa_engine/src/vm/opcode/iteration/for_in.rs | 3 +- .../src/vm/opcode/iteration/loop_ops.rs | 72 +++-- boa_engine/src/vm/opcode/jump/break.rs | 44 --- boa_engine/src/vm/opcode/jump/mod.rs | 3 - boa_engine/src/vm/opcode/mod.rs | 43 ++- boa_engine/src/vm/opcode/pop/mod.rs | 15 +- boa_engine/src/vm/opcode/promise/mod.rs | 80 ------ boa_engine/src/vm/opcode/push/environment.rs | 3 +- boa_engine/src/vm/opcode/return_stm/mod.rs | 58 ++-- boa_engine/src/vm/opcode/throw/mod.rs | 4 +- boa_engine/src/vm/opcode/try_catch/mod.rs | 164 ----------- 34 files changed, 1728 insertions(+), 832 deletions(-) create mode 100644 boa_engine/src/vm/call_frame/abrupt_record.rs create mode 100644 boa_engine/src/vm/call_frame/env_stack.rs rename boa_engine/src/vm/{call_frame.rs => call_frame/mod.rs} (50%) create mode 100644 boa_engine/src/vm/opcode/control_flow/break.rs create mode 100644 boa_engine/src/vm/opcode/control_flow/catch.rs create mode 100644 boa_engine/src/vm/opcode/control_flow/finally.rs create mode 100644 boa_engine/src/vm/opcode/control_flow/labelled.rs create mode 100644 boa_engine/src/vm/opcode/control_flow/mod.rs create mode 100644 boa_engine/src/vm/opcode/control_flow/try.rs delete mode 100644 boa_engine/src/vm/opcode/jump/break.rs delete mode 100644 boa_engine/src/vm/opcode/promise/mod.rs delete mode 100644 boa_engine/src/vm/opcode/try_catch/mod.rs diff --git a/boa_engine/src/bytecompiler/jump_control.rs b/boa_engine/src/bytecompiler/jump_control.rs index eddf4d8b3c..47effcb779 100644 --- a/boa_engine/src/bytecompiler/jump_control.rs +++ b/boa_engine/src/bytecompiler/jump_control.rs @@ -9,24 +9,19 @@ //! [try spec]: https://tc39.es/ecma262/#sec-try-statement //! [labelled spec]: https://tc39.es/ecma262/#sec-labelled-statements -use crate::{ - bytecompiler::{ByteCompiler, Label}, - vm::Opcode, -}; +use crate::bytecompiler::{ByteCompiler, Label}; use bitflags::bitflags; use boa_interner::Sym; -use std::mem::size_of; /// Boa's `ByteCompiler` jump information tracking struct. #[derive(Debug, Clone)] pub(crate) struct JumpControlInfo { label: Option, start_address: u32, - decl_envs: u32, flags: JumpControlInfoFlags, + set_jumps: Vec