diff options
author | andy finch <andyfinch7@gmail.com> | 2019-03-19 20:55:59 -0400 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-03-19 20:55:59 -0400 |
commit | 48bf419669694802f82b418b901cb282957fb64f (patch) | |
tree | 2304fb01719d3c18ca25aeb5456e9dea910db870 /cli/compiler.rs | |
parent | 6131152a575f86c7510702091ba18f061628674f (diff) |
Separate behavior for the compiler isolate (#1973)
Diffstat (limited to 'cli/compiler.rs')
-rw-r--r-- | cli/compiler.rs | 93 |
1 files changed, 77 insertions, 16 deletions
diff --git a/cli/compiler.rs b/cli/compiler.rs index ec02b62f8..17006b2b9 100644 --- a/cli/compiler.rs +++ b/cli/compiler.rs @@ -1,22 +1,84 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. -use crate::isolate_state::IsolateState; +use crate::isolate_state::*; use crate::msg; -use crate::permissions::{DenoPermissions, PermissionAccessor}; +use crate::ops; use crate::resources; use crate::resources::Resource; use crate::resources::ResourceId; use crate::startup_data; use crate::workers; +use crate::workers::WorkerBehavior; +use deno_core::deno_buf; +use deno_core::deno_mod; +use deno_core::Behavior; use deno_core::Buf; +use deno_core::Op; +use deno_core::StartupData; use futures::Future; use serde_json; use std::str; +use std::sync::Arc; use std::sync::Mutex; lazy_static! { static ref C_RID: Mutex<Option<ResourceId>> = Mutex::new(None); } +pub struct CompilerBehavior { + pub state: Arc<IsolateState>, +} + +impl CompilerBehavior { + pub fn new(state: Arc<IsolateState>) -> Self { + Self { state } + } +} + +impl IsolateStateContainer for CompilerBehavior { + fn state(&self) -> Arc<IsolateState> { + self.state.clone() + } +} + +impl IsolateStateContainer for &CompilerBehavior { + fn state(&self) -> Arc<IsolateState> { + self.state.clone() + } +} + +impl Behavior for CompilerBehavior { + fn startup_data(&mut self) -> Option<StartupData> { + Some(startup_data::compiler_isolate_init()) + } + + fn resolve(&mut self, specifier: &str, referrer: deno_mod) -> deno_mod { + self.state_resolve(specifier, referrer) + } + + fn dispatch( + &mut self, + control: &[u8], + zero_copy: deno_buf, + ) -> (bool, Box<Op>) { + ops::dispatch_all( + Box::new(self), + control, + zero_copy, + ops::op_selector_compiler, + ) + } +} + +impl WorkerBehavior for CompilerBehavior { + fn set_internal_channels(&mut self, worker_channels: WorkerChannels) { + self.state = Arc::new(IsolateState::new( + self.state.flags.clone(), + self.state.argv.clone(), + Some(worker_channels), + )); + } +} + // This corresponds to JS ModuleMetaData. // TODO Rename one or the other so they correspond. #[derive(Debug)] @@ -46,22 +108,16 @@ impl ModuleMetaData { } } -fn lazy_start(parent_state: &IsolateState) -> Resource { +fn lazy_start(parent_state: Arc<IsolateState>) -> Resource { let mut cell = C_RID.lock().unwrap(); - let startup_data = startup_data::compiler_isolate_init(); - let permissions = DenoPermissions { - allow_read: PermissionAccessor::from(true), - allow_write: PermissionAccessor::from(true), - allow_net: PermissionAccessor::from(true), - ..Default::default() - }; - let rid = cell.get_or_insert_with(|| { let resource = workers::spawn( - Some(startup_data), - parent_state, + CompilerBehavior::new(Arc::new(IsolateState::new( + parent_state.flags.clone(), + parent_state.argv.clone(), + None, + ))), "compilerMain()".to_string(), - permissions, ); resource.rid }); @@ -78,7 +134,7 @@ fn req(specifier: &str, referrer: &str) -> Buf { } pub fn compile_sync( - parent_state: &IsolateState, + parent_state: Arc<IsolateState>, specifier: &str, referrer: &str, module_meta_data: &ModuleMetaData, @@ -140,7 +196,12 @@ mod tests { maybe_source_map: None, }; - out = compile_sync(&IsolateState::mock(), specifier, &referrer, &mut out); + out = compile_sync( + Arc::new(IsolateState::mock()), + specifier, + &referrer, + &mut out, + ); assert!( out .maybe_output_code |