Skip to content

Commit 40851aa

Browse files
cjlongoriameta-codesync[bot]
authored andcommitted
Split list entries in const across independent functions
Summary: What {D66798219} did for `map<>`, this diff does for `list<>` and `set<>`. Context: https://fb.workplace.com/groups/rust.language/posts/29694229013532331 The example struct in the previous diff in this stack drops from ~10 minutes to ~2 seconds with this diff: ``` cjlongoria@devvm17879 ~/f/f/s/c/slow_compile (default)> buck2 run --local-only --no-remote-cache fbcode//mode/opt :default_struct-rust[profile][llvm_passes] Buck UI: https://www.internalfb.com/buck2/dd4cb180-503d-400f-b648-c55bf368d6df Network: Up: 0B Down: 0B Command: run. Time elapsed: 0.0s BUILD SUCCEEDED - starting your binary Upload trace successfully. Access the trace internally (VPN or Lighthouse) at: https://fburl.com/dltsrjyi ``` Reviewed By: dtolnay Differential Revision: D84371866 fbshipit-source-id: b2507d1af3207b51a7b71a3d0d42bd55d750308f
1 parent cfa0c8c commit 40851aa

9 files changed

Lines changed: 258 additions & 54 deletions

File tree

third-party/thrift/src/thrift/compiler/generate/t_mstch_rust_generator.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1907,7 +1907,7 @@ class mstch_rust_value : public mstch_base {
19071907
for (auto elem : const_value_->get_list()) {
19081908
elements.emplace_back(
19091909
std::make_shared<mstch_rust_value>(
1910-
elem, elem_type, depth_ + 1, context_, pos_, options_));
1910+
elem, elem_type, depth_ + 3, context_, pos_, options_));
19111911
}
19121912
return elements;
19131913
}

