1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-22 15:06:54 -05:00

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
/// 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<v8::OwnedStartupData, ErrBox> {
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);

View file

@ -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)?;