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/isolate_state.rs | |
parent | 6131152a575f86c7510702091ba18f061628674f (diff) |
Separate behavior for the compiler isolate (#1973)
Diffstat (limited to 'cli/isolate_state.rs')
-rw-r--r-- | cli/isolate_state.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/cli/isolate_state.rs b/cli/isolate_state.rs index 8b7745f9e..6435b2e8b 100644 --- a/cli/isolate_state.rs +++ b/cli/isolate_state.rs @@ -1,13 +1,17 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use crate::deno_dir; +use crate::errors::DenoResult; use crate::flags; use crate::global_timer::GlobalTimer; use crate::modules::Modules; +use crate::permissions::DenoPermissions; +use deno_core::deno_mod; use deno_core::Buf; use futures::sync::mpsc as async_mpsc; use std; use std::env; use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; use std::sync::Mutex; pub type WorkerSender = async_mpsc::Sender<Buf>; @@ -33,6 +37,7 @@ pub struct Metrics { pub struct IsolateState { pub dir: deno_dir::DenoDir, pub argv: Vec<String>, + pub permissions: DenoPermissions, pub flags: flags::DenoFlags, pub metrics: Metrics, pub modules: Mutex<Modules>, @@ -52,6 +57,7 @@ impl IsolateState { dir: deno_dir::DenoDir::new(flags.reload, flags.recompile, custom_root) .unwrap(), argv: argv_rest, + permissions: DenoPermissions::from_flags(&flags), flags, metrics: Metrics::default(), modules: Mutex::new(Modules::new()), @@ -76,6 +82,31 @@ impl IsolateState { } } + #[inline] + pub fn check_read(&self, filename: &str) -> DenoResult<()> { + self.permissions.check_read(filename) + } + + #[inline] + pub fn check_write(&self, filename: &str) -> DenoResult<()> { + self.permissions.check_write(filename) + } + + #[inline] + pub fn check_env(&self) -> DenoResult<()> { + self.permissions.check_env() + } + + #[inline] + pub fn check_net(&self, filename: &str) -> DenoResult<()> { + self.permissions.check_net(filename) + } + + #[inline] + pub fn check_run(&self) -> DenoResult<()> { + self.permissions.check_run() + } + #[cfg(test)] pub fn mock() -> IsolateState { let argv = vec![String::from("./deno"), String::from("hello.js")]; @@ -108,3 +139,21 @@ impl IsolateState { .fetch_add(bytes_received, Ordering::SeqCst); } } + +/// Provides state getter function +pub trait IsolateStateContainer { + fn state(&self) -> Arc<IsolateState>; +} + +/// Provides state_resolve function for IsolateStateContainer implementors +pub trait IsolateStateModuleResolution: IsolateStateContainer { + fn state_resolve(&mut self, specifier: &str, referrer: deno_mod) -> deno_mod { + let state = self.state(); + state.metrics.resolve_count.fetch_add(1, Ordering::Relaxed); + let mut modules = state.modules.lock().unwrap(); + modules.resolve_cb(&state.dir, specifier, referrer) + } +} + +// Auto implementation for all IsolateStateContainer implementors +impl<T> IsolateStateModuleResolution for T where T: IsolateStateContainer {} |