From 66fd6f286641d4d2491d7b4bb314bd7e7eff16d8 Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Wed, 13 Mar 2024 21:23:37 -0600 Subject: fix(cli): unbreak extension example and fix __runtime_js_sources (#22906) Better example to close https://github.com/denoland/deno/issues/22600 --------- Signed-off-by: Matt Mastracci --- runtime/Cargo.toml | 8 ++--- runtime/examples/extension/bootstrap.js | 7 ++++ runtime/examples/extension/main.js | 4 +++ runtime/examples/extension/main.rs | 44 ++++++++++++++++++++++++ runtime/examples/extension_with_esm/bootstrap.js | 5 --- runtime/examples/extension_with_esm/main.js | 4 --- runtime/examples/extension_with_esm/main.rs | 36 ------------------- runtime/examples/extension_with_ops/main.js | 2 -- runtime/examples/extension_with_ops/main.rs | 38 -------------------- runtime/ops/bootstrap.rs | 13 ++++++- runtime/worker.rs | 7 +++- 11 files changed, 75 insertions(+), 93 deletions(-) create mode 100644 runtime/examples/extension/bootstrap.js create mode 100644 runtime/examples/extension/main.js create mode 100644 runtime/examples/extension/main.rs delete mode 100644 runtime/examples/extension_with_esm/bootstrap.js delete mode 100644 runtime/examples/extension_with_esm/main.js delete mode 100644 runtime/examples/extension_with_esm/main.rs delete mode 100644 runtime/examples/extension_with_ops/main.js delete mode 100644 runtime/examples/extension_with_ops/main.rs (limited to 'runtime') diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index c27ae1012..484266888 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/bootstrap.js b/runtime/examples/extension/bootstrap.js new file mode 100644 index 000000000..9461acb84 --- /dev/null +++ b/runtime/examples/extension/bootstrap.js @@ -0,0 +1,7 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +import { op_hello } from "ext:core/ops"; +function hello() { + op_hello("world"); +} + +globalThis.Extension = { hello }; diff --git a/runtime/examples/extension/main.js b/runtime/examples/extension/main.js new file mode 100644 index 000000000..4d6e4e3b7 --- /dev/null +++ b/runtime/examples/extension/main.js @@ -0,0 +1,4 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +console.log("Hello world from JS!"); +console.log(Deno.build); +Extension.hello(); diff --git a/runtime/examples/extension/main.rs b/runtime/examples/extension/main.rs new file mode 100644 index 000000000..0026d0de0 --- /dev/null +++ b/runtime/examples/extension/main.rs @@ -0,0 +1,44 @@ +// 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; + +#[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", "bootstrap.js"] +); + +#[tokio::main] +async fn main() -> Result<(), AnyError> { + 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(), + WorkerOptions { + module_loader: Rc::new(FsModuleLoader), + extensions: vec![hello_runtime::init_ops_and_esm()], + ..Default::default() + }, + ); + worker.execute_main_module(&main_module).await?; + worker.run_event_loop(false).await?; + Ok(()) +} diff --git a/runtime/examples/extension_with_esm/bootstrap.js b/runtime/examples/extension_with_esm/bootstrap.js deleted file mode 100644 index 7cbff9cb3..000000000 --- a/runtime/examples/extension_with_esm/bootstrap.js +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. -function hello() { - console.log("Hello from extension!"); -} -globalThis.Extension = { hello }; diff --git a/runtime/examples/extension_with_esm/main.js b/runtime/examples/extension_with_esm/main.js deleted file mode 100644 index fe9be8c26..000000000 --- a/runtime/examples/extension_with_esm/main.js +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. -console.log("Hello world!"); -console.log(Deno); -Extension.hello(); diff --git a/runtime/examples/extension_with_esm/main.rs b/runtime/examples/extension_with_esm/main.rs deleted file mode 100644 index c635761e1..000000000 --- a/runtime/examples/extension_with_esm/main.rs +++ /dev/null @@ -1,36 +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::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, - esm_entry_point = "ext:hello_runtime/bootstrap.js", - esm = [dir "examples/extension_with_esm", "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 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_and_esm()], - ..Default::default() - }, - ); - worker.execute_main_module(&main_module).await?; - worker.run_event_loop(false).await?; - Ok(()) -} diff --git a/runtime/examples/extension_with_ops/main.js b/runtime/examples/extension_with_ops/main.js deleted file mode 100644 index d7cdc1ec4..000000000 --- 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 f0b4364b5..000000000 --- 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 7de532a9f..cbb87db88 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 97ea53980..2fb32c766 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) -- cgit v1.2.3