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
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
use std::sync::Once;

pub fn js_exec<'s>(
  scope: &mut v8::HandleScope<'s>,
  src: &str,
) -> v8::Local<'s, v8::Value> {
  let code = v8::String::new(scope, src).unwrap();
  let script = v8::Script::compile(scope, code, None).unwrap();
  script.run(scope).unwrap()
}

pub fn v8_init() {
  let platform = v8::new_default_platform(0, false).make_shared();
  v8::V8::initialize_platform(platform);
  v8::V8::initialize();
}

pub fn v8_shutdown() {
  // SAFETY: this is safe, because all isolates have been shut down already.
  unsafe {
    v8::V8::dispose();
  }
  v8::V8::dispose_platform();
}

pub fn v8_do(f: impl FnOnce()) {
  static V8_INIT: Once = Once::new();
  V8_INIT.call_once(|| {
    v8_init();
  });
  f();
  // v8_shutdown();
}