diff options
Diffstat (limited to 'cli/ops/repl.rs')
-rw-r--r-- | cli/ops/repl.rs | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/cli/ops/repl.rs b/cli/ops/repl.rs index 886e57483..6644ab159 100644 --- a/cli/ops/repl.rs +++ b/cli/ops/repl.rs @@ -1,10 +1,15 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use super::dispatch_json::{blocking_json, Deserialize, JsonOp, Value}; +use crate::deno_error::bad_resource; use crate::ops::json_op; use crate::repl; +use crate::repl::Repl; use crate::resources; +use crate::resources::CoreResource; use crate::state::ThreadSafeState; use deno::*; +use std::sync::Arc; +use std::sync::Mutex; pub fn init(i: &mut Isolate, s: &ThreadSafeState) { i.register_op( @@ -17,6 +22,14 @@ pub fn init(i: &mut Isolate, s: &ThreadSafeState) { ); } +struct ReplResource(Arc<Mutex<Repl>>); + +impl CoreResource for ReplResource { + fn inspect_repr(&self) -> &str { + "repl" + } +} + #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct ReplStartArgs { @@ -33,9 +46,10 @@ fn op_repl_start( debug!("op_repl_start {}", args.history_file); let history_path = repl::history_path(&state.dir, &args.history_file); let repl = repl::Repl::new(history_path); - let resource = resources::add_repl(repl); - - Ok(JsonOp::Sync(json!(resource.rid))) + let resource = ReplResource(Arc::new(Mutex::new(repl))); + let mut table = resources::lock_resource_table(); + let rid = table.add(Box::new(resource)); + Ok(JsonOp::Sync(json!(rid))) } #[derive(Deserialize)] @@ -50,12 +64,14 @@ fn op_repl_readline( _zero_copy: Option<PinnedBuf>, ) -> Result<JsonOp, ErrBox> { let args: ReplReadlineArgs = serde_json::from_value(args)?; - let rid = args.rid; + let rid = args.rid as u32; let prompt = args.prompt; debug!("op_repl_readline {} {}", rid, prompt); blocking_json(false, move || { - let repl = resources::get_repl(rid as u32)?; + let table = resources::lock_resource_table(); + let resource = table.get::<ReplResource>(rid).ok_or_else(bad_resource)?; + let repl = resource.0.clone(); let line = repl.lock().unwrap().readline(&prompt)?; Ok(json!(line)) }) |