aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdwin Cheng <[email protected]>2021-01-01 07:09:27 +0000
committerEdwin Cheng <[email protected]>2021-01-01 07:09:27 +0000
commita65025604da0a3f43b668c60a4a2f97a70b71363 (patch)
tree4c6af6d0b9ab4fa148b05c70e8f15aa9699ab229
parenta9814fa9c037b0fafd30580a6e7682ed032d77e6 (diff)
Fix deep syntax tree bug generated by proc-macro
-rw-r--r--Cargo.lock33
-rw-r--r--crates/proc_macro_api/Cargo.toml1
-rw-r--r--crates/proc_macro_api/src/msg.rs9
-rw-r--r--crates/proc_macro_api/src/process.rs7
4 files changed, 46 insertions, 4 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 9ddbeac47..d724d8962 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1182,6 +1182,7 @@ dependencies = [
1182 "log", 1182 "log",
1183 "serde", 1183 "serde",
1184 "serde_json", 1184 "serde_json",
1185 "serde_stacker",
1185 "tt", 1186 "tt",
1186] 1187]
1187 1188
@@ -1240,6 +1241,15 @@ dependencies = [
1240] 1241]
1241 1242
1242[[package]] 1243[[package]]
1244name = "psm"
1245version = "0.1.12"
1246source = "registry+https://github.com/rust-lang/crates.io-index"
1247checksum = "3abf49e5417290756acfd26501536358560c4a5cc4a0934d390939acb3e7083a"
1248dependencies = [
1249 "cc",
1250]
1251
1252[[package]]
1243name = "pulldown-cmark" 1253name = "pulldown-cmark"
1244version = "0.8.0" 1254version = "0.8.0"
1245source = "registry+https://github.com/rust-lang/crates.io-index" 1255source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1558,6 +1568,16 @@ dependencies = [
1558] 1568]
1559 1569
1560[[package]] 1570[[package]]
1571name = "serde_stacker"
1572version = "0.1.4"
1573source = "registry+https://github.com/rust-lang/crates.io-index"
1574checksum = "f4c92391a63e3b83f77334d8beaaf11bac4c900f3769483e543bf76a81bf8ee2"
1575dependencies = [
1576 "serde",
1577 "stacker",
1578]
1579
1580[[package]]
1561name = "sharded-slab" 1581name = "sharded-slab"
1562version = "0.1.0" 1582version = "0.1.0"
1563source = "registry+https://github.com/rust-lang/crates.io-index" 1583source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1603,6 +1623,19 @@ dependencies = [
1603] 1623]
1604 1624
1605[[package]] 1625[[package]]
1626name = "stacker"
1627version = "0.1.12"
1628source = "registry+https://github.com/rust-lang/crates.io-index"
1629checksum = "21ccb4c06ec57bc82d0f610f1a2963d7648700e43a6f513e564b9c89f7991786"
1630dependencies = [
1631 "cc",
1632 "cfg-if 0.1.10",
1633 "libc",
1634 "psm",
1635 "winapi 0.3.9",
1636]
1637
1638[[package]]
1606name = "stdx" 1639name = "stdx"
1607version = "0.0.0" 1640version = "0.0.0"
1608 1641
diff --git a/crates/proc_macro_api/Cargo.toml b/crates/proc_macro_api/Cargo.toml
index 1af2bbca7..a8e128d55 100644
--- a/crates/proc_macro_api/Cargo.toml
+++ b/crates/proc_macro_api/Cargo.toml
@@ -12,6 +12,7 @@ doctest = false
12[dependencies] 12[dependencies]
13serde = { version = "1.0", features = ["derive"] } 13serde = { version = "1.0", features = ["derive"] }
14serde_json = "1.0" 14serde_json = "1.0"
15serde_stacker = "0.1"
15log = "0.4.8" 16log = "0.4.8"
16crossbeam-channel = "0.5.0" 17crossbeam-channel = "0.5.0"
17jod-thread = "0.1.1" 18jod-thread = "0.1.1"
diff --git a/crates/proc_macro_api/src/msg.rs b/crates/proc_macro_api/src/msg.rs
index f84ebdbc5..43d13a764 100644
--- a/crates/proc_macro_api/src/msg.rs
+++ b/crates/proc_macro_api/src/msg.rs
@@ -58,7 +58,14 @@ pub trait Message: Serialize + DeserializeOwned {
58 fn read(inp: &mut impl BufRead) -> io::Result<Option<Self>> { 58 fn read(inp: &mut impl BufRead) -> io::Result<Option<Self>> {
59 Ok(match read_json(inp)? { 59 Ok(match read_json(inp)? {
60 None => None, 60 None => None,
61 Some(text) => Some(serde_json::from_str(&text)?), 61 Some(text) => {
62 let mut deserializer = serde_json::Deserializer::from_str(&text);
63 // Note that some proc-macro generate very deep syntax tree
64 // We have to disable the current limit of serde here
65 deserializer.disable_recursion_limit();
66 let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
67 Some(Self::deserialize(deserializer)?)
68 }
62 }) 69 })
63 } 70 }
64 fn write(self, out: &mut impl Write) -> io::Result<()> { 71 fn write(self, out: &mut impl Write) -> io::Result<()> {
diff --git a/crates/proc_macro_api/src/process.rs b/crates/proc_macro_api/src/process.rs
index d68723ada..6d6ab8888 100644
--- a/crates/proc_macro_api/src/process.rs
+++ b/crates/proc_macro_api/src/process.rs
@@ -92,10 +92,11 @@ fn client_loop(task_rx: Receiver<Task>, mut process: Process) {
92 for Task { req, result_tx } in task_rx { 92 for Task { req, result_tx } in task_rx {
93 match send_request(&mut stdin, &mut stdout, req) { 93 match send_request(&mut stdin, &mut stdout, req) {
94 Ok(res) => result_tx.send(res).unwrap(), 94 Ok(res) => result_tx.send(res).unwrap(),
95 Err(_err) => { 95 Err(err) => {
96 log::error!( 96 log::error!(
97 "proc macro server crashed, server process state: {:?}", 97 "proc macro server crashed, server process state: {:?}, server request error: {:?}",
98 process.child.try_wait() 98 process.child.try_wait(),
99 err
99 ); 100 );
100 let res = Response::Error(ResponseError { 101 let res = Response::Error(ResponseError {
101 code: ErrorCode::ServerErrorEnd, 102 code: ErrorCode::ServerErrorEnd,