diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index c27ae10121..484266888c 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -33,12 +33,8 @@ name = "deno_runtime" path = "lib.rs" [[example]] -name = "extension_with_esm" -path = "examples/extension_with_esm/main.rs" - -[[example]] -name = "extension_with_ops" -path = "examples/extension_with_ops/main.rs" +name = "extension" +path = "examples/extension/main.rs" [build-dependencies] deno_ast.workspace = true diff --git a/runtime/examples/extension_with_esm/bootstrap.js b/runtime/examples/extension/bootstrap.js similarity index 67% rename from runtime/examples/extension_with_esm/bootstrap.js rename to runtime/examples/extension/bootstrap.js index 7cbff9cb3b..9461acb84a 100644 --- a/runtime/examples/extension_with_esm/bootstrap.js +++ b/runtime/examples/extension/bootstrap.js @@ -1,5 +1,7 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +import { op_hello } from "ext:core/ops"; function hello() { - console.log("Hello from extension!"); + op_hello("world"); } + globalThis.Extension = { hello }; diff --git a/runtime/examples/extension_with_esm/main.js b/runtime/examples/extension/main.js similarity index 60% rename from runtime/examples/extension_with_esm/main.js rename to runtime/examples/extension/main.js index fe9be8c265..4d6e4e3b7d 100644 --- a/runtime/examples/extension_with_esm/main.js +++ b/runtime/examples/extension/main.js @@ -1,4 +1,4 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. -console.log("Hello world!"); -console.log(Deno); +console.log("Hello world from JS!"); +console.log(Deno.build); Extension.hello(); diff --git a/runtime/examples/extension_with_esm/main.rs b/runtime/examples/extension/main.rs similarity index 74% rename from runtime/examples/extension_with_esm/main.rs rename to runtime/examples/extension/main.rs index c635761e12..0026d0de04 100644 --- a/runtime/examples/extension_with_esm/main.rs +++ b/runtime/examples/extension/main.rs @@ -4,23 +4,31 @@ use std::path::Path; use std::rc::Rc; use deno_core::error::AnyError; +use deno_core::op2; use deno_core::FsModuleLoader; use deno_core::ModuleSpecifier; use deno_runtime::permissions::PermissionsContainer; use deno_runtime::worker::MainWorker; use deno_runtime::worker::WorkerOptions; +#[op2(fast)] +fn op_hello(#[string] text: &str) { + println!("Hello {} from an op!", text); +} + deno_core::extension!( hello_runtime, + ops = [op_hello], esm_entry_point = "ext:hello_runtime/bootstrap.js", - esm = [dir "examples/extension_with_esm", "bootstrap.js"] + esm = [dir "examples/extension", "bootstrap.js"] ); #[tokio::main] async fn main() -> Result<(), AnyError> { - let js_path = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("examples/extension_with_esm/main.js"); + let js_path = + Path::new(env!("CARGO_MANIFEST_DIR")).join("examples/extension/main.js"); let main_module = ModuleSpecifier::from_file_path(js_path).unwrap(); + eprintln!("Running {main_module}..."); let mut worker = MainWorker::bootstrap_from_options( main_module.clone(), PermissionsContainer::allow_all(), diff --git a/runtime/examples/extension_with_ops/main.js b/runtime/examples/extension_with_ops/main.js deleted file mode 100644 index d7cdc1ec43..0000000000 --- a/runtime/examples/extension_with_ops/main.js +++ /dev/null @@ -1,2 +0,0 @@ -// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. -Deno[Deno.internal].core.ops.op_hello("World"); diff --git a/runtime/examples/extension_with_ops/main.rs b/runtime/examples/extension_with_ops/main.rs deleted file mode 100644 index f0b4364b5d..0000000000 --- a/runtime/examples/extension_with_ops/main.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. - -use std::path::Path; -use std::rc::Rc; - -use deno_core::error::AnyError; -use deno_core::op2; -use deno_core::FsModuleLoader; -use deno_core::ModuleSpecifier; -use deno_runtime::permissions::PermissionsContainer; -use deno_runtime::worker::MainWorker; -use deno_runtime::worker::WorkerOptions; - -deno_core::extension!(hello_runtime, ops = [op_hello]); - -#[op2(fast)] -fn op_hello(#[string] text: &str) { - println!("Hello {}!", text); -} - -#[tokio::main] -async fn main() -> Result<(), AnyError> { - let js_path = Path::new(env!("CARGO_MANIFEST_DIR")) - .join("examples/extension_with_ops/main.js"); - let main_module = ModuleSpecifier::from_file_path(js_path).unwrap(); - let mut worker = MainWorker::bootstrap_from_options( - main_module.clone(), - PermissionsContainer::allow_all(), - WorkerOptions { - module_loader: Rc::new(FsModuleLoader), - extensions: vec![hello_runtime::init_ops()], - ..Default::default() - }, - ); - worker.execute_main_module(&main_module).await?; - worker.run_event_loop(false).await?; - Ok(()) -} diff --git a/runtime/ops/bootstrap.rs b/runtime/ops/bootstrap.rs index 7de532a9f5..cbb87db886 100644 --- a/runtime/ops/bootstrap.rs +++ b/runtime/ops/bootstrap.rs @@ -30,7 +30,7 @@ deno_core::extension!( }, ); -#[derive(Serialize, Default)] +#[derive(Serialize)] #[serde(rename_all = "camelCase")] pub struct SnapshotOptions { pub deno_version: String, @@ -39,6 +39,17 @@ pub struct SnapshotOptions { pub target: String, } +impl Default for SnapshotOptions { + fn default() -> Self { + Self { + deno_version: "dev".to_owned(), + ts_version: "n/a".to_owned(), + v8_version: deno_core::v8_version(), + target: std::env::consts::ARCH.to_owned(), + } + } +} + // Note: Called at snapshot time, op perf is not a concern. #[op2] #[serde] diff --git a/runtime/worker.rs b/runtime/worker.rs index 97ea539803..2fb32c766b 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -566,11 +566,16 @@ impl MainWorker { } let scope = &mut self.js_runtime.handle_scope(); + let scope = &mut v8::TryCatch::new(scope); let args = options.as_v8(scope); let bootstrap_fn = self.bootstrap_fn_global.take().unwrap(); let bootstrap_fn = v8::Local::new(scope, bootstrap_fn); let undefined = v8::undefined(scope); - bootstrap_fn.call(scope, undefined.into(), &[args]).unwrap(); + bootstrap_fn.call(scope, undefined.into(), &[args]); + if let Some(exception) = scope.exception() { + let error = JsError::from_v8_exception(scope, exception); + panic!("Bootstrap exception: {error}"); + } } /// See [JsRuntime::execute_script](deno_core::JsRuntime::execute_script)