From 5855c7fc4c9da7132fe3a22064092a2438734175 Mon Sep 17 00:00:00 2001 From: Damir Shamanaev Date: Mon, 26 Aug 2024 20:19:46 +0300 Subject: [PATCH] [framework] Adds Option macros to release (#19101) ## Description Adds recent Option changes to release branch. ## Test plan How did you test the new or updated feature? --- ## Release notes Check each box that your changes affect. If none of the boxes relate to your changes, release notes aren't required. For each box you select, include information after the relevant heading that describes the impact of your changes that a user might notice and any actions they must take to implement updates. - [ ] Protocol: - [ ] Nodes (Validators and Full nodes): - [ ] Indexer: - [ ] JSON-RPC: - [ ] GraphQL: - [ ] CLI: - [ ] Rust SDK: - [ ] REST API: --- ...000000000000000000000000000000000000000002 | Bin 66623 -> 66660 bytes crates/sui-framework-snapshot/manifest.json | 2 +- .../packages/move-stdlib/sources/option.move | 43 ++++++++----- .../move-stdlib/tests/option_tests.move | 60 ++++++++++++++++++ .../packages_compiled/sui-framework | Bin 66558 -> 66595 bytes ..._populated_genesis_snapshot_matches-2.snap | 29 ++++----- 6 files changed, 103 insertions(+), 31 deletions(-) diff --git a/crates/sui-framework-snapshot/bytecode_snapshot/55/0x0000000000000000000000000000000000000000000000000000000000000002 b/crates/sui-framework-snapshot/bytecode_snapshot/55/0x0000000000000000000000000000000000000000000000000000000000000002 index 0c65581651840fbe5545ecd4f670d693e86bbe49..54d541c98c20262d6e1d64a7ab834589d98b3206 100644 GIT binary patch delta 1327 zcmZuwOK%%h6h8Mgb3J!5_Dsf(?L0h=$FZF_&Lno48#k{uG$CyhC=fPOED!>0h*Ua@^SbAp?|f(Oy??@gIpN>! z-P*rf|6=TSWdVRoph$~b?B$;*zsGKhPx(i}{wDLQlph8g)(^p7-1&ZF-Tk2Wz#V!R z%j~0=LWNu)FG2t%sKFF0!c%YswqQT~>elx0E)akhjM$?L;2DnMhCugOBc8L+ecndV zHLh>Oh|B;KYzJV;9BeC$?ci8&-B{O*^|a}7bqK|nhi>1?0*N9*fK;O@%A~>w(9z3` zWPr{s8fPPY^LF|5p0@)$HykpsZ64+e1KkYRK=<@A0lqRmLGf^P@+@gRKhUDF&WJ5$ zE)r@>(O%y$YIbb~l@(VBVRoxLN~GQMu7kaqKDZqn_q;u7bGg=;LzTIVNz%D=H32nx zg%PIeWFF=87S^iH`~u3gZM3U?#gF{DKU1oWjj#gCv)Hf3l{kv)ajg-@l#aU3=wL6 z{ZuWzdswS_Pb$y2Tybiyz*Gf6iq|p$*IAc)9Dz!TBM=kgsBs*o7?qgW{E|431&8RI zD;=354%L3dJ)5~ggpSObK%j@ymyY@*Og}zql6-pqXkQe(vK~oG@4kOr9L&O9OF@=7 zHWDc*TUmk7Wr}waRx?P31{5(dK`}i_)nnnD36D|tN#Sv7uI;7JriO{f^hCs^a1{`n zG_d0_C>&l<#e9!?*kQBh0P-M)heC43tmw#Cm|1n1!#W<-le~;Q6eC!P9BWuaQO6N) zVk(;EaSuLSM;NN84qfi>(832a_zH^WX*T`jj<@^ROy?uzXby8XXaA3`gnx!_XfPaT z>I_zg=^uBR$9W>!cusvoJ~$`O9gJphgE<4z81N2gfFPuCPT?%+AHNy?N2SUOgYxqY zMgO)l%W0Xt&|z%0zEgCd<1gC0%59-A$p-B2Pq<_VO$C0ar~O$)0?;!wH1HCS+YV?P NThE^U_}*(Le*=CBk;ni5 delta 1289 zcmZ`&J8v9S6h8MgbNAla*`0lPpWfHlyKC>R#~wQ#zwJ1&N=Jo+QihznPMRRLIFEb2`+eUT-Fbuxcv2ZC!!Z^P?;# zHyE+S)C!VHF};DLQuNo6R9fvOADmdc{68-MZ1 zGcpmM-d|0&6OPb=;&+5%Gp?N!<3H~wJ?RKnL>8}U5!ntG^@qprw-XJ%qAa2WQIaT2 z38kcxks{jCLMtsJ9iJcHO*n*_w=&s`A0M}C$=9h84%eKT_cB>S!Rof_aF?T4Nploq zqLOf!W>g}g`wdZ$0!5;fgIZ~#Xq0Yn*Jh3oIVDr(z>6~RXD7=f8~<|BCAs+N$&tvr z<){#^pME|!Hqz&gr6I+XjSCgEt*wlRN)#V1tR*zjG(%An0h&eS`0vxgd4)Q!4bx^= zrRFJb*BVzb<#<##6(SoBQ*7wc zsL9Jnp&7xOxKT^BAx*JpH+UDZSeifl=ok4YLp6=E@uN>$2mh;|rfI})5B@8qg?A-p zEHhM}xROA|;+gq?TW5uZ8dnHPPz`Cb)8uHU49y@X>EKQ;-CcoR_MP~_S?OKewDIby zS+Z;PqglMTS5z?c=55~Ow$O;N0ja#2Ly}l(@N!Yl>uZvMXo}{HlEm?}f@oSp)W3Xw H_Tj|~ip!4d diff --git a/crates/sui-framework-snapshot/manifest.json b/crates/sui-framework-snapshot/manifest.json index 251e84b33962f..52a6de4971010 100644 --- a/crates/sui-framework-snapshot/manifest.json +++ b/crates/sui-framework-snapshot/manifest.json @@ -438,7 +438,7 @@ ] }, "55": { - "git_revision": "e19a8015fb45", + "git_revision": "495a499c3ed2", "package_ids": [ "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000002", diff --git a/crates/sui-framework/packages/move-stdlib/sources/option.move b/crates/sui-framework/packages/move-stdlib/sources/option.move index b0f1862c91ba5..00d5b9a20686f 100644 --- a/crates/sui-framework/packages/move-stdlib/sources/option.move +++ b/crates/sui-framework/packages/move-stdlib/sources/option.move @@ -153,17 +153,14 @@ module std::option { /// Destroy `Option` and call the closure `f` on the value inside if it holds one. public macro fun do<$T>($o: Option<$T>, $f: |$T|) { let o = $o; - if (o.is_some()) { - $f(o.destroy_some()); - } + if (o.is_some()) $f(o.destroy_some()) + else o.destroy_none() } /// Execute a closure on the value inside `t` if it holds one. public macro fun do_ref<$T>($o: &Option<$T>, $f: |&$T|) { let o = $o; - if (o.is_some()) { - $f(o.borrow()); - } + if (o.is_some()) $f(o.borrow()); } /// Execute a closure on the mutable reference to the value inside `t` if it holds one. @@ -176,16 +173,24 @@ module std::option { /// Equivalent to Rust's `a.or(b)`. public macro fun or<$T>($o: Option<$T>, $default: Option<$T>): Option<$T> { let o = $o; - if (o.is_some()) o - else $default + if (o.is_some()) { + o + } else { + o.destroy_none(); + $default + } } /// If the value is `Some`, call the closure `f` on it. Otherwise, return `None`. /// Equivalent to Rust's `t.and_then(f)`. public macro fun and<$T, $U>($o: Option<$T>, $f: |$T| -> Option<$U>): Option<$U> { let o = $o; - if (o.is_some()) $f(o.extract()) - else none() + if (o.is_some()) { + $f(o.destroy_some()) + } else { + o.destroy_none(); + none() + } } /// If the value is `Some`, call the closure `f` on it. Otherwise, return `None`. @@ -199,9 +204,13 @@ module std::option { /// Map an `Option` to `Option` by applying a function to a contained value. /// Equivalent to Rust's `t.map(f)`. public macro fun map<$T, $U>($o: Option<$T>, $f: |$T| -> $U): Option<$U> { - let mut o = $o; - if (o.is_some()) some($f(o.extract())) - else none() + let o = $o; + if (o.is_some()) { + some($f(o.destroy_some())) + } else { + o.destroy_none(); + none() + } } /// Map an `Option` value to `Option` by applying a function to a contained value by reference. @@ -234,7 +243,11 @@ module std::option { /// deprecated in favor of this function. public macro fun destroy_or<$T>($o: Option<$T>, $default: $T): $T { let o = $o; - if (o.is_some()) o.destroy_some() - else $default + if (o.is_some()) { + o.destroy_some() + } else { + o.destroy_none(); + $default + } } } diff --git a/crates/sui-framework/packages/move-stdlib/tests/option_tests.move b/crates/sui-framework/packages/move-stdlib/tests/option_tests.move index a8cb8875d5495..18c02dcee2218 100644 --- a/crates/sui-framework/packages/move-stdlib/tests/option_tests.move +++ b/crates/sui-framework/packages/move-stdlib/tests/option_tests.move @@ -172,6 +172,8 @@ module std::option_tests { // === Macros === + public struct NoDrop {} + #[test] fun do_destroy() { let mut counter = 0; @@ -179,6 +181,12 @@ module std::option_tests { option::some(10).do!(|x| counter = counter + x); assert!(counter == 15); + + let some = option::some(NoDrop {}); + let none = option::none(); + + some.do!(|el| { let NoDrop {} = el; }); + none.do!(|el| { let NoDrop {} = el; }); } #[test] @@ -199,6 +207,49 @@ module std::option_tests { assert!(option::none().map_ref!(|x| vector[*x]) == option::none()); } + #[test] + fun map_no_drop() { + let none = option::none().map!(|el| { + let NoDrop {} = el; + 100u64 + }); + let some = option::some(NoDrop {}).map!(|el| { + let NoDrop {} = el; + 100u64 + }); + + assert!(none == option::none()); + assert!(some == option::some(100)); + } + + #[test] + fun or_no_drop() { + let none = option::none().or!(option::some(NoDrop {})); + let some = option::some(NoDrop {}).or!(option::some(NoDrop {})); + + assert!(none.is_some()); + assert!(some.is_some()); + + let NoDrop {} = none.destroy_some(); + let NoDrop {} = some.destroy_some(); + } + + #[test] + fun and_no_drop() { + let none = option::none().and!(|e| { + let NoDrop {} = e; + option::some(100) + }); + + let some = option::some(NoDrop {}).and!(|e| { + let NoDrop {} = e; + option::some(100) + }); + + assert!(some == option::some(100)); + assert!(none == option::none()); + } + #[test] fun filter() { assert!(option::some(5).filter!(|x| *x == 5) == option::some(5)); @@ -217,4 +268,13 @@ module std::option_tests { assert!(option::none().destroy_or!(10) == 10); assert!(option::some(5).destroy_or!(10) == 5); } + + #[test] + fun destroy_or_no_drop() { + let none = option::none().destroy_or!(NoDrop {}); + let some = option::some(NoDrop {}).destroy_or!(NoDrop {}); + + let NoDrop {} = some; + let NoDrop {} = none; + } } diff --git a/crates/sui-framework/packages_compiled/sui-framework b/crates/sui-framework/packages_compiled/sui-framework index 7e808acfe68d4facc2447aa27522b1728485b336..fa0f19b2b4ab59a685a19847154df0ccda882484 100644 GIT binary patch delta 1327 zcmZuw&2Jk;6o2!zJKou>y_>b;I3Hfe>)1{lXA?Wk#QAWVGzn>wLV<9qxT2N=Cz7Zj zBE*3r;Iub{gaE-ADJLYv1&ITQ6aN4gPN>IL;u3h{0Fg@f@V@4~_j|v$GZ*jkFCX%6 z+V_sWt9?HHhq3^`B~YZrUH0m4lz-3eick1Q!u~q*yObXWo7T_4U)=d=r0;%EeB=&2 ziDmX8rcfr=$SV-QC{$q@mf!~Lz%Cr6@7>!wI|KsovJtl_19+aJxFgVg!H5?vbYHSj zbd2j8F(NYn1=|5wHV1nOWBWK392o1Cv7R$sZVsUs_t5QmSs+nF2#`utL79{p0XnwD zNCxQql5sZEgZrh|y52tU+;GUiwt1K@40I!41Krgt1o+y-B*nw^smr8(exOCY&xkE% zR|&PHX!SRZn%kH~WyKXjnB6Rm5ove51F*N#U+za|UGFxvx!h>aqsnYyl60=$OhAq8 zFv3)gETEj(#ah)~SVXz8hjzs;`;lMsXGg2!BdoykEcPpLIga95T&>6PM026lX{{tl zr_(7Vqsi2Ay*IPg>@|AR>&0X_X}6NrwL~WiL8sm6CF9Nc&U|aE**#qBES|sp`UOjW zeC(gU^Tt%F;69 z3MD9R4T{zDEE*BNlGX3HBE^*T6q~I!|EG3kqq;}J-lRKFqLd~zA zuBM-!R4d-I$}=ukoSG{zT}F`NtxUjm*5w{Ypi#vUh=~c*I1W>cO3ZA0K^(|}Lv+rS zj?58hV;+=%`43eP%MNCXkOpj6ZR5)kCtSq3x!EGV1IwoB|~T`@IyW0&nXgso~5CImw4QAK;zhY L?)=-gb{_r>^hl56 delta 1290 zcmZ`&OK%%h6h8MgbA9i4?C~pp#;>*?f?nIo-L}_P&n5qn=d-A*vmgt{w;e^e8fKx_NR#-rF`UVTHj>;=IZN-4d;)EU!3Ga zU#5QYDb&d#IfM+9pamURfGxNN+wemC&fVR!eINkOn{YrGz%7p9S%K{{Cfv5Lea^-( zZ(7fU37G&W*b3m18SH30yNkVd0PfXvnz0b03g;%JeP zGoTv_gaAw3B-G|CdwtWS{Pc`Tp}Pk>oy{?@ZJx^)#<`ne;~YlI1o&!glHzc!bpg7Z zA7?SO!H6xUSCLeTnGGbBVsIHrrPXc{!t7qTLZls@x%*&WCHo*#*Ng#~9U22NKQabn zWynkl-CHKDk7h9?t{{O_n>PZ`m2F0t_Q@Q^{toi$;oLmN^DPVVZ*|*#wI2-T2a8cK8_tKNpcpilrdIlEy_N1tXMG~L6buKmgT-Je2*P2w z98~(Fa5O0Q!-KhS?)=@?AG7lh-~3Wc_oSYal2Fnll+q;@Dat5W5!{>zN&`vDQdyMs z;@94KL^|=EqqSr^;Rr1#en%)au{H& zT1j(MW1^C9m}XQWqW3vbkOD=bl!IDnqG*(EaMxyz5IH4N=D>?G@vA2*BpZKn(j&R} zhm%8*cgs;Bp1k+={KQzFJC=qNQ#Ni?)V8)VA}UdQxv-wlMAHmKO$2BbmE(u^3TGAS zJT*+4VU?P501w(38F!zj0c+ zgPS(~y=s>1nf+)MFYXl;jJyS#H@Ph|Vr)PvujY^>mKwZV)b|FOWFVTRIin