summaryrefslogtreecommitdiff
path: root/core/snapshot_creator.rs
blob: 1d43b91748b61efafaaf9362d7836d9b6ba88d10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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");
}