diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-04-19 00:52:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-19 00:52:12 +0200 |
commit | 40e157c005be192d6f241d5ee149d980d6b808aa (patch) | |
tree | 3b92ce14f9671ea788524735557aac567df44069 /core/error.rs | |
parent | edca01c35e7f3f76ec98dd912314db16995e2a4f (diff) |
refactor(core): store v8::Global<v8::Context> 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
```
Diffstat (limited to 'core/error.rs')
-rw-r--r-- | core/error.rs | 52 |
1 files changed, 35 insertions, 17 deletions
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; |