mirror of
https://github.com/denoland/deno.git
synced 2024-11-26 16:09:27 -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:
parent
9075daa2e3
commit
bc7dbfafff
2 changed files with 13 additions and 13 deletions
|
@ -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());
|
||||
|
||||
// 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 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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
|
@ -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)?;
|
||||
|
|
Loading…
Reference in a new issue