Files
codex/codex-rs/v8-poc/src/lib.rs
T
Channing CongerandGitHub 1350477150 Add v8-poc consumer of our new built v8 (#15203)
This adds a dummy v8-poc project that in Cargo links against our
prebuilt binaries and the ones provided by rusty_v8 for non musl
platforms. This demonstrates that we can successfully link and use v8 on
all platforms that we want to target.

In bazel things are slightly more complicated. Since the libraries as
published have libc++ linked in already we end up with a lot of double
linked symbols if we try to use them in bazel land. Instead we fall back
to building rusty_v8 and v8 from source (cached of course) on the
platforms we ship to.

There is likely some compatibility drift in the windows bazel builder
that we'll need to reconcile before we can re-enable them. I'm happy to
be on the hook to unwind that.
2026-03-20 12:08:25 -07:00

66 lines
1.8 KiB
Rust

//! Bazel-wired proof-of-concept crate reserved for future V8 experiments.
/// Returns the Bazel label for this proof-of-concept crate.
#[must_use]
pub fn bazel_target() -> &'static str {
"//codex-rs/v8-poc:v8-poc"
}
/// Returns the embedded V8 version.
#[must_use]
pub fn embedded_v8_version() -> &'static str {
v8::V8::get_version()
}
#[cfg(test)]
mod tests {
use pretty_assertions::assert_eq;
use std::sync::Once;
use super::bazel_target;
fn initialize_v8() {
static INIT: Once = Once::new();
INIT.call_once(|| {
v8::V8::initialize_platform(v8::new_default_platform(0, false).make_shared());
v8::V8::initialize();
});
}
fn evaluate_expression(expression: &str) -> String {
initialize_v8();
let isolate = &mut v8::Isolate::new(Default::default());
v8::scope!(let scope, isolate);
let context = v8::Context::new(scope, Default::default());
let scope = &mut v8::ContextScope::new(scope, context);
let source = v8::String::new(scope, expression).expect("expression should be valid UTF-8");
let script = v8::Script::compile(scope, source, None).expect("expression should compile");
let result = script.run(scope).expect("expression should evaluate");
result.to_rust_string_lossy(scope)
}
#[test]
fn exposes_expected_bazel_target() {
assert_eq!(bazel_target(), "//codex-rs/v8-poc:v8-poc");
}
#[test]
fn exposes_embedded_v8_version() {
assert!(!super::embedded_v8_version().is_empty());
}
#[test]
fn evaluates_integer_addition() {
assert_eq!(evaluate_expression("1 + 2"), "3");
}
#[test]
fn evaluates_string_concatenation() {
assert_eq!(evaluate_expression("'hello ' + 'world'"), "hello world");
}
}