summaryrefslogtreecommitdiff
path: root/core/snapshot_creator.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2019-06-04 19:35:51 +0200
committerRyan Dahl <ry@tinyclouds.org>2019-07-08 18:18:28 -0400
commitd641782c823317a2d2f64d646a0d5b8b6c22b771 (patch)
treea03beb0939a46333636d0de68eee052978103cfe /core/snapshot_creator.rs
parent79c3439f269f1e0e24003518e363988fa4f1da33 (diff)
Rewrite snapshot_creator in Rust
Diffstat (limited to 'core/snapshot_creator.rs')
-rw-r--r--core/snapshot_creator.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/core/snapshot_creator.rs b/core/snapshot_creator.rs
new file mode 100644
index 000000000..1d43b9174
--- /dev/null
+++ b/core/snapshot_creator.rs
@@ -0,0 +1,44 @@
+// Note: This is a nearly identical rewrite of core/libdeno/snapshot_creator.cc
+// but in Rust.
+//
+// This snapshot program is considered "basic" because the code being
+// snapshotted cannot call ops.
+
+extern crate deno;
+
+use deno::js_check;
+use deno::Isolate;
+use deno::StartupData;
+use std::env;
+use std::io::Write;
+
+fn main() {
+ let args: Vec<String> = env::args().collect();
+ // NOTE: `--help` arg will display V8 help and exit
+ let args = deno::v8_set_flags(args);
+
+ let (snapshot_out_bin, js_filename) = if args.len() == 3 {
+ (args[1].clone(), args[2].clone())
+ } else {
+ eprintln!("Usage: snapshot_creator <out_filename> <js_filename>");
+ std::process::exit(1);
+ };
+
+ let js_source =
+ std::fs::read(&js_filename).expect("couldn't read js_filename");
+ let js_source_str = std::str::from_utf8(&js_source).unwrap();
+
+ let will_snapshot = true;
+ let mut isolate = Isolate::new(StartupData::None, will_snapshot);
+
+ js_check(isolate.execute(&js_filename, js_source_str));
+
+ let snapshot = isolate.snapshot().expect("error snapshotting");
+
+ let mut out_file = std::fs::File::create(snapshot_out_bin).unwrap();
+ let snapshot_slice =
+ unsafe { std::slice::from_raw_parts(snapshot.data_ptr, snapshot.data_len) };
+ out_file
+ .write_all(snapshot_slice)
+ .expect("Failed to write snapshot file");
+}