Exit HandleScope before snapshotting (#4168)

The V8 documentation explicitly states that SnapshotCreator::CreateBlob()
should not be called from within a HandleScope.

Additionally, this patch removes some non-functional error handling code
from the deno_core::Isolate::snapshot() method.
This commit is contained in:
Bert Belder 2020-02-27 23:28:33 -08:00
parent 9075daa2e3
commit bc7dbfafff
No known key found for this signature in database
GPG key ID: 7A77887B2E2ED461
2 changed files with 13 additions and 13 deletions

View file

@ -465,16 +465,18 @@ impl Isolate {
/// ErrBox can be downcast to a type that exposes additional information about /// 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 /// 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. /// different type if Isolate::set_js_error_create() has been used.
pub fn snapshot(&mut self) -> Result<v8::OwnedStartupData, ErrBox> { pub fn snapshot(&mut self) -> v8::OwnedStartupData {
assert!(self.snapshot_creator.is_some()); assert!(self.snapshot_creator.is_some());
// 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 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 mut hs = v8::HandleScope::new(v8_isolate);
let scope = hs.enter(); let scope = hs.enter();
self.global_context.reset(scope); self.global_context.reset(scope);
}
let snapshot_creator = self.snapshot_creator.as_mut().unwrap(); let snapshot_creator = self.snapshot_creator.as_mut().unwrap();
let snapshot = snapshot_creator let snapshot = snapshot_creator
@ -482,7 +484,7 @@ impl Isolate {
.unwrap(); .unwrap();
self.has_snapshotted = true; 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 snapshot = {
let mut isolate = Isolate::new(StartupData::None, true); let mut isolate = Isolate::new(StartupData::None, true);
js_check(isolate.execute("a.js", "a = 1 + 2")); js_check(isolate.execute("a.js", "a = 1 + 2"));
let s = isolate.snapshot().unwrap(); isolate.snapshot()
drop(isolate);
s
}; };
let startup_data = StartupData::OwnedSnapshot(snapshot); let startup_data = StartupData::OwnedSnapshot(snapshot);

View file

@ -232,7 +232,7 @@ fn write_snapshot(
snapshot_filename: &Path, snapshot_filename: &Path,
) -> Result<(), ErrBox> { ) -> Result<(), ErrBox> {
println!("Creating snapshot..."); println!("Creating snapshot...");
let snapshot = runtime_isolate.snapshot()?; let snapshot = runtime_isolate.snapshot();
let snapshot_slice: &[u8] = &*snapshot; let snapshot_slice: &[u8] = &*snapshot;
println!("Snapshot size: {}", snapshot_slice.len()); println!("Snapshot size: {}", snapshot_slice.len());
fs::write(&snapshot_filename, snapshot_slice)?; fs::write(&snapshot_filename, snapshot_slice)?;