third-party/thrift/src/thrift/compiler/generate/templates/rust/lib/value.mustache

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,22 @@
4343
}}{{#value:list?}}{{!
4444
}}{{#value:empty?}}::std::vec::Vec::new(){{/value:empty?}}{{!
4545
}}{{^value:empty?}}{{!
46-
}}vec![{{!
47-
}}{{#value:list_elements}}
48-
{{value:indent}}{{> lib/value}},{{!
49-
}}{{/value:list_elements}}
50-
{{value:indent}}]{{!
46+
}}{
47+
{{value:indent}}let mut list = ::std::vec::Vec::new();
48+
{{#value:list_elements}}
49+
{{value:indent}}{
50+
{{value:indent}}#[inline(never)]
51+
{{value:indent}}fn __do_push(list: &mut {{!
52+
}}{{#type:has_adapter?}}{{>lib/adapter/qualified}}::StandardType{{/type:has_adapter?}}{{!
53+
}}{{^type:has_adapter?}}{{>lib/type}}{{/type:has_adapter?}}{{!
54+
}}) {
55+
{{value:indent}}list.push({{> lib/value}});
56+
{{value:indent}}}
57+
{{value:indent}}__do_push(&mut list);
58+
{{value:indent}}}
59+
{{/value:list_elements}}
60+
{{value:indent}}list
61+
{{value:indent}}}{{!
5162
}}{{/value:empty?}}{{!
5263
}}{{/value:list?}}{{!
5364
}}{{#value:set?}}{{!
@@ -61,15 +72,24 @@
6172
{{value:indent}}let mut set = {{!
6273
}}{{#type:rust}}::{{type:rust}}{{/type:rust}}{{!
6374
}}{{^type:rust}}::std::collections::BTreeSet{{/type:rust}}{{!
64-
}}::new();{{!
65-
}}{{#value:setMembers}}
75+
}}::new();
76+
{{#value:setMembers}}
77+
{{value:indent}}{
78+
{{value:indent}}#[inline(never)]
79+
{{value:indent}}fn __do_insert(set: &mut {{!
80+
}}{{#type:has_adapter?}}{{>lib/adapter/qualified}}::StandardType{{/type:has_adapter?}}{{!
81+
}}{{^type:has_adapter?}}{{>lib/type}}{{/type:has_adapter?}}{{!
82+
}}) {
6683
{{value:indent}}set.insert({{!
6784
}}{{#value:floatingPoint?}}{{!
6885
}}::fbthrift::export::OrderedFloat({{> lib/value}}){{!
6986
}}{{/value:floatingPoint?}}{{!
7087
}}{{^value:floatingPoint?}}{{> lib/value}}{{/value:floatingPoint?}}{{!
71-
}});{{!
72-
}}{{/value:setMembers}}
88+
}});
89+
{{value:indent}}}
90+
{{value:indent}}__do_insert(&mut set);
91+
{{value:indent}}}
92+
{{/value:setMembers}}
7393
{{value:indent}}set
7494
{{value:indent}}}{{!
7595
}}{{/value:empty?}}{{!

third-party/thrift/src/thrift/compiler/test/fixtures/adapter/out/rust/gen-rust/consts.rs

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,20 @@ pub static var3: ::std::sync::LazyLock<crate::types::MyStruct> = ::std::sync::La
1111
field: 30,
1212
set_string: <crate::types::adapters::SetWithAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_default::<crate::types::MyStruct>({
1313
let mut set = ::std::collections::BTreeSet::new();
14-
set.insert("10".to_owned());
15-
set.insert("20".to_owned());
14+
{
15+
#[inline(never)]
16+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::string::String>) {
17+
set.insert("10".to_owned());
18+
}
19+
__do_insert(&mut set);
20+
}
21+
{
22+
#[inline(never)]
23+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::string::String>) {
24+
set.insert("20".to_owned());
25+
}
26+
__do_insert(&mut set);
27+
}
1628
set
1729
}, 2),
1830
..::std::default::Default::default()
@@ -26,8 +38,20 @@ pub static var6: ::std::sync::LazyLock<crate::types::MyStruct> = ::std::sync::La
2638
field: 60,
2739
set_string: <crate::types::adapters::SetWithAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_default::<crate::types::MyStruct>({
2840
let mut set = ::std::collections::BTreeSet::new();
29-
set.insert("30".to_owned());
30-
set.insert("40".to_owned());
41+
{
42+
#[inline(never)]
43+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::string::String>) {
44+
set.insert("30".to_owned());
45+
}
46+
__do_insert(&mut set);
47+
}
48+
{
49+
#[inline(never)]
50+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::string::String>) {
51+
set.insert("40".to_owned());
52+
}
53+
__do_insert(&mut set);
54+
}
3155
set
3256
}, 2),
3357
..::std::default::Default::default()
@@ -60,9 +84,29 @@ pub static nested_adapted: ::std::sync::LazyLock<crate::types::MoveOnly> = ::std
6084
..::std::default::Default::default()
6185
});
6286

63-
pub static container_of_adapted: ::std::sync::LazyLock<::std::vec::Vec<crate::types::AdaptedByte>> = ::std::sync::LazyLock::new(|| vec![
64-
1,
65-
2,
66-
3,
67-
]);
87+
pub static container_of_adapted: ::std::sync::LazyLock<::std::vec::Vec<crate::types::AdaptedByte>> = ::std::sync::LazyLock::new(|| {
88+
let mut list = ::std::vec::Vec::new();
89+
{
90+
#[inline(never)]
91+
fn __do_push(list: &mut ::std::vec::Vec<crate::types::AdaptedByte>) {
92+
list.push(1);
93+
}
94+
__do_push(&mut list);
95+
}
96+
{
97+
#[inline(never)]
98+
fn __do_push(list: &mut ::std::vec::Vec<crate::types::AdaptedByte>) {
99+
list.push(2);
100+
}
101+
__do_push(&mut list);
102+
}
103+
{
104+
#[inline(never)]
105+
fn __do_push(list: &mut ::std::vec::Vec<crate::types::AdaptedByte>) {
106+
list.push(3);
107+
}
108+
__do_push(&mut list);
109+
}
110+
list
111+
});
68112

