Skip to main content

codex_code_mode/
v8_init.rs

1use std::sync::OnceLock;
2
3/// Controls whether V8 may generate executable code at runtime.
4#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
5pub enum V8JitMode {
6    #[default]
7    Enabled,
8    Disabled,
9}
10
11struct V8Initialization {
12    _platform: v8::SharedRef<v8::Platform>,
13    jit_mode: V8JitMode,
14}
15
16static V8_INITIALIZATION: OnceLock<Result<V8Initialization, String>> = OnceLock::new();
17
18/// Initializes the process-wide V8 platform with the requested JIT mode.
19///
20/// Call this before executing any code-mode cells when JIT must be disabled.
21/// V8 cannot change JIT mode after initialization, so a later call requesting
22/// a different mode returns an error. Code mode initializes V8 with JIT enabled
23/// by default when this function has not been called explicitly.
24pub fn initialize_v8(jit_mode: V8JitMode) -> Result<(), String> {
25    match V8_INITIALIZATION.get_or_init(|| initialize_v8_with_mode(jit_mode)) {
26        Ok(initialization) if initialization.jit_mode == jit_mode => Ok(()),
27        Ok(initialization) => Err(format!(
28            "V8 was already initialized with JIT {}",
29            initialization.jit_mode.description()
30        )),
31        Err(error_text) => Err(error_text.clone()),
32    }
33}
34
35pub(crate) fn ensure_v8_initialized() -> Result<(), String> {
36    match V8_INITIALIZATION.get_or_init(|| initialize_v8_with_mode(V8JitMode::Enabled)) {
37        Ok(_) => Ok(()),
38        Err(error_text) => Err(error_text.clone()),
39    }
40}
41
42fn initialize_v8_with_mode(jit_mode: V8JitMode) -> Result<V8Initialization, String> {
43    v8::icu::set_common_data_77(deno_core_icudata::ICU_DATA)
44        .map_err(|error_code| format!("failed to initialize ICU data: {error_code}"))?;
45    match jit_mode {
46        V8JitMode::Enabled => {}
47        V8JitMode::Disabled => v8::V8::set_flags_from_string("--jitless"),
48    }
49    let platform = v8::new_default_platform(0, false).make_shared();
50    v8::V8::initialize_platform(platform.clone());
51    v8::V8::initialize();
52    Ok(V8Initialization {
53        _platform: platform,
54        jit_mode,
55    })
56}
57
58impl V8JitMode {
59    fn description(self) -> &'static str {
60        match self {
61            Self::Enabled => "enabled",
62            Self::Disabled => "disabled",
63        }
64    }
65}