summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert Belder <bertbelder@gmail.com>2020-02-27 23:28:33 -0800
committerBert Belder <bertbelder@gmail.com>2020-02-28 09:04:28 -0800
commitbc7dbfafff7f73dc78f230c36c947669e9c7935c (patch)
tree61fc7412b861f02ac68d0fb2d699bbf85a774abd
parent9075daa2e3cfac0cdb13f5d926e39d42890982d5 (diff)
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.
-rw-r--r--core/isolate.rs24
-rw-r--r--deno_typescript/lib.rs2
2 files changed, 13 insertions, 13 deletions
diff --git a/core/isolate.rs b/core/isolate.rs
index cbbbe79a1..e51055522 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<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);
diff --git a/deno_typescript/lib.rs b/deno_typescript/lib.rs
index 8ee2c2c01..f10ce5b48 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)?;