third-party/thrift/src/thrift/compiler/test/fixtures/adapter/out/rust/gen-rust/types.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4303,12 +4303,26 @@ impl ::std::default::Default for self::AdaptTemplatedTestStruct {
43034303
adaptedDoubleDefault: 5.0,
43044304
adaptedStringDefault: "6".to_owned(),
43054305
adaptedEnum: crate::types::AdaptedEnum::One,
4306-
adaptedListDefault: <::fbthrift_adapters::test::TestAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_default::<AdaptTemplatedTestStruct>(vec![
4307-
1,
4308-
], 19),
4306+
adaptedListDefault: <::fbthrift_adapters::test::TestAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_default::<AdaptTemplatedTestStruct>({
4307+
let mut list = ::std::vec::Vec::new();
4308+
{
4309+
#[inline(never)]
4310+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i64>) {
4311+
list.push(1);
4312+
}
4313+
__do_push(&mut list);
4314+
}
4315+
list
4316+
}, 19),
43094317
adaptedSetDefault: <::fbthrift_adapters::test::TestAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_default::<AdaptTemplatedTestStruct>({
43104318
let mut set = ::std::collections::BTreeSet::new();
4311-
set.insert(1);
4319+
{
4320+
#[inline(never)]
4321+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::primitive::i64>) {
4322+
set.insert(1);
4323+
}
4324+
__do_insert(&mut set);
4325+
}
43124326
set
43134327
}, 20),
43144328
adaptedMapDefault: <::fbthrift_adapters::test::TestAdapter as ::fbthrift::adapter::ThriftAdapter>::from_thrift_default::<AdaptTemplatedTestStruct>({

third-party/thrift/src/thrift/compiler/test/fixtures/basic-annotations/out/rust/gen-rust/types.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -831,9 +831,17 @@ impl ::fbthrift::metadata::ThriftAnnotations for MyStruct {
831831

832832
if type_id == ::std::any::TypeId::of::<hack__types::Attributes>() {
833833
let mut tmp = ::std::option::Option::Some(hack__types::Attributes {
834-
attributes: vec![
835-
"\\SomeClass(\\AnotherClass::class)".to_owned(),
836-
],
834+
attributes: {
835+
let mut list = ::std::vec::Vec::new();
836+
{
837+
#[inline(never)]
838+
fn __do_push(list: &mut ::std::vec::Vec<::std::string::String>) {
839+
list.push("\\SomeClass(\\AnotherClass::class)".to_owned());
840+
}
841+
__do_push(&mut list);
842+
}
843+
list
844+
},
837845
..::std::default::Default::default()
838846
});
839847
let r: &mut dyn ::std::any::Any = &mut tmp;

third-party/thrift/src/thrift/compiler/test/fixtures/basic/out/rust/gen-rust/consts.rs

Lines changed: 110 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,62 @@ pub const E: ::std::primitive::f64 = 2.718281828459;
1515

1616
pub const DATE: &::std::primitive::str = "June 28, 2017";
1717

18-
pub static AList: ::std::sync::LazyLock<::std::vec::Vec<::std::primitive::i32>> = ::std::sync::LazyLock::new(|| vec![
19-
2,
20-
3,
21-
5,
22-
7,
23-
]);
18+
pub static AList: ::std::sync::LazyLock<::std::vec::Vec<::std::primitive::i32>> = ::std::sync::LazyLock::new(|| {
19+
let mut list = ::std::vec::Vec::new();
20+
{
21+
#[inline(never)]
22+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
23+
list.push(2);
24+
}
25+
__do_push(&mut list);
26+
}
27+
{
28+
#[inline(never)]
29+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
30+
list.push(3);
31+
}
32+
__do_push(&mut list);
33+
}
34+
{
35+
#[inline(never)]
36+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
37+
list.push(5);
38+
}
39+
__do_push(&mut list);
40+
}
41+
{
42+
#[inline(never)]
43+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
44+
list.push(7);
45+
}
46+
__do_push(&mut list);
47+
}
48+
list
49+
});
2450

