summaryrefslogtreecommitdiff
path: root/core/snapshot_util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/snapshot_util.rs')
-rw-r--r--core/snapshot_util.rs83
1 files changed, 61 insertions, 22 deletions
diff --git a/core/snapshot_util.rs b/core/snapshot_util.rs
index 20019f5cc..05a196f50 100644
--- a/core/snapshot_util.rs
+++ b/core/snapshot_util.rs
@@ -4,9 +4,10 @@ use std::path::Path;
use std::path::PathBuf;
use std::time::Instant;
+use crate::runtime::RuntimeSnapshotOptions;
use crate::ExtModuleLoaderCb;
use crate::Extension;
-use crate::JsRuntime;
+use crate::JsRuntimeForSnapshot;
use crate::RuntimeOptions;
use crate::Snapshot;
@@ -21,16 +22,28 @@ pub struct CreateSnapshotOptions {
pub snapshot_module_load_cb: Option<ExtModuleLoaderCb>,
}
-pub fn create_snapshot(create_snapshot_options: CreateSnapshotOptions) {
+pub struct CreateSnapshotOutput {
+ /// Any files marked as LoadedFromFsDuringSnapshot are collected here and should be
+ /// printed as 'cargo:rerun-if-changed' lines from your build script.
+ pub files_loaded_during_snapshot: Vec<PathBuf>,
+}
+
+#[must_use = "The files listed by create_snapshot should be printed as 'cargo:rerun-if-changed' lines"]
+pub fn create_snapshot(
+ create_snapshot_options: CreateSnapshotOptions,
+) -> CreateSnapshotOutput {
let mut mark = Instant::now();
- let js_runtime = JsRuntime::new(RuntimeOptions {
- will_snapshot: true,
- startup_snapshot: create_snapshot_options.startup_snapshot,
- extensions: create_snapshot_options.extensions,
- snapshot_module_load_cb: create_snapshot_options.snapshot_module_load_cb,
- ..Default::default()
- });
+ let js_runtime = JsRuntimeForSnapshot::new(
+ RuntimeOptions {
+ startup_snapshot: create_snapshot_options.startup_snapshot,
+ extensions: create_snapshot_options.extensions,
+ ..Default::default()
+ },
+ RuntimeSnapshotOptions {
+ snapshot_module_load_cb: create_snapshot_options.snapshot_module_load_cb,
+ },
+ );
println!(
"JsRuntime for snapshot prepared, took {:#?} ({})",
Instant::now().saturating_duration_since(mark),
@@ -38,6 +51,22 @@ pub fn create_snapshot(create_snapshot_options: CreateSnapshotOptions) {
);
mark = Instant::now();
+ let mut files_loaded_during_snapshot = vec![];
+ for source in js_runtime
+ .extensions()
+ .iter()
+ .flat_map(|e| vec![e.get_esm_sources(), e.get_js_sources()])
+ .flatten()
+ .flatten()
+ {
+ use crate::ExtensionFileSourceCode;
+ if let ExtensionFileSourceCode::LoadedFromFsDuringSnapshot(path) =
+ &source.code
+ {
+ files_loaded_during_snapshot.push(path.clone());
+ }
+ }
+
let snapshot = js_runtime.snapshot();
let snapshot_slice: &[u8] = &snapshot;
println!(
@@ -83,6 +112,9 @@ pub fn create_snapshot(create_snapshot_options: CreateSnapshotOptions) {
Instant::now().saturating_duration_since(mark),
create_snapshot_options.snapshot_path.display(),
);
+ CreateSnapshotOutput {
+ files_loaded_during_snapshot,
+ }
}
pub type FilterFn = Box<dyn Fn(&PathBuf) -> bool>;
@@ -121,29 +153,36 @@ fn data_error_to_panic(err: v8::DataError) -> ! {
}
}
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub(crate) enum SnapshotOptions {
- Load,
- CreateFromExisting,
+ Load(Snapshot),
+ CreateFromExisting(Snapshot),
Create,
None,
}
impl SnapshotOptions {
+ pub fn new_from(snapshot: Option<Snapshot>, will_snapshot: bool) -> Self {
+ match (snapshot, will_snapshot) {
+ (Some(snapshot), true) => Self::CreateFromExisting(snapshot),
+ (None, true) => Self::Create,
+ (Some(snapshot), false) => Self::Load(snapshot),
+ (None, false) => Self::None,
+ }
+ }
+
pub fn loaded(&self) -> bool {
- matches!(self, Self::Load | Self::CreateFromExisting)
+ matches!(self, Self::Load(_) | Self::CreateFromExisting(_))
}
pub fn will_snapshot(&self) -> bool {
- matches!(self, Self::Create | Self::CreateFromExisting)
+ matches!(self, Self::Create | Self::CreateFromExisting(_))
}
- pub fn from_bools(snapshot_loaded: bool, will_snapshot: bool) -> Self {
- match (snapshot_loaded, will_snapshot) {
- (true, true) => Self::CreateFromExisting,
- (false, true) => Self::Create,
- (true, false) => Self::Load,
- (false, false) => Self::None,
+ pub fn snapshot(self) -> Option<Snapshot> {
+ match self {
+ Self::CreateFromExisting(snapshot) => Some(snapshot),
+ Self::Load(snapshot) => Some(snapshot),
+ _ => None,
}
}
}
@@ -218,9 +257,9 @@ pub(crate) fn set_snapshotted_data(
/// Returns an isolate set up for snapshotting.
pub(crate) fn create_snapshot_creator(
external_refs: &'static v8::ExternalReferences,
- maybe_startup_snapshot: Option<Snapshot>,
+ maybe_startup_snapshot: SnapshotOptions,
) -> v8::OwnedIsolate {
- if let Some(snapshot) = maybe_startup_snapshot {
+ if let Some(snapshot) = maybe_startup_snapshot.snapshot() {
match snapshot {
Snapshot::Static(data) => {
v8::Isolate::snapshot_creator_from_existing_snapshot(