Skip to content

Commit 0fef819

Browse files
authored
chore: Remove abusive cloning (#2663)
1 parent 6cf2004 commit 0fef819

File tree

7 files changed

+158
-176
lines changed

7 files changed

+158
-176
lines changed

bench/BINARY_SIZE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Solana version: 1.17.0
1818

1919
| Program | Binary Size | +/- |
2020
| ------- | ----------- | ------------------------ |
21-
| bench | 764,032 | 🟢 **-389,704 (33.78%)** |
21+
| bench | 735,800 | 🟢 **-417,936 (36.22%)** |
2222

2323
### Notable changes
2424

bench/COMPUTE_UNITS.md

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,53 +22,53 @@ Solana version: 1.17.0
2222
| accountInfo2 | 824 | 🟢 **-651 (44.14%)** |
2323
| accountInfo4 | 1,319 | 🟢 **-645 (32.84%)** |
2424
| accountInfo8 | 2,531 | 🟢 **-1,310 (34.11%)** |
25-
| accountEmptyInit1 | 5,099 | 🟢 **-718 (12.34%)** |
25+
| accountEmptyInit1 | 4,899 | 🟢 **-918 (15.78%)** |
2626
| accountEmpty1 | 708 | 🟢 **-441 (38.38%)** |
27-
| accountEmptyInit2 | 9,676 | 🟢 **-726 (6.98%)** |
27+
| accountEmptyInit2 | 9,325 | 🟢 **-1,077 (10.35%)** |
2828
| accountEmpty2 | 1,064 | 🟢 **-690 (39.34%)** |
29-
| accountEmptyInit4 | 18,477 | 🟢 **-1,031 (5.29%)** |
29+
| accountEmptyInit4 | 17,821 | 🟢 **-1,687 (8.65%)** |
3030
| accountEmpty4 | 1,766 | 🟢 **-774 (30.47%)** |
31-
| accountEmptyInit8 | 36,113 | 🟢 **-1,152 (3.09%)** |
31+
| accountEmptyInit8 | 34,855 | 🟢 **-2,410 (6.47%)** |
3232
| accountEmpty8 | 3,179 | 🟢 **-1,837 (36.62%)** |
33-
| accountSizedInit1 | 5,187 | 🟢 **-737 (12.44%)** |
33+
| accountSizedInit1 | 4,988 | 🟢 **-936 (15.80%)** |
3434
| accountSized1 | 732 | 🟢 **-482 (39.70%)** |
35-
| accountSizedInit2 | 9,851 | 🟢 **-829 (7.76%)** |
35+
| accountSizedInit2 | 9,499 | 🟢 **-1,181 (11.06%)** |
3636
| accountSized2 | 1,106 | 🟢 **-767 (40.95%)** |
37-
| accountSizedInit4 | 18,876 | 🟢 **-1,094 (5.48%)** |
37+
| accountSizedInit4 | 18,219 | 🟢 **-1,751 (8.77%)** |
3838
| accountSized4 | 1,863 | 🟢 **-899 (32.55%)** |
39-
| accountSizedInit8 | 36,832 | 🟢 **-1,290 (3.38%)** |
39+
| accountSizedInit8 | 35,574 | 🟢 **-2,548 (6.68%)** |
4040
| accountSized8 | 3,374 | 🟢 **-1,979 (36.97%)** |
41-
| accountUnsizedInit1 | 5,275 | 🟢 **-777 (12.84%)** |
41+
| accountUnsizedInit1 | 5,075 | 🟢 **-977 (16.14%)** |
4242
| accountUnsized1 | 759 | 🟢 **-579 (43.27%)** |
43-
| accountUnsizedInit2 | 10,090 | 🟢 **-839 (7.68%)** |
43+
| accountUnsizedInit2 | 9,736 | 🟢 **-1,193 (10.92%)** |
4444
| accountUnsized2 | 1,168 | 🟢 **-610 (34.31%)** |
45-
| accountUnsizedInit4 | 19,281 | 🟢 **-1,058 (5.20%)** |
45+
| accountUnsizedInit4 | 18,622 | 🟢 **-1,717 (8.44%)** |
4646
| accountUnsized4 | 2,000 | 🟢 **-1,136 (36.22%)** |
47-
| accountUnsizedInit8 | 37,378 | 🟢 **-1,718 (4.39%)** |
47+
| accountUnsizedInit8 | 36,119 | 🟢 **-2,977 (7.61%)** |
4848
| accountUnsized8 | 3,667 | 🟢 **-2,285 (38.39%)** |
49-
| boxedAccountEmptyInit1 | 5,145 | 🟢 **-889 (14.73%)** |
49+
| boxedAccountEmptyInit1 | 4,952 | 🟢 **-1,082 (17.93%)** |
5050
| boxedAccountEmpty1 | 745 | 🟢 **-143 (16.10%)** |
51-
| boxedAccountEmptyInit2 | 9,769 | 🟢 **-864 (8.13%)** |
51+
| boxedAccountEmptyInit2 | 9,426 | 🟢 **-1,207 (11.35%)** |
5252
| boxedAccountEmpty2 | 1,136 | 🟢 **-265 (18.92%)** |
53-
| boxedAccountEmptyInit4 | 18,661 | 🟢 **-650 (3.37%)** |
53+
| boxedAccountEmptyInit4 | 18,020 | 🟢 **-1,291 (6.69%)** |
5454
| boxedAccountEmpty4 | 1,913 | 🟢 **-511 (21.08%)** |
55-
| boxedAccountEmptyInit8 | 36,488 | 🟢 **-648 (1.74%)** |
55+
| boxedAccountEmptyInit8 | 35,248 | 🟢 **-1,888 (5.08%)** |
5656
| boxedAccountEmpty8 | 3,500 | 🟢 **-1,159 (24.88%)** |
57-
| boxedAccountSizedInit1 | 5,222 | 🟢 **-908 (14.81%)** |
57+
| boxedAccountSizedInit1 | 5,027 | 🟢 **-1,103 (17.99%)** |
5858
| boxedAccountSized1 | 767 | 🟢 **-150 (16.36%)** |
59-
| boxedAccountSizedInit2 | 9,925 | 🟢 **-903 (8.34%)** |
59+
| boxedAccountSizedInit2 | 9,582 | 🟢 **-1,246 (11.51%)** |
6060
| boxedAccountSized2 | 1,183 | 🟢 **-280 (19.14%)** |
61-
| boxedAccountSizedInit4 | 18,973 | 🟢 **-730 (3.71%)** |
61+
| boxedAccountSizedInit4 | 18,332 | 🟢 **-1,371 (6.96%)** |
6262
| boxedAccountSized4 | 2,002 | 🟢 **-541 (21.27%)** |
63-
| boxedAccountSizedInit8 | 37,111 | 🟢 **-808 (2.13%)** |
63+
| boxedAccountSizedInit8 | 35,868 | 🟢 **-2,051 (5.41%)** |
6464
| boxedAccountSized8 | 3,682 | 🟢 **-1,216 (24.83%)** |
65-
| boxedAccountUnsizedInit1 | 5,304 | 🟢 **-936 (15.00%)** |
65+
| boxedAccountUnsizedInit1 | 5,109 | 🟢 **-1,131 (18.13%)** |
6666
| boxedAccountUnsized1 | 797 | 🟢 **-175 (18.00%)** |
67-
| boxedAccountUnsizedInit2 | 10,089 | 🟢 **-959 (8.68%)** |
67+
| boxedAccountUnsizedInit2 | 9,746 | 🟢 **-1,302 (11.78%)** |
6868
| boxedAccountUnsized2 | 1,246 | 🟢 **-324 (20.64%)** |
69-
| boxedAccountUnsizedInit4 | 19,303 | 🟢 **-835 (4.15%)** |
69+
| boxedAccountUnsizedInit4 | 18,658 | 🟢 **-1,480 (7.35%)** |
7070
| boxedAccountUnsized4 | 2,135 | 🟢 **-633 (22.87%)** |
71-
| boxedAccountUnsizedInit8 | 37,770 | 🟢 **-1,030 (2.65%)** |
71+
| boxedAccountUnsizedInit8 | 36,525 | 🟢 **-2,275 (5.86%)** |
7272
| boxedAccountUnsized8 | 3,948 | 🟢 **-1,399 (26.16%)** |
7373
| boxedInterfaceAccountMint1 | 2,085 | 🟢 **-211 (9.19%)** |
7474
| boxedInterfaceAccountMint2 | 3,726 | 🟢 **-403 (9.76%)** |

lang/syn/src/codegen/accounts/constraints.rs

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,10 @@ pub fn generate_constraint_close(
239239

240240
pub fn generate_constraint_mut(f: &Field, c: &ConstraintMut) -> proc_macro2::TokenStream {
241241
let ident = &f.ident;
242+
let account_ref = generate_account_ref(f);
242243
let error = generate_custom_error(ident, &c.error, quote! { ConstraintMut }, &None);
243244
quote! {
244-
if !#ident.to_account_info().is_writable {
245+
if !#account_ref.is_writable {
245246
return #error;
246247
}
247248
}
@@ -281,16 +282,11 @@ pub fn generate_constraint_has_one(
281282

282283
pub fn generate_constraint_signer(f: &Field, c: &ConstraintSigner) -> proc_macro2::TokenStream {
283284
let ident = &f.ident;
284-
let info = match f.ty {
285-
Ty::AccountInfo => quote! { #ident },
286-
Ty::Account(_) => quote! { #ident.to_account_info() },
287-
Ty::InterfaceAccount(_) => quote! { #ident.to_account_info() },
288-
Ty::AccountLoader(_) => quote! { #ident.to_account_info() },
289-
_ => panic!("Invalid syntax: signer cannot be specified."),
290-
};
285+
let account_ref = generate_account_ref(f);
286+
291287
let error = generate_custom_error(ident, &c.error, quote! { ConstraintSigner }, &None);
292288
quote! {
293-
if !#info.is_signer {
289+
if !#account_ref.is_signer {
294290
return #error;
295291
}
296292
}
@@ -403,7 +399,7 @@ fn generate_constraint_realloc(
403399
**__field_info.lamports.borrow_mut() = __field_info.lamports().checked_sub(__lamport_amt).unwrap();
404400
}
405401

406-
#field.to_account_info().realloc(#new_space, #zero)?;
402+
__field_info.realloc(#new_space, #zero)?;
407403
__reallocs.insert(#field.key());
408404
}
409405
}
@@ -430,6 +426,8 @@ fn generate_constraint_init_group(
430426
let from_account_info = f.from_account_info(Some(&c.kind), true);
431427
let from_account_info_unchecked = f.from_account_info(Some(&c.kind), false);
432428

429+
let account_ref = generate_account_ref(f);
430+
433431
// PDA bump seeds.
434432
let (find_pda, seeds_with_bump) = match &c.seeds {
435433
None => (quote! {}, quote! {}),
@@ -547,7 +545,7 @@ fn generate_constraint_init_group(
547545
// Checks that all the required accounts for this operation are present.
548546
#optional_checks
549547

550-
let owner_program = AsRef::<AccountInfo>::as_ref(&#field).owner;
548+
let owner_program = #account_ref.owner;
551549
if !#if_needed || owner_program == &anchor_lang::solana_program::system_program::ID {
552550
#payer_optional_check
553551

@@ -618,7 +616,7 @@ fn generate_constraint_init_group(
618616
// Checks that all the required accounts for this operation are present.
619617
#optional_checks
620618

621-
let owner_program = AsRef::<AccountInfo>::as_ref(&#field).owner;
619+
let owner_program = #account_ref.owner;
622620
if !#if_needed || owner_program == &anchor_lang::solana_program::system_program::ID {
623621
#payer_optional_check
624622

@@ -796,7 +794,7 @@ fn generate_constraint_init_group(
796794
// Checks that all the required accounts for this operation are present.
797795
#optional_checks
798796

799-
let actual_field = #field.to_account_info();
797+
let actual_field = #account_ref;
800798
let actual_owner = actual_field.owner;
801799

802800
// Define the account space variable.
@@ -911,6 +909,7 @@ fn generate_constraint_associated_token(
911909
) -> proc_macro2::TokenStream {
912910
let name = &f.ident;
913911
let name_str = name.to_string();
912+
let account_ref = generate_account_ref(f);
914913
let wallet_address = &c.wallet;
915914
let spl_token_mint_address = &c.mint;
916915

@@ -928,7 +927,7 @@ fn generate_constraint_associated_token(
928927
let token_program_optional_check = optional_check_scope.generate_check(token_program);
929928
quote! {
930929
#token_program_optional_check
931-
if #name.to_account_info().owner != &#token_program.key() { return Err(anchor_lang::error::ErrorCode::ConstraintAssociatedTokenTokenProgram.into()); }
930+
if #account_ref.owner != &#token_program.key() { return Err(anchor_lang::error::ErrorCode::ConstraintAssociatedTokenTokenProgram.into()); }
932931
}
933932
}
934933
None => quote! {},
@@ -967,6 +966,7 @@ fn generate_constraint_token_account(
967966
accs: &AccountsStruct,
968967
) -> proc_macro2::TokenStream {
969968
let name = &f.ident;
969+
let account_ref = generate_account_ref(f);
970970
let mut optional_check_scope = OptionalCheckScope::new_with_field(accs, name);
971971
let authority_check = match &c.authority {
972972
Some(authority) => {
@@ -993,7 +993,7 @@ fn generate_constraint_token_account(
993993
let token_program_optional_check = optional_check_scope.generate_check(token_program);
994994
quote! {
995995
#token_program_optional_check
996-
if #name.to_account_info().owner != &#token_program.key() { return Err(anchor_lang::error::ErrorCode::ConstraintTokenTokenProgram.into()); }
996+
if #account_ref.owner != &#token_program.key() { return Err(anchor_lang::error::ErrorCode::ConstraintTokenTokenProgram.into()); }
997997
}
998998
}
999999
None => quote! {},
@@ -1013,6 +1013,7 @@ fn generate_constraint_mint(
10131013
accs: &AccountsStruct,
10141014
) -> proc_macro2::TokenStream {
10151015
let name = &f.ident;
1016+
let account_ref = generate_account_ref(f);
10161017

10171018
let decimal_check = match &c.decimals {
10181019
Some(decimals) => quote! {
@@ -1053,7 +1054,7 @@ fn generate_constraint_mint(
10531054
let token_program_optional_check = optional_check_scope.generate_check(token_program);
10541055
quote! {
10551056
#token_program_optional_check
1056-
if #name.to_account_info().owner != &#token_program.key() { return Err(anchor_lang::error::ErrorCode::ConstraintMintTokenProgram.into()); }
1057+
if #account_ref.owner != &#token_program.key() { return Err(anchor_lang::error::ErrorCode::ConstraintMintTokenProgram.into()); }
10571058
}
10581059
}
10591060
None => quote! {},
@@ -1192,13 +1193,13 @@ pub fn generate_constraint_executable(
11921193
f: &Field,
11931194
_c: &ConstraintExecutable,
11941195
) -> proc_macro2::TokenStream {
1195-
let name = &f.ident;
1196-
let name_str = name.to_string();
1196+
let name_str = f.ident.to_string();
1197+
let account_ref = generate_account_ref(f);
11971198

11981199
// because we are only acting on the field, we know it isnt optional at this point
11991200
// as it was unwrapped in `generate_constraint`
12001201
quote! {
1201-
if !#name.to_account_info().executable {
1202+
if !#account_ref.executable {
12021203
return Err(anchor_lang::error::Error::from(anchor_lang::error::ErrorCode::ConstraintExecutable).with_account_name(#name_str));
12031204
}
12041205
}
@@ -1231,3 +1232,16 @@ fn generate_custom_error(
12311232
Err(#error)
12321233
}
12331234
}
1235+
1236+
fn generate_account_ref(field: &Field) -> proc_macro2::TokenStream {
1237+
let name = &field.ident;
1238+
1239+
match &field.ty {
1240+
Ty::AccountInfo => quote!(&#name),
1241+
Ty::Account(acc) if acc.boxed => quote!(AsRef::<AccountInfo>::as_ref(#name.as_ref())),
1242+
Ty::InterfaceAccount(acc) if acc.boxed => {
1243+
quote!(AsRef::<AccountInfo>::as_ref(#name.as_ref()))
1244+
}
1245+
_ => quote!(AsRef::<AccountInfo>::as_ref(&#name)),
1246+
}
1247+
}

lang/syn/src/codegen/program/idl.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ pub fn idl_accounts_and_functions() -> proc_macro2::TokenStream {
166166
accounts.from.clone(),
167167
accounts.to.clone(),
168168
accounts.base.clone(),
169-
accounts.system_program.to_account_info().clone(),
169+
accounts.system_program.to_account_info(),
170170
],
171171
&[seeds],
172172
)?;
@@ -209,15 +209,16 @@ pub fn idl_accounts_and_functions() -> proc_macro2::TokenStream {
209209
return Err(anchor_lang::error::ErrorCode::IdlAccountNotEmpty.into());
210210
}
211211

212-
let new_account_space = accounts.idl.to_account_info().data_len().checked_add(std::cmp::min(
212+
let idl_ref = AsRef::<AccountInfo>::as_ref(&accounts.idl);
213+
let new_account_space = idl_ref.data_len().checked_add(std::cmp::min(
213214
data_len
214-
.checked_sub(accounts.idl.to_account_info().data_len())
215+
.checked_sub(idl_ref.data_len())
215216
.expect("data_len should always be >= the current account space"),
216217
10_000,
217218
))
218219
.unwrap();
219220

220-
if new_account_space > accounts.idl.to_account_info().data_len() {
221+
if new_account_space > idl_ref.data_len() {
221222
let sysvar_rent = Rent::get()?;
222223
let new_rent_minimum = sysvar_rent.minimum_balance(new_account_space);
223224
anchor_lang::system_program::transfer(
@@ -229,10 +230,10 @@ pub fn idl_accounts_and_functions() -> proc_macro2::TokenStream {
229230
},
230231
),
231232
new_rent_minimum
232-
.checked_sub(accounts.idl.to_account_info().lamports())
233+
.checked_sub(idl_ref.lamports())
233234
.unwrap(),
234235
)?;
235-
accounts.idl.to_account_info().realloc(new_account_space, false)?;
236+
idl_ref.realloc(new_account_space, false)?;
236237
}
237238

238239
Ok(())

0 commit comments

Comments
 (0)