2551
pub static ASet: ::std::sync::LazyLock<::std::collections::BTreeSet<::std::string::String>> = ::std::sync::LazyLock::new(|| {
2652
let mut set = ::std::collections::BTreeSet::new();
27-
set.insert("foo".to_owned());
28-
set.insert("bar".to_owned());
29-
set.insert("baz".to_owned());
53+
{
54+
#[inline(never)]
55+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::string::String>) {
56+
set.insert("foo".to_owned());
57+
}
58+
__do_insert(&mut set);
59+
}
60+
{
61+
#[inline(never)]
62+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::string::String>) {
63+
set.insert("bar".to_owned());
64+
}
65+
__do_insert(&mut set);
66+
}
67+
{
68+
#[inline(never)]
69+
fn __do_insert(set: &mut ::std::collections::BTreeSet<::std::string::String>) {
70+
set.insert("baz".to_owned());
71+
}
72+
__do_insert(&mut set);
73+
}
3074
set
3175
});
3276

@@ -35,23 +79,69 @@ pub static AMap: ::std::sync::LazyLock<::std::collections::BTreeMap<::std::strin
3579
{
3680
#[inline(never)]
3781
fn __do_insert(map: &mut ::std::collections::BTreeMap<::std::string::String, ::std::vec::Vec<::std::primitive::i32>>) {
38-
map.insert("foo".to_owned(), vec![
39-
1,
40-
2,
41-
3,
42-
4,
43-
]);
82+
map.insert("foo".to_owned(), {
83+
let mut list = ::std::vec::Vec::new();
84+
{
85+
#[inline(never)]
86+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
87+
list.push(1);
88+
}
89+
__do_push(&mut list);
90+
}
91+
{
92+
#[inline(never)]
93+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
94+
list.push(2);
95+
}
96+
__do_push(&mut list);
97+
}
98+
{
99+
#[inline(never)]
100+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
101+
list.push(3);
102+
}
103+
__do_push(&mut list);
104+
}
105+
{
106+
#[inline(never)]
107+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
108+
list.push(4);
109+
}
110+
__do_push(&mut list);
111+
}
112+
list
113+
});
44114
}
45115
__do_insert(&mut map);
46116
}
47117
{
48118
#[inline(never)]
49119
fn __do_insert(map: &mut ::std::collections::BTreeMap<::std::string::String, ::std::vec::Vec<::std::primitive::i32>>) {
50-
map.insert("bar".to_owned(), vec![
51-
10,
52-
32,
53-
54,
54-
]);
120+
map.insert("bar".to_owned(), {
121+
let mut list = ::std::vec::Vec::new();
122+
{
123+
#[inline(never)]
124+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
125+
list.push(10);
126+
}
127+
__do_push(&mut list);
128+
}
129+
{
130+
#[inline(never)]
131+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
132+
list.push(32);
133+
}
134+
__do_push(&mut list);
135+
}
136+
{
137+
#[inline(never)]
138+
fn __do_push(list: &mut ::std::vec::Vec<::std::primitive::i32>) {
139+
list.push(54);
140+
}
141+
__do_push(&mut list);
142+
}
143+
list
144+
});
55145
}
56146
__do_insert(&mut map);
57147
}
Binary file not shown.

third-party/thrift/src/thrift/compiler/test/fixtures/rust-annotations/out/rust/gen-rust/types.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2588,10 +2588,24 @@ impl ::fbthrift::metadata::ThriftAnnotations for TransitiveDerives {
25882588

25892589
if type_id == ::std::any::TypeId::of::<rust__types::Derive>() {
25902590
let mut tmp = ::std::option::Option::Some(rust__types::Derive {
2591-
derives: vec![
2592-
"Foo".to_owned(),
2593-
"crate::Bar".to_owned(),
2594-
],
2591+
derives: {
2592+
let mut list = ::std::vec::Vec::new();
2593+
{
2594+
#[inline(never)]
2595+
fn __do_push(list: &mut ::std::vec::Vec<::std::string::String>) {
2596+
list.push("Foo".to_owned());
2597+
}
2598+
__do_push(&mut list);
2599+
}
2600+
{
2601+
#[inline(never)]
2602+
fn __do_push(list: &mut ::std::vec::Vec<::std::string::String>) {
2603+
list.push("crate::Bar".to_owned());
2604+
}
2605+
__do_push(&mut list);
2606+
}
2607+
list
2608+
},
25952609
..::std::default::Default::default()
25962610
});
25972611
let r: &mut dyn ::std::any::Any = &mut tmp;

0 commit comments

Comments
 (0)