diff options
author | Edwin Cheng <[email protected]> | 2021-03-23 19:47:08 +0000 |
---|---|---|
committer | Edwin Cheng <[email protected]> | 2021-03-23 19:51:06 +0000 |
commit | 79f583ed6622be591886f99974766a3aeda39182 (patch) | |
tree | a332596cd744a1d50b474b5a82d66af171048707 | |
parent | f41ae64722ab8e501e2123018d1b0101db32442e (diff) |
Improve message usage in proc-macro
Reuse storage for the buffer send to child process of proc-macro.
-rw-r--r-- | crates/proc_macro_api/src/msg.rs | 12 | ||||
-rw-r--r-- | crates/proc_macro_api/src/process.rs | 7 | ||||
-rw-r--r-- | crates/proc_macro_srv/src/cli.rs | 7 |
3 files changed, 17 insertions, 9 deletions
diff --git a/crates/proc_macro_api/src/msg.rs b/crates/proc_macro_api/src/msg.rs index 21e56cc83..f525df152 100644 --- a/crates/proc_macro_api/src/msg.rs +++ b/crates/proc_macro_api/src/msg.rs | |||
@@ -55,8 +55,8 @@ pub enum ErrorCode { | |||
55 | } | 55 | } |
56 | 56 | ||
57 | pub trait Message: Serialize + DeserializeOwned { | 57 | pub trait Message: Serialize + DeserializeOwned { |
58 | fn read(inp: &mut impl BufRead) -> io::Result<Option<Self>> { | 58 | fn read(inp: &mut impl BufRead, buf: &mut String) -> io::Result<Option<Self>> { |
59 | Ok(match read_json(inp)? { | 59 | Ok(match read_json(inp, buf)? { |
60 | None => None, | 60 | None => None, |
61 | Some(text) => { | 61 | Some(text) => { |
62 | let mut deserializer = serde_json::Deserializer::from_str(&text); | 62 | let mut deserializer = serde_json::Deserializer::from_str(&text); |
@@ -76,9 +76,13 @@ pub trait Message: Serialize + DeserializeOwned { | |||
76 | impl Message for Request {} | 76 | impl Message for Request {} |
77 | impl Message for Response {} | 77 | impl Message for Response {} |
78 | 78 | ||
79 | fn read_json(inp: &mut impl BufRead) -> io::Result<Option<String>> { | 79 | fn read_json<'a>( |
80 | inp: &mut impl BufRead, | ||
81 | mut buf: &'a mut String, | ||
82 | ) -> io::Result<Option<&'a String>> { | ||
80 | loop { | 83 | loop { |
81 | let mut buf = String::new(); | 84 | buf.clear(); |
85 | |||
82 | inp.read_line(&mut buf)?; | 86 | inp.read_line(&mut buf)?; |
83 | buf.pop(); // Remove trailing '\n' | 87 | buf.pop(); // Remove trailing '\n' |
84 | 88 | ||
diff --git a/crates/proc_macro_api/src/process.rs b/crates/proc_macro_api/src/process.rs index 30bb1b687..99d05aef3 100644 --- a/crates/proc_macro_api/src/process.rs +++ b/crates/proc_macro_api/src/process.rs | |||
@@ -90,8 +90,10 @@ impl ProcMacroProcessSrv { | |||
90 | fn client_loop(task_rx: Receiver<Task>, mut process: Process) { | 90 | fn client_loop(task_rx: Receiver<Task>, mut process: Process) { |
91 | let (mut stdin, mut stdout) = process.stdio().expect("couldn't access child stdio"); | 91 | let (mut stdin, mut stdout) = process.stdio().expect("couldn't access child stdio"); |
92 | 92 | ||
93 | let mut buf = String::new(); | ||
94 | |||
93 | for Task { req, result_tx } in task_rx { | 95 | for Task { req, result_tx } in task_rx { |
94 | match send_request(&mut stdin, &mut stdout, req) { | 96 | match send_request(&mut stdin, &mut stdout, req, &mut buf) { |
95 | Ok(res) => result_tx.send(res).unwrap(), | 97 | Ok(res) => result_tx.send(res).unwrap(), |
96 | Err(err) => { | 98 | Err(err) => { |
97 | log::error!( | 99 | log::error!( |
@@ -152,7 +154,8 @@ fn send_request( | |||
152 | mut writer: &mut impl Write, | 154 | mut writer: &mut impl Write, |
153 | mut reader: &mut impl BufRead, | 155 | mut reader: &mut impl BufRead, |
154 | req: Request, | 156 | req: Request, |
157 | buf: &mut String, | ||
155 | ) -> io::Result<Option<Response>> { | 158 | ) -> io::Result<Option<Response>> { |
156 | req.write(&mut writer)?; | 159 | req.write(&mut writer)?; |
157 | Response::read(&mut reader) | 160 | Response::read(&mut reader, buf) |
158 | } | 161 | } |
diff --git a/crates/proc_macro_srv/src/cli.rs b/crates/proc_macro_srv/src/cli.rs index d428b9567..bc48f1c43 100644 --- a/crates/proc_macro_srv/src/cli.rs +++ b/crates/proc_macro_srv/src/cli.rs | |||
@@ -6,8 +6,9 @@ use std::io; | |||
6 | 6 | ||
7 | pub fn run() -> io::Result<()> { | 7 | pub fn run() -> io::Result<()> { |
8 | let mut srv = ProcMacroSrv::default(); | 8 | let mut srv = ProcMacroSrv::default(); |
9 | let mut buf = String::new(); | ||
9 | 10 | ||
10 | while let Some(req) = read_request()? { | 11 | while let Some(req) = read_request(&mut buf)? { |
11 | let res = match req { | 12 | let res = match req { |
12 | msg::Request::ListMacro(task) => srv.list_macros(&task).map(msg::Response::ListMacro), | 13 | msg::Request::ListMacro(task) => srv.list_macros(&task).map(msg::Response::ListMacro), |
13 | msg::Request::ExpansionMacro(task) => { | 14 | msg::Request::ExpansionMacro(task) => { |
@@ -30,8 +31,8 @@ pub fn run() -> io::Result<()> { | |||
30 | Ok(()) | 31 | Ok(()) |
31 | } | 32 | } |
32 | 33 | ||
33 | fn read_request() -> io::Result<Option<msg::Request>> { | 34 | fn read_request(buf: &mut String) -> io::Result<Option<msg::Request>> { |
34 | msg::Request::read(&mut io::stdin().lock()) | 35 | msg::Request::read(&mut io::stdin().lock(), buf) |
35 | } | 36 | } |
36 | 37 | ||
37 | fn write_response(msg: msg::Response) -> io::Result<()> { | 38 | fn write_response(msg: msg::Response) -> io::Result<()> { |