From 16840493567914a815708c2d979298f3dcec74d7 Mon Sep 17 00:00:00 2001 From: Haled Odat <8566042+HalidOdat@users.noreply.github.com> Date: Thu, 20 Jul 2023 22:18:11 +0200 Subject: [PATCH] Use start and end field instead of range for handle --- .../declaration/declaration_pattern.rs | 5 ++- boa_engine/src/bytecompiler/jump_control.rs | 7 +++-- boa_engine/src/bytecompiler/statement/loop.rs | 4 +-- boa_engine/src/vm/code_block.rs | 31 +++++++++++++------ 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/boa_engine/src/bytecompiler/declaration/declaration_pattern.rs b/boa_engine/src/bytecompiler/declaration/declaration_pattern.rs index 74e121d32ca..560088b3465 100644 --- a/boa_engine/src/bytecompiler/declaration/declaration_pattern.rs +++ b/boa_engine/src/bytecompiler/declaration/declaration_pattern.rs @@ -194,7 +194,7 @@ impl ByteCompiler<'_, '_> { self.emit_opcode(Opcode::PushTrue); self.patch_jump(exit); - self.handlers[handler_index as usize].range.end = handler_address; + self.handlers[handler_index as usize].end = handler_address; let iterator_close_handler = self.push_handler(); self.iterator_close(false); @@ -213,8 +213,7 @@ impl ByteCompiler<'_, '_> { self.emit_opcode(Opcode::Throw); self.patch_jump(jump); - self.handlers[iterator_close_handler as usize].range.end = - iterator_close_handler_address; + self.handlers[iterator_close_handler as usize].end = iterator_close_handler_address; } } } diff --git a/boa_engine/src/bytecompiler/jump_control.rs b/boa_engine/src/bytecompiler/jump_control.rs index 9e992c4a5e2..7f48efd2f3b 100644 --- a/boa_engine/src/bytecompiler/jump_control.rs +++ b/boa_engine/src/bytecompiler/jump_control.rs @@ -299,7 +299,8 @@ impl ByteCompiler<'_, '_> { // FIXME(HalidOdat): figure out value stack fp value. let env_fp = self.current_open_environments_count; self.handlers.push(Handler { - range: (start_address..u32::MAX), + start: start_address, + end: u32::MAX, fp: 0, env_fp, }); @@ -318,9 +319,9 @@ impl ByteCompiler<'_, '_> { .handler_index .expect("try jump info must have handler index"); - assert!(handler_address >= self.handlers[handler_index as usize].range.start); + assert!(handler_address >= self.handlers[handler_index as usize].start); - self.handlers[handler_index as usize].range.end = handler_address; + self.handlers[handler_index as usize].end = handler_address; } /// Does the jump control info have the `use_expr` flag set to true. diff --git a/boa_engine/src/bytecompiler/statement/loop.rs b/boa_engine/src/bytecompiler/statement/loop.rs index ee89e30758d..cbd6299c547 100644 --- a/boa_engine/src/bytecompiler/statement/loop.rs +++ b/boa_engine/src/bytecompiler/statement/loop.rs @@ -378,10 +378,10 @@ impl ByteCompiler<'_, '_> { let handler_index = self.push_handler(); self.iterator_close(for_of_loop.r#await()); let end_address = self.next_opcode_location(); - self.handlers[handler_index as usize].range.end = end_address; + self.handlers[handler_index as usize].end = end_address; } - self.handlers[handler_index as usize].range.end = handler_address; + self.handlers[handler_index as usize].end = handler_address; self.emit_opcode(Opcode::Throw); self.patch_jump(exit); diff --git a/boa_engine/src/vm/code_block.rs b/boa_engine/src/vm/code_block.rs index f888412a770..e3ef3f63fa8 100644 --- a/boa_engine/src/vm/code_block.rs +++ b/boa_engine/src/vm/code_block.rs @@ -90,7 +90,8 @@ unsafe impl Trace for CodeBlockFlags { #[allow(dead_code)] #[derive(Debug, Clone)] pub(crate) struct Handler { - pub(crate) range: std::ops::Range, + pub(crate) start: u32, + pub(crate) end: u32, pub(crate) fp: u32, pub(crate) env_fp: u32, @@ -99,7 +100,12 @@ pub(crate) struct Handler { impl Handler { /// Get the handler address. pub(crate) const fn handler(&self) -> u32 { - self.range.end + self.end + } + + /// Check if the provided `pc` is contained in the handler range. + pub(crate) const fn contains(&self, pc: u32) -> bool { + pc < self.end && pc >= self.start } } @@ -243,7 +249,7 @@ impl CodeBlock { self.handlers .iter() .rev() - .find(|&handler| handler.range.contains(&pc)) + .find(|handler| handler.contains(pc)) } } @@ -687,14 +693,17 @@ impl ToInternedString for CodeBlock { let mut count = 0; while pc < self.bytecode.len() { for (i, handler) in self.handlers.iter().enumerate().rev() { - if pc == handler.range.start as usize { - f.push_str(&format!("\n#{i} Handler Start\n")); + if pc == handler.end as usize { + f.push_str(&format!("#{i} Handler End\n\n",)); } + } - if pc == handler.range.end as usize { - f.push_str(&format!("#{i} Handler End\n\n",)); + for (i, handler) in self.handlers.iter().enumerate().rev() { + if pc == handler.start as usize { + f.push_str(&format!("\n#{i} Handler Start\n")); } } + let opcode: Opcode = self.bytecode[pc].into(); let opcode = opcode.as_str(); let previous_pc = pc; @@ -750,8 +759,12 @@ impl ToInternedString for CodeBlock { } else { for (i, handler) in self.handlers.iter().enumerate() { f.push_str(&format!( - " {i:04}: ({}..{}): handler: {}, env_fp: {}\n", - handler.range.start, handler.range.end, handler.range.end, handler.env_fp, + " {i:04}: Range: [{}, {}): Handler: {}, Stack FP {}, Env FP: {}\n", + handler.start, + handler.end, + handler.handler(), + handler.fp, + handler.env_fp, )); } }