diff options
author | Kevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com> | 2019-02-09 13:55:40 -0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2019-02-09 16:55:40 -0500 |
commit | 1d36eb47eb882cb9305a6338019fa2a2b375d7b1 (patch) | |
tree | 4584aff9da784f3e05c4fb5314d5911772b4d655 /src/ops.rs | |
parent | 1502051453bf16787a59f43004b24d553d39bd26 (diff) |
Support scoped variables, unblock REPL async op, and REPL error colors (#1721)
Diffstat (limited to 'src/ops.rs')
-rw-r--r-- | src/ops.rs | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/ops.rs b/src/ops.rs index 2b4136208..a0646e923 100644 --- a/src/ops.rs +++ b/src/ops.rs @@ -10,6 +10,7 @@ use crate::isolate::Buf; use crate::isolate::Isolate; use crate::isolate::IsolateState; use crate::isolate::Op; +use crate::js_errors::JSError; use crate::libdeno; use crate::msg; use crate::msg_util; @@ -97,6 +98,7 @@ pub fn dispatch( msg::Any::Environ => op_env, msg::Any::Exit => op_exit, msg::Any::Fetch => op_fetch, + msg::Any::FormatError => op_format_error, msg::Any::Listen => op_listen, msg::Any::MakeTempDir => op_make_temp_dir, msg::Any::Metrics => op_metrics, @@ -283,6 +285,41 @@ fn op_start( )) } +fn op_format_error( + state: &Arc<IsolateState>, + base: &msg::Base<'_>, + data: libdeno::deno_buf, +) -> Box<Op> { + assert_eq!(data.len(), 0); + let inner = base.inner_as_format_error().unwrap(); + let orig_error = String::from(inner.error().unwrap()); + + let js_error = JSError::from_v8_exception(&orig_error).unwrap(); + let js_error_mapped = js_error.apply_source_map(&state.dir); + let js_error_string = js_error_mapped.to_string(); + + let mut builder = FlatBufferBuilder::new(); + let new_error = builder.create_string(&js_error_string); + + let inner = msg::FormatErrorRes::create( + &mut builder, + &msg::FormatErrorResArgs { + error: Some(new_error), + ..Default::default() + }, + ); + + ok_future(serialize_response( + base.cmd_id(), + &mut builder, + msg::BaseArgs { + inner_type: msg::Any::FormatErrorRes, + inner: Some(inner.as_union_value()), + ..Default::default() + }, + )) +} + fn serialize_response( cmd_id: u32, builder: &mut FlatBufferBuilder<'_>, @@ -1271,7 +1308,8 @@ fn op_repl_readline( debug!("op_repl_readline {} {}", rid, prompt); blocking(base.sync(), move || -> OpResult { - let line = resources::readline(rid, &prompt)?; + let repl = resources::get_repl(rid)?; + let line = repl.lock().unwrap().readline(&prompt)?; let builder = &mut FlatBufferBuilder::new(); let line_off = builder.create_string(&line); |