From 40e157c005be192d6f241d5ee149d980d6b808aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Wed, 19 Apr 2023 00:52:12 +0200 Subject: refactor(core): store v8::Global in an Rc (#18749) Alternative to https://github.com/denoland/deno/pull/18726. This was suggested by @piscisaureus. It's a bit ugly, but it does the work and makes cloning `JsRealm` very cheap, while not requiring invasive changes. Also managed to remove some vector and `v8::Global` clones which yields about 5% improvement in the "async_ops_deferred.js" benchmark. This PR: ``` time 1689 ms rate 592066 time 1722 ms rate 580720 time 1629 ms rate 613873 time 1578 ms rate 633713 time 1585 ms rate 630914 time 1574 ms rate 635324 ``` `main` branch: ``` time 1687 ms rate 592768 time 1676 ms rate 596658 time 1651 ms rate 605693 time 1652 ms rate 605326 time 1638 ms rate 610500 ``` --- core/error.rs | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) (limited to 'core/error.rs') diff --git a/core/error.rs b/core/error.rs index 64898678a..3d0b20b0a 100644 --- a/core/error.rs +++ b/core/error.rs @@ -210,15 +210,18 @@ impl JsStackFrame { // V8's column numbers are 0-based, we want 1-based. let c = message.get_start_column() as i64 + 1; let state_rc = JsRuntime::state(scope); - let state = &mut *state_rc.borrow_mut(); - if let Some(source_map_getter) = &state.source_map_getter { - let (f, l, c) = apply_source_map( - f, - l, - c, - &mut state.source_map_cache, - source_map_getter.as_ref(), - ); + let (getter, cache) = { + let state = state_rc.borrow(); + ( + state.source_map_getter.clone(), + state.source_map_cache.clone(), + ) + }; + + if let Some(source_map_getter) = getter { + let mut cache = cache.borrow_mut(); + let (f, l, c) = + apply_source_map(f, l, c, &mut cache, &**source_map_getter); Some(JsStackFrame::from_location(Some(f), Some(l), Some(c))) } else { Some(JsStackFrame::from_location(Some(f), Some(l), Some(c))) @@ -280,8 +283,15 @@ impl JsError { } { let state_rc = JsRuntime::state(scope); - let state = &mut *state_rc.borrow_mut(); - if let Some(source_map_getter) = &state.source_map_getter { + let (getter, cache) = { + let state = state_rc.borrow(); + ( + state.source_map_getter.clone(), + state.source_map_cache.clone(), + ) + }; + if let Some(source_map_getter) = getter { + let mut cache = cache.borrow_mut(); for (i, frame) in frames.iter().enumerate() { if let (Some(file_name), Some(line_number)) = (&frame.file_name, frame.line_number) @@ -290,8 +300,8 @@ impl JsError { source_line = get_source_line( file_name, line_number, - &mut state.source_map_cache, - source_map_getter.as_ref(), + &mut cache, + &**source_map_getter, ); source_line_frame_index = Some(i); break; @@ -405,8 +415,16 @@ impl JsError { } { let state_rc = JsRuntime::state(scope); - let state = &mut *state_rc.borrow_mut(); - if let Some(source_map_getter) = &state.source_map_getter { + let (getter, cache) = { + let state = state_rc.borrow(); + ( + state.source_map_getter.clone(), + state.source_map_cache.clone(), + ) + }; + if let Some(source_map_getter) = getter { + let mut cache = cache.borrow_mut(); + for (i, frame) in frames.iter().enumerate() { if let (Some(file_name), Some(line_number)) = (&frame.file_name, frame.line_number) @@ -415,8 +433,8 @@ impl JsError { source_line = get_source_line( file_name, line_number, - &mut state.source_map_cache, - source_map_getter.as_ref(), + &mut cache, + &**source_map_getter, ); source_line_frame_index = Some(i); break; -- cgit v1.2.3