diff --git a/core/isolate.rs b/core/isolate.rs index cbbbe79a1a..e510555222 100644 --- a/core/isolate.rs +++ b/core/isolate.rs @@ -465,16 +465,18 @@ impl Isolate { /// ErrBox can be downcast to a type that exposes additional information about /// 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 snapshot(&mut self) -> Result { + pub fn snapshot(&mut self) -> v8::OwnedStartupData { assert!(self.snapshot_creator.is_some()); - let v8_isolate = self.v8_isolate.as_mut().unwrap(); - let js_error_create_fn = &*self.js_error_create_fn; - let last_exception = &mut self.last_exception; - - let mut hs = v8::HandleScope::new(v8_isolate); - let scope = hs.enter(); - self.global_context.reset(scope); + // Note: create_blob() method must not be called from within a HandleScope. + // The HandleScope created here is exited at the end of the block. + // TODO(piscisaureus): The rusty_v8 type system should enforce this. + { + let v8_isolate = self.v8_isolate.as_mut().unwrap(); + let mut hs = v8::HandleScope::new(v8_isolate); + let scope = hs.enter(); + self.global_context.reset(scope); + } let snapshot_creator = self.snapshot_creator.as_mut().unwrap(); let snapshot = snapshot_creator @@ -482,7 +484,7 @@ impl Isolate { .unwrap(); self.has_snapshotted = true; - check_last_exception(last_exception, js_error_create_fn).map(|_| snapshot) + snapshot } } @@ -1160,9 +1162,7 @@ pub mod tests { let snapshot = { let mut isolate = Isolate::new(StartupData::None, true); js_check(isolate.execute("a.js", "a = 1 + 2")); - let s = isolate.snapshot().unwrap(); - drop(isolate); - s + isolate.snapshot() }; let startup_data = StartupData::OwnedSnapshot(snapshot); diff --git a/deno_typescript/lib.rs b/deno_typescript/lib.rs index 8ee2c2c01b..f10ce5b483 100644 --- a/deno_typescript/lib.rs +++ b/deno_typescript/lib.rs @@ -232,7 +232,7 @@ fn write_snapshot( snapshot_filename: &Path, ) -> Result<(), ErrBox> { println!("Creating snapshot..."); - let snapshot = runtime_isolate.snapshot()?; + let snapshot = runtime_isolate.snapshot(); let snapshot_slice: &[u8] = &*snapshot; println!("Snapshot size: {}", snapshot_slice.len()); fs::write(&snapshot_filename, snapshot_slice)?;