From cdfd32dd74d6286afe99fb5400e3dc0e9f2cec49 Mon Sep 17 00:00:00 2001 From: andy finch Date: Mon, 18 Mar 2019 20:03:37 -0400 Subject: Re-implement init scripts in core (#1958) Re-enables arm64 CI test --- src/cli.rs | 12 ++++----- src/compiler.rs | 6 ++--- src/isolate.rs | 13 ++------- src/isolate_init.rs | 78 ----------------------------------------------------- src/main.rs | 6 ++--- src/ops.rs | 38 ++++---------------------- src/startup_data.rs | 57 +++++++++++++++++++++++++++++++++++++++ src/workers.rs | 20 +++++++------- 8 files changed, 86 insertions(+), 144 deletions(-) delete mode 100644 src/isolate_init.rs create mode 100644 src/startup_data.rs (limited to 'src') diff --git a/src/cli.rs b/src/cli.rs index d80587013..42b2b29f8 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -3,7 +3,6 @@ #![allow(dead_code)] use crate::errors::DenoResult; -use crate::isolate_init::IsolateInit; use crate::isolate_state::IsolateState; use crate::ops; use crate::permissions::DenoPermissions; @@ -11,6 +10,7 @@ use deno_core::deno_buf; use deno_core::deno_mod; use deno_core::Behavior; use deno_core::Op; +use deno_core::StartupData; use std::sync::atomic::Ordering; use std::sync::Arc; @@ -21,19 +21,19 @@ pub type Buf = Box<[u8]>; /// Implements deno_core::Behavior for the main Deno command-line. pub struct Cli { - init: IsolateInit, + startup_data: Option, pub state: Arc, pub permissions: Arc, // TODO(ry) move to IsolateState } impl Cli { pub fn new( - init: IsolateInit, + startup_data: Option, state: Arc, permissions: DenoPermissions, ) -> Self { Self { - init, + startup_data, state, permissions: Arc::new(permissions), } @@ -66,8 +66,8 @@ impl Cli { } impl Behavior for Cli { - fn startup_snapshot(&mut self) -> Option { - self.init.snapshot.take() + fn startup_data(&mut self) -> Option { + self.startup_data.take() } fn resolve(&mut self, specifier: &str, referrer: deno_mod) -> deno_mod { diff --git a/src/compiler.rs b/src/compiler.rs index 9edae8cf9..2d6e4a4b7 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -1,12 +1,12 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use crate::cli::Buf; -use crate::isolate_init; use crate::isolate_state::IsolateState; use crate::msg; use crate::permissions::{DenoPermissions, PermissionAccessor}; use crate::resources; use crate::resources::Resource; use crate::resources::ResourceId; +use crate::startup_data; use crate::workers; use futures::Future; use serde_json; @@ -48,7 +48,7 @@ impl ModuleMetaData { fn lazy_start(parent_state: &IsolateState) -> Resource { let mut cell = C_RID.lock().unwrap(); - let isolate_init = isolate_init::compiler_isolate_init(); + let startup_data = startup_data::compiler_isolate_init(); let permissions = DenoPermissions { allow_read: PermissionAccessor::from(true), allow_write: PermissionAccessor::from(true), @@ -58,7 +58,7 @@ fn lazy_start(parent_state: &IsolateState) -> Resource { let rid = cell.get_or_insert_with(|| { let resource = workers::spawn( - isolate_init, + Some(startup_data), parent_state, "compilerMain()".to_string(), permissions, diff --git a/src/isolate.rs b/src/isolate.rs index 7f3c0d919..379203dd3 100644 --- a/src/isolate.rs +++ b/src/isolate.rs @@ -181,7 +181,6 @@ fn fetch_module_meta_data_and_maybe_compile( mod tests { use super::*; use crate::flags; - use crate::isolate_init::IsolateInit; use crate::permissions::DenoPermissions; use crate::tokio_util; use futures::future::lazy; @@ -199,12 +198,8 @@ mod tests { let state = Arc::new(IsolateState::new(flags, rest_argv, None)); let state_ = state.clone(); - let init = IsolateInit { - snapshot: None, - init_script: None, - }; tokio_util::run(lazy(move || { - let cli = Cli::new(init, state.clone(), DenoPermissions::default()); + let cli = Cli::new(None, state.clone(), DenoPermissions::default()); let mut isolate = Isolate::new(cli); if let Err(err) = isolate.execute_mod(&filename, false) { eprintln!("execute_mod err {:?}", err); @@ -226,12 +221,8 @@ mod tests { let state = Arc::new(IsolateState::new(flags, rest_argv, None)); let state_ = state.clone(); - let init = IsolateInit { - snapshot: None, - init_script: None, - }; tokio_util::run(lazy(move || { - let cli = Cli::new(init, state.clone(), DenoPermissions::default()); + let cli = Cli::new(None, state.clone(), DenoPermissions::default()); let mut isolate = Isolate::new(cli); if let Err(err) = isolate.execute_mod(&filename, false) { eprintln!("execute_mod err {:?}", err); diff --git a/src/isolate_init.rs b/src/isolate_init.rs deleted file mode 100644 index fbdfdd4a5..000000000 --- a/src/isolate_init.rs +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. -use deno_core::deno_buf; - -pub struct IsolateInitScript { - pub source: String, - pub filename: String, -} - -pub struct IsolateInit { - pub snapshot: Option, - pub init_script: Option, -} - -pub fn deno_isolate_init() -> IsolateInit { - if cfg!(feature = "no-snapshot-init") { - debug!("Deno isolate init without snapshots."); - #[cfg(not(feature = "check-only"))] - let source_bytes = - include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/bundle/main.js")); - #[cfg(feature = "check-only")] - let source_bytes = vec![]; - - IsolateInit { - snapshot: None, - init_script: Some(IsolateInitScript { - filename: "gen/bundle/main.js".to_string(), - source: std::str::from_utf8(source_bytes).unwrap().to_string(), - }), - } - } else { - debug!("Deno isolate init with snapshots."); - #[cfg(not(any(feature = "check-only", feature = "no-snapshot-init")))] - let data = - include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/snapshot_deno.bin")); - #[cfg(any(feature = "check-only", feature = "no-snapshot-init"))] - let data = vec![]; - - unsafe { - IsolateInit { - snapshot: Some(deno_buf::from_raw_parts(data.as_ptr(), data.len())), - init_script: None, - } - } - } -} - -pub fn compiler_isolate_init() -> IsolateInit { - if cfg!(feature = "no-snapshot-init") { - debug!("Deno isolate init without snapshots."); - #[cfg(not(feature = "check-only"))] - let source_bytes = - include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/bundle/compiler.js")); - #[cfg(feature = "check-only")] - let source_bytes = vec![]; - - IsolateInit { - snapshot: None, - init_script: Some(IsolateInitScript { - filename: "gen/bundle/compiler.js".to_string(), - source: std::str::from_utf8(source_bytes).unwrap().to_string(), - }), - } - } else { - debug!("Deno isolate init with snapshots."); - #[cfg(not(any(feature = "check-only", feature = "no-snapshot-init")))] - let data = - include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/snapshot_compiler.bin")); - #[cfg(any(feature = "check-only", feature = "no-snapshot-init"))] - let data = vec![]; - - unsafe { - IsolateInit { - snapshot: Some(deno_buf::from_raw_parts(data.as_ptr(), data.len())), - init_script: None, - } - } - } -} diff --git a/src/main.rs b/src/main.rs index 0f12eebd1..4657a3a4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,6 @@ mod global_timer; mod http_body; mod http_util; pub mod isolate; -pub mod isolate_init; pub mod isolate_state; pub mod js_errors; pub mod modules; @@ -30,6 +29,7 @@ pub mod permissions; mod repl; pub mod resolve_addr; pub mod resources; +mod startup_data; mod tokio_util; mod tokio_write; pub mod version; @@ -110,9 +110,9 @@ fn main() { let state = Arc::new(IsolateState::new(flags, rest_argv, None)); let state_ = state.clone(); - let isolate_init = isolate_init::deno_isolate_init(); + let startup_data = startup_data::deno_isolate_init(); let permissions = permissions::DenoPermissions::from_flags(&state.flags); - let cli = Cli::new(isolate_init, state_, permissions); + let cli = Cli::new(Some(startup_data), state_, permissions); let mut isolate = Isolate::new(cli); let main_future = lazy(move || { diff --git a/src/ops.rs b/src/ops.rs index c6b9fe84a..254a21563 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -1880,7 +1880,7 @@ fn op_worker_post_message( mod tests { use super::*; use crate::cli::Cli; - use crate::isolate_init::IsolateInit; + use crate::isolate_state::IsolateState; use crate::permissions::{DenoPermissions, PermissionAccessor}; #[test] @@ -1893,14 +1893,7 @@ mod tests { allow_run: PermissionAccessor::from(true), ..Default::default() }; - let cli = Cli::new( - IsolateInit { - snapshot: None, - init_script: None, - }, - state, - permissions, - ); + let cli = Cli::new(None, state, permissions); let builder = &mut FlatBufferBuilder::new(); let fetch_msg_args = msg::FetchModuleMetaDataArgs { specifier: Some(builder.create_string("./somefile")), @@ -1934,14 +1927,7 @@ mod tests { allow_run: PermissionAccessor::from(true), ..Default::default() }; - let cli = Cli::new( - IsolateInit { - snapshot: None, - init_script: None, - }, - state, - permissions, - ); + let cli = Cli::new(None, state, permissions); let builder = &mut FlatBufferBuilder::new(); let fetch_msg_args = msg::FetchModuleMetaDataArgs { specifier: Some(builder.create_string("./somefile")), @@ -1975,14 +1961,7 @@ mod tests { allow_run: PermissionAccessor::from(true), ..Default::default() }; - let cli = Cli::new( - IsolateInit { - snapshot: None, - init_script: None, - }, - state, - permissions, - ); + let cli = Cli::new(None, state, permissions); let builder = &mut FlatBufferBuilder::new(); let fetch_msg_args = msg::FetchModuleMetaDataArgs { specifier: Some(builder.create_string("./somefile")), @@ -2015,14 +1994,7 @@ mod tests { allow_net: PermissionAccessor::from(true), ..Default::default() }; - let cli = Cli::new( - IsolateInit { - snapshot: None, - init_script: None, - }, - state, - permissions, - ); + let cli = Cli::new(None, state, permissions); let builder = &mut FlatBufferBuilder::new(); let fetch_msg_args = msg::FetchModuleMetaDataArgs { specifier: Some(builder.create_string("./somefile")), diff --git a/src/startup_data.rs b/src/startup_data.rs new file mode 100644 index 000000000..29ae4db7d --- /dev/null +++ b/src/startup_data.rs @@ -0,0 +1,57 @@ +// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. +use deno_core::deno_buf; +use deno_core::{StartupData, StartupScript}; + +pub fn deno_isolate_init() -> StartupData { + if cfg!(feature = "no-snapshot-init") { + debug!("Deno isolate init without snapshots."); + #[cfg(not(feature = "check-only"))] + let source_bytes = + include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/bundle/main.js")); + #[cfg(feature = "check-only")] + let source_bytes = vec![]; + + StartupData::Script(StartupScript { + filename: "gen/bundle/main.js".to_string(), + source: std::str::from_utf8(source_bytes).unwrap().to_string(), + }) + } else { + debug!("Deno isolate init with snapshots."); + #[cfg(not(any(feature = "check-only", feature = "no-snapshot-init")))] + let data = + include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/snapshot_deno.bin")); + #[cfg(any(feature = "check-only", feature = "no-snapshot-init"))] + let data = vec![]; + + unsafe { + StartupData::Snapshot(deno_buf::from_raw_parts(data.as_ptr(), data.len())) + } + } +} + +pub fn compiler_isolate_init() -> StartupData { + if cfg!(feature = "no-snapshot-init") { + debug!("Deno isolate init without snapshots."); + #[cfg(not(feature = "check-only"))] + let source_bytes = + include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/bundle/compiler.js")); + #[cfg(feature = "check-only")] + let source_bytes = vec![]; + + StartupData::Script(StartupScript { + filename: "gen/bundle/compiler.js".to_string(), + source: std::str::from_utf8(source_bytes).unwrap().to_string(), + }) + } else { + debug!("Deno isolate init with snapshots."); + #[cfg(not(any(feature = "check-only", feature = "no-snapshot-init")))] + let data = + include_bytes!(concat!(env!("GN_OUT_DIR"), "/gen/snapshot_compiler.bin")); + #[cfg(any(feature = "check-only", feature = "no-snapshot-init"))] + let data = vec![]; + + unsafe { + StartupData::Snapshot(deno_buf::from_raw_parts(data.as_ptr(), data.len())) + } + } +} diff --git a/src/workers.rs b/src/workers.rs index 8393de222..edded7756 100644 --- a/src/workers.rs +++ b/src/workers.rs @@ -3,7 +3,6 @@ use crate::cli::Buf; use crate::cli::Cli; use crate::flags::DenoFlags; use crate::isolate::Isolate; -use crate::isolate_init::IsolateInit; use crate::isolate_state::IsolateState; use crate::isolate_state::WorkerChannels; use crate::js_errors::JSErrorColor; @@ -11,6 +10,7 @@ use crate::permissions::DenoPermissions; use crate::resources; use crate::tokio_util; use deno_core::JSError; +use deno_core::StartupData; use futures::future::lazy; use futures::sync::mpsc; use futures::sync::oneshot; @@ -26,7 +26,7 @@ pub struct Worker { impl Worker { pub fn new( - init: IsolateInit, + startup_data: Option, flags: DenoFlags, argv: Vec, permissions: DenoPermissions, @@ -40,7 +40,7 @@ impl Worker { let state = Arc::new(IsolateState::new(flags, argv, Some(internal_channels))); - let cli = Cli::new(init, state, permissions); + let cli = Cli::new(startup_data, state, permissions); let isolate = Isolate::new(cli); let worker = Worker { isolate }; @@ -62,7 +62,7 @@ impl Future for Worker { } pub fn spawn( - init: IsolateInit, + startup_data: Option, state: &IsolateState, js_source: String, permissions: DenoPermissions, @@ -81,7 +81,7 @@ pub fn spawn( .spawn(move || { tokio_util::run(lazy(move || { let (mut worker, external_channels) = - Worker::new(init, flags, argv, permissions); + Worker::new(startup_data, flags, argv, permissions); let resource = resources::add_worker(external_channels); p.send(resource.clone()).unwrap(); @@ -113,13 +113,13 @@ pub fn spawn( #[cfg(test)] mod tests { use super::*; - use crate::isolate_init; + use crate::startup_data; #[test] fn test_spawn() { - let isolate_init = isolate_init::compiler_isolate_init(); + let startup_data = startup_data::compiler_isolate_init(); let resource = spawn( - isolate_init, + Some(startup_data), &IsolateState::mock(), r#" onmessage = function(e) { @@ -154,9 +154,9 @@ mod tests { #[test] fn removed_from_resource_table_on_close() { - let isolate_init = isolate_init::compiler_isolate_init(); + let startup_data = startup_data::compiler_isolate_init(); let resource = spawn( - isolate_init, + Some(startup_data), &IsolateState::mock(), "onmessage = () => close();".into(), DenoPermissions::default(), -- cgit v1.2.3