diff options
author | Bert Belder <bertbelder@gmail.com> | 2020-02-24 15:53:29 -0800 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2020-02-26 11:44:33 -0800 |
commit | 1a8ef36b71838bfabc633efe6ccf8d32748d7060 (patch) | |
tree | 9d0bc946920a384ab57533d944a3eed782213721 /core/es_isolate.rs | |
parent | 9adcdabd6592e05d0196119deaaf642480a14a90 (diff) |
Upgrade to rusty_v8 v0.3.3 (#4119)
Diffstat (limited to 'core/es_isolate.rs')
-rw-r--r-- | core/es_isolate.rs | 104 |
1 files changed, 50 insertions, 54 deletions
diff --git a/core/es_isolate.rs b/core/es_isolate.rs index 152805f3f..0746804f1 100644 --- a/core/es_isolate.rs +++ b/core/es_isolate.rs @@ -25,6 +25,8 @@ use std::rc::Rc; use std::task::Context; use std::task::Poll; +use crate::isolate::attach_handle_to_error; +use crate::isolate::exception_to_err_result; use crate::isolate::Isolate; use crate::isolate::StartupData; use crate::module_specifier::ModuleSpecifier; @@ -80,25 +82,10 @@ impl DerefMut for EsIsolate { } } +// TODO(ry): a V8 Isolate cannot actually be moved between threads without the +// use of a Locker, therefore EsIsolate should not implement the `Send` trait. unsafe impl Send for EsIsolate {} -impl Drop for EsIsolate { - fn drop(&mut self) { - let isolate = self.core_isolate.v8_isolate.as_ref().unwrap(); - // Clear persistent handles we own. - { - let mut locker = v8::Locker::new(&isolate); - let scope = locker.enter(); - for module in self.modules.info.values_mut() { - module.handle.reset(scope); - } - for handle in self.dyn_import_map.values_mut() { - handle.reset(scope); - } - } - } -} - impl EsIsolate { pub fn new( loader: Rc<dyn Loader + Unpin>, @@ -107,11 +94,11 @@ impl EsIsolate { ) -> Box<Self> { let mut core_isolate = Isolate::new(startup_data, will_snapshot); { - let isolate = core_isolate.v8_isolate.as_mut().unwrap(); - isolate.set_host_initialize_import_meta_object_callback( + let v8_isolate = core_isolate.v8_isolate.as_mut().unwrap(); + v8_isolate.set_host_initialize_import_meta_object_callback( bindings::host_initialize_import_meta_object_callback, ); - isolate.set_host_import_module_dynamically_callback( + v8_isolate.set_host_import_module_dynamically_callback( bindings::host_import_module_dynamically_callback, ); } @@ -147,13 +134,14 @@ impl EsIsolate { name: &str, source: &str, ) -> Result<ModuleId, ErrBox> { - let isolate = self.core_isolate.v8_isolate.as_ref().unwrap(); - let mut locker = v8::Locker::new(&isolate); + let core_isolate = &mut self.core_isolate; + let v8_isolate = core_isolate.v8_isolate.as_mut().unwrap(); + let js_error_create_fn = &*core_isolate.js_error_create_fn; - let mut hs = v8::HandleScope::new(locker.enter()); + let mut hs = v8::HandleScope::new(v8_isolate); let scope = hs.enter(); - assert!(!self.core_isolate.global_context.is_empty()); - let context = self.core_isolate.global_context.get(scope).unwrap(); + assert!(!core_isolate.global_context.is_empty()); + let context = core_isolate.global_context.get(scope).unwrap(); let mut cs = v8::ContextScope::new(scope, context); let scope = cs.enter(); @@ -166,13 +154,15 @@ impl EsIsolate { let mut try_catch = v8::TryCatch::new(scope); let tc = try_catch.enter(); - let maybe_module = v8::script_compiler::compile_module(&isolate, source); + let maybe_module = v8::script_compiler::compile_module(scope, source); if tc.has_caught() { assert!(maybe_module.is_none()); - return self - .core_isolate - .exception_to_err_result(scope, tc.exception().unwrap()); + return exception_to_err_result( + scope, + tc.exception().unwrap(), + js_error_create_fn, + ); } let module = maybe_module.unwrap(); @@ -201,9 +191,10 @@ impl EsIsolate { /// the V8 exception. By default this type is CoreJSError, however it may be a /// different type if Isolate::set_js_error_create() has been used. fn mod_instantiate(&mut self, id: ModuleId) -> Result<(), ErrBox> { - let isolate = self.core_isolate.v8_isolate.as_ref().unwrap(); - let mut locker = v8::Locker::new(isolate); - let mut hs = v8::HandleScope::new(locker.enter()); + let v8_isolate = self.core_isolate.v8_isolate.as_mut().unwrap(); + let js_error_create_fn = &*self.core_isolate.js_error_create_fn; + + let mut hs = v8::HandleScope::new(v8_isolate); let scope = hs.enter(); assert!(!self.core_isolate.global_context.is_empty()); let context = self.core_isolate.global_context.get(scope).unwrap(); @@ -221,7 +212,11 @@ impl EsIsolate { let mut module = module_info.handle.get(scope).unwrap(); if module.get_status() == v8::ModuleStatus::Errored { - self.exception_to_err_result(scope, module.get_exception())? + exception_to_err_result( + scope, + module.get_exception(), + js_error_create_fn, + )? } let result = @@ -230,7 +225,7 @@ impl EsIsolate { Some(_) => Ok(()), None => { let exception = tc.exception().unwrap(); - self.exception_to_err_result(scope, exception) + exception_to_err_result(scope, exception, js_error_create_fn) } } } @@ -241,9 +236,10 @@ impl EsIsolate { &mut self, id: ModuleId, ) -> Result<(), ErrBox> { - let isolate = self.core_isolate.v8_isolate.as_ref().unwrap(); - let mut locker = v8::Locker::new(isolate); - let mut hs = v8::HandleScope::new(locker.enter()); + let v8_isolate = self.core_isolate.v8_isolate.as_mut().unwrap(); + let js_error_create_fn = &*self.core_isolate.js_error_create_fn; + + let mut hs = v8::HandleScope::new(v8_isolate); let scope = hs.enter(); assert!(!self.core_isolate.global_context.is_empty()); let context = self.core_isolate.global_context.get(scope).unwrap(); @@ -271,10 +267,9 @@ impl EsIsolate { match status { v8::ModuleStatus::Evaluated => Ok(()), v8::ModuleStatus::Errored => { - let i = &mut self.core_isolate; let exception = module.get_exception(); - i.exception_to_err_result(scope, exception) - .map_err(|err| i.attach_handle_to_error(scope, err, exception)) + exception_to_err_result(scope, exception, js_error_create_fn) + .map_err(|err| attach_handle_to_error(scope, err, exception)) } other => panic!("Unexpected module status {:?}", other), } @@ -286,12 +281,14 @@ impl EsIsolate { /// the V8 exception. By default this type is CoreJSError, however it may be a /// different type if Isolate::set_js_error_create() has been used. pub fn mod_evaluate(&mut self, id: ModuleId) -> Result<(), ErrBox> { - let isolate = self.core_isolate.v8_isolate.as_ref().unwrap(); - let mut locker = v8::Locker::new(isolate); - let mut hs = v8::HandleScope::new(locker.enter()); + let core_isolate = &mut self.core_isolate; + let v8_isolate = core_isolate.v8_isolate.as_mut().unwrap(); + let js_error_create_fn = &*core_isolate.js_error_create_fn; + + let mut hs = v8::HandleScope::new(v8_isolate); let scope = hs.enter(); - assert!(!self.core_isolate.global_context.is_empty()); - let context = self.core_isolate.global_context.get(scope).unwrap(); + assert!(!core_isolate.global_context.is_empty()); + let context = core_isolate.global_context.get(scope).unwrap(); let mut cs = v8::ContextScope::new(scope, context); let scope = cs.enter(); @@ -316,9 +313,8 @@ impl EsIsolate { match status { v8::ModuleStatus::Evaluated => Ok(()), v8::ModuleStatus::Errored => { - let i = &mut self.core_isolate; let exception = module.get_exception(); - i.exception_to_err_result(scope, exception) + exception_to_err_result(scope, exception, js_error_create_fn) } other => panic!("Unexpected module status {:?}", other), } @@ -362,11 +358,12 @@ impl EsIsolate { id: DynImportId, err: ErrBox, ) -> Result<(), ErrBox> { - let isolate = self.core_isolate.v8_isolate.as_ref().unwrap(); - let mut locker = v8::Locker::new(isolate); - let mut hs = v8::HandleScope::new(locker.enter()); + let core_isolate = &mut self.core_isolate; + let v8_isolate = core_isolate.v8_isolate.as_mut().unwrap(); + + let mut hs = v8::HandleScope::new(v8_isolate); let scope = hs.enter(); - let context = self.core_isolate.global_context.get(scope).unwrap(); + let context = core_isolate.global_context.get(scope).unwrap(); let mut cs = v8::ContextScope::new(scope, context); let scope = cs.enter(); @@ -403,9 +400,8 @@ impl EsIsolate { ) -> Result<(), ErrBox> { debug!("dyn_import_done {} {:?}", id, mod_id); assert!(mod_id != 0); - let isolate = self.core_isolate.v8_isolate.as_ref().unwrap(); - let mut locker = v8::Locker::new(isolate); - let mut hs = v8::HandleScope::new(locker.enter()); + let v8_isolate = self.core_isolate.v8_isolate.as_mut().unwrap(); + let mut hs = v8::HandleScope::new(v8_isolate); let scope = hs.enter(); assert!(!self.core_isolate.global_context.is_empty()); let context = self.core_isolate.global_context.get(scope).unwrap(); |