From 3a02c42d50378ce4f40268207afd2810d3ba459d Mon Sep 17 00:00:00 2001 From: dsavvinov Date: Thu, 21 Jul 2016 16:14:01 +0300 Subject: [PATCH] Protobuf: fixed a bug when fields with initial values were serialized anyway. Fixed a bug in methods, related to size estimation, now tags are properly included/excluded from total size depending on context --- .../google/protobuf/compiler/kotlin/protoc | Bin 106016 -> 110112 bytes .../kotlin/src/kotlin_class_generator.cc | 7 +- .../kotlin/src/kotlin_field_generator.cc | 125 +++++++++++------- 3 files changed, 84 insertions(+), 48 deletions(-) diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc index 8ec5a61708e4593995890b5fe453eabd2bf4dc50..b2377c8317298214d52bb3c2e0a597746ad873ce 100755 GIT binary patch delta 31163 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

G8RvKml*``S6I(Oa2Pi#crZTg{9^ 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 p^=a~K0=2n@!CayPF~%Nm5W9>0v5u)F zl@*zlTP~=GTP|6VS(#c=TAnNJnc+A5{I^0i(m+EkT z9e!Mg+ZyN!%5((*I{d5-H|p?m9UiE|6&)U=!*A*EU=>%#zfxBaqH7>%vz;u|P=|Z! z@K7D@tHVt?+^ECDbhs(O_GEdq)fGhO8Z^@3(K@`b4v*F0W*u(P;o&;m>cUC?Cc1(& zR{^l5I()DWkJsVpIy^#$PtxI$Iy^&%Hv_KPADP*@g66sgSvtIh4qvLnTk7xv9o|ZZ zuhHS1pWwklp{}6ylLDbAfdw^u&ekYQu;!L#8kC;!M%L^jo`=;s&gZwG$Qix^KYc3LWK6JmH&&CZFdhjeMG;fCGyN zAYbOl;`AJ%X=*w$I6a+ca$SyePQOSrxhzK-r^gUYuF7HI^iZP7MLD85-Ir)`O%4;M zQ$X7$kxO#;av+f^kSlTsobEt0xf;i<#{j}x6HPA0QO@ZoqRF#3$~fJKX!0nIQcedE zO`gQDh12zjCJ*8$bBv=?7t;$x}EoIDLm`@(_-6PG2RO zJcA>R)4vl<9>HPZ^f{u*6F8zdeVS-;01gwUPlnk5(8_oCa^MhEc#dd+)5S!S2XNf_ zmn^W2XcN)poZdtbiKYeT5IEg|Xj*8FTaWl0Aewd(j&e>%5gkKx8K)Z&P3z22%IPtoVZww0 z(EPDxU-LYWfW3tBJM3G$JHaqoC`m|UJ545ELbs_Xz{EuMrv@&n0=p)%24Mpmn7k7N zrQ<7Dule)LrV=96zp34-<5!7QE}iw?60$`aJMJHaP3Nf34)L;C^N7Ntn6*_GZ_`yVrd zcawhPN$QR`Kn2cnRL}ef z*hBO89#cyNp=78V`ysrggc3uOY{`6>Eo;(W`t>9$Z!%dL?#6mH9W2Ft!#-%*O?qz` zyVi7}bRc*8w1~Gw$6%{ieN|P-D=%Wa%X#*QTN*)HuDpu z`G>aGZE;+b*gkf?b;ltq<2aQyar!zoJ}ru>CQ{?T6aT6{)Dp^Y2I(_pyu5C)UY=EU1xeKcb`! zWG&l;OBQ!FpxqnNs-5gwyWY~)02bf=b?IhpcB*}##|`i+xmcTBYu}3aG>i?WBq`P^ z)iko#V?XsEc1nCdmKfKB7`+&`+~Wb-6uWtC|2J;97}913O|Tp@%!_oNc?;6wT3+Dl z?zMeJ$ChGDZ4kx2fJ-dTS%joKOKeQ3a;CT1OhDA2X1AzWAT{&$+I}WJUX)7RS-sBP zeS$D;Q|&jb_9Sz(va2tf*g08`S(H(I*@5a64;LP@oB(rI%nxLMzduGl>)H#a1L zZ_YxoHTS$vPCG<;Yu;va5rEV@wOwld6!Ywg2$$oq=FK&w+8-u#y2CbkGf?hS-Z|rR=9c>8bO(lX=}0QepKr0|@8EhUoqljSS<4;`r0gG9 z{(R%a$)J<-yBkT~a`cah&WD^VmSpxMb!e`V+ElDW{!YSgHfMpb=3e*7xsPoO39S$S zt;&(A!iN=D^X8kZ_Ft9D-?L>MTvC7R#-jWAH=pjNN^P}YR7QTUN<9)7Nj(#(H80cb zNun!--?LAXjJEDjEjh0S32MRs>Z~`tjxx_rL&Wg+0l+^n%%#X$nLGyN>A+Gl2`S~SqzLcc!$a~ zyOXra*Qc47Zj|bO&*DcLZTC@K(A6>hX&U-{F6T3oCc#l`mPV*kU><^M7uO=^ipmLNE<3Xq#m$FW8 z1~<@guqZwnhaqfg=Rogi*dJB(pT_dX1lx4A)0AC_YJV}P=kiu|hc)tN>q5kA(qJ0A z5D2wDnuer-I#5aGR@VGfb2{yCGKzJ4)0I&!zE8X$x8IB*Hl6X-kn#Na0PHYlp$pDQ zX?%f(MDGey;3BNktJg6lieN zhQ5^L4d2olnzWINuB8^uIOceT^%@@%IYz5c%FUl+E~7N=*o*>42TTC)tJs7ej>%5; z&N!pLPwp6?4lk`}djWYNR@%cR%|FKyto0*j%V@66aVuN_1@U4VdFts}WFbUJILGE& z+enYTV%w~XrOdBbhh&pf?-Xm<(I^c*#lkE`sq-l|I^JkBpTZ2z@5bFe`FEGwXQjyj z(jRBp&&jQ%jVD>Hlm(LcBwLmeB2Hi#{Q^69eT8;;GY}W{nWLeza(;p;nQDoB+!Yt+ zkz`q#WMnnv$WQD+N;_%Z3D&yjV(IR2R@~DhtvbPcKQl^aPq2)s#<-FbFbvpcpgwj$ zN(l`kbXEsvA0M{j0^+<}LcG~hVw z9JKH_jq-2`W|`*n;xbH9njXujKctJOn3s5ZswEj(NfAo0Yf-_6$A}A@6RoCnWy%@$ zUazs*X68?dl_upu9P{g)q{pI_kK)+G-mYyOuV+#E#<6|9yJ__vQ`7}D=Y?@i>c9hxE zg4x|+FL&;Vs7i6)Wx!IJA`=ir$*NmGkhKeu7Oy9(uGFkbh%)UvwqbZ29U0CIUm$Hf z#D`amFZD!Isw%oWzG2~` z+DIEq+0apo!$L~c7?q<1;`K;r*nE>QY!+oiDTQI9+d*AN7UGtd;i-H*oW-Qq_p3I0 zX2sN{{Naemv{{!~`w5ZK`aNvSgdC~C9;QqPkp}N!35mvzkN1!y z*tXItD5W|72=4MftIe|xmWCUC&=fADYF~WGhD>ZFW$tFnCeD-Y?P8vjLfzlkt*y56 zyJ@w>90X0qPAjg7wy8K2e~bPoJ%*B!Pz@Xkg1|ew+44zEjUOK&nR58{To?6i?5jz= zwE20D)>X99K8iJ+?D9$+vnZD$+1$x3rLhk7$>cCEM>YafDnuCU2&X6~MeHKUOy0Xx zz0=7xrYT*>AHe)gNnk{}%Pjrt23|9cRh%U16Xm&GENiK$|89&ywPRHg0PR@i@=SCL z^R&_-tE4&fD{iA%Z7Hlq)}yHBvM-KdAvlJa!wUf_p(KRV*#x`%LX3guy9lU^ndiIfJjY%DkYN0^8=1}K*ITTU0!bw*foHX2hle%<>q$3N} zQq_%A@6zb1+I0pVw~Z}ZF{FDogp`>ool5R&}&WfRScDQkiyOAtjXDZ4`H; zueMQCux;JubY{1HYy0FlG0fSIy?t_OpddAWBaf-H%35Zt3e#4E zCN0I1;^mm7C0W{3B}C~#4qHDP2SE~2R6V0@=Iz31Y0a)^>N+v-Q|Jxl(H8v(|H``b z?A-%n`=w9Lw_u%|H!>pC{vb8(VbziC4u@xAzTQ-3^2R= zfH^JyQa)Xh%q{5PWFaq9?ciilR%lG>K4R0}G}_w#3z1!?FKSFo$~7h}iAmajn4~G~ zH755V0v{@BMZ=qlo1p)m*|-Z$S47_GOGlf>PN#M+j5lM+kr$H}LUGbO2qhrUeb&5B zlkAla5kS=>s51XxGXH9fr=!D@aym>sz+no9reP3E>p&0)ufSsQgSIMn9vthlVsoZ&WQ5)vS2~e8~a0X1_JB7p`aM#BN`$ z9`E7IXaXhY_c!AfVYzt{jZPk%+-mb|o{hHJ?^xZ^JSQs~_7cO@<}6+xOcHiux(Iv5 zq2ri)$8yYc9L0Zv(v7-?oq5E@0y6gFn={CVou=Bi592*AAZ@= ziuB_9f2gtuMAe@Dhfk>$X*^lexG}oJkvc?};b+aOGJR}KnBJ2c0a(c}+`cPsQCk<+ z=6bF+Ub2rXjn!l`M_@VmN$n<=Ka8Qo>39jR<%_Mx44OA24W?;heH=4w;oTZI#;Omo{LLmJh za3LGjqd|S2Tr+|61E3=WDf@A5DqUrp=Ox7@;XNSDi7hm-F((RWOlAq15y z5WR9Q`{eXz@6L;q>TP1D=H-Mh|5%L;NeDgU8HXcH&bL|U#8iqFO0!Mc{_B-Z6ahyL z0!_V@lD;^f{zTgws?7CQ&nrseJ_4UQ3$3B)ny*dQa^n4P=To9RVr~msNt=owS_n&9 zFiA2OvEl`x(%~W=plW{1Zx3%4F&~?8>s&~I@3O4E3%Bn z0UuF6>P_C>WzCU&iw0+5f(!Fx;`Q${^U{|wRNryjR!3*tD><8?_g<&Bx zJ^%|X{E)~QWKq655B`u{TG*|h`pV&=a_vJb-uJoq7Zn?|;)^$yza+Y-e2rq7vqyOe zMntnuIPG0{&2+8i`yaBoivsI>0ah{htogHzO2ZG?yNen}R^m3BL?|E;V9G4g=pb2b zk7hMO6mc87zQ`!Gzri}cVT}A`ql^C`O|}Y>0FpFDTIFqKZX|<6t*6?WO?Z@1PLi8N z1hqn5T?BQoW!bIiecrF5gY=gL(aN9(>`HbEsYqg-->g<-QJns)OHK!&U}$KAt1K(w6g zC;_ivHS5LQH-ST|az*U=;*gNTg=7c4KfX;46~g`eE(>4M$m0j9U_Z?2+Um2>OTwg- zLYA|{Bt;am50`YUacKi?FE@~Xt?82!3h$|uZeZR^&C=QptnJd_wrpFhn>EiP&k~;* zg16W{J5TuRJe`@GU0FLb-rUqI z_&*G%gV))Py*M%#Jh529poD?^z(DWVlI?9C;XRxEZ~lH1@7rSewAZ~~ivaNC{aOfr znTnI0KWjDbITos% zdig`AA5Z1bdbauHLACIfkH2jTtHDaA__w(V4?*V(9-5W-^=cG31C*l3H7eCk7^UE@ zoJR%zzAfx+eva~Z8!}PM!VITP_!5#4zME*m1*FOy3cAp*+A-?CQREYZuxk4K$zLRD zTUqGGk5fqy0#E*0yt15+BroWoY^iH2v^su~^vN*Z3EQvDg~ z)pa~X?ODe|)P{9z|4O4Rcb%$cxu&Lp2hSa5qDf5)sTqxfC#lJI4ggI6i~k#lZAhLMf|)rZmBqEqtRTh+$V;YQ;avkfP?CtCJ@OVx5cP||V-m1}g`Wh09zk^InwqI1w_vbUaq~^VfbKlioaW`;J@gwdjW_*=uznvQC&|Wdw zP9wt(%nV_*S2wk(ll7XcD!Cl%iRI*?kn7f(`Ll9J|IFyQPYEF>;6rH9V^HhZhe#H7LH+oM-ys3JDIh$R7 z)Aa(Azl}&&rt#{>9L-SAH6?kRSN8-rm6l{o1neenBIPA&G`^|$X(e7LNzTJ%S8`r| zx?^*qXP^QuOPrDzoZZNn1j%{;l-M+|PtXFP(IMHS@ga--?X~qUlWkU>Qcw zezW47Qi^g`W{&jWc*(L=;X~TDaWTU!DCgD<+|CiVx6lsvBSOWe*!-wWB~HJsJYL4q z--`*~Yo|@Auf3~@tc*9-9bwwkxGPW~of>1-F3n>*-?P^8=Hx}C#xmylez@@>8Ybt( zo0GGT;8yNRW<6@}IALeq-p`N*+1al58=97)jumyRxOss{+7Y}Fp)gF!GIsa<5^32| zwqxU@#9K?K?tGlDaFc=F%ZWxUPt;Z#FD3o2fQ51#c*SwdckCBv`=)&$Rg8BcBR^ap{Yl&Te_#O%y6<$A+CCJMf{| zqk|8Q1#NuT)ek#MM{-!yNAslaIjrcTQ0b2x{>r*pF1@P`udA`;?{6)|9nnl_2%Z$W z_&ptB*Ggt88Y8XsVL3&;DEYo45w8q>hPtR6r;boqio%jHT8n;Ki%+sx_U5T(`lJXSADZy-Vd*vE z&fhy|Umm(l@Be96Y4rj&^i!Kue*ruHX=sCO3#hJI&Ds&)=|Hc?3+O%lbC-Ehs@X(t zosTBDqT&zHQOUbrtovturT+8T+Rtp#_w!ir=OHcp=c~N9#{w@Scpc=}Jlqhvl$u53 zd2#_8_xbbbg-}p=o%aJ{kcw2l>ICgajR9`fgU)#>DC@zi1j5@Ez-%-WWIknpo!$R@ z98Hf=Thb`my5&Vm8g3m)$^5Ouo4=|phhb>1%$%#r&$r>~Cm^&nQD=3{xiCrt_sz=9 zIV^PBg!&Rr!0PelE}d@vEx{65vu&AlayBz>&ykX5vrXHB`Y)YLEb#$>6??`El~dc- zfFXuP7yH5#ba9zDhp$7W14?4fSD4ggSh89xJ`5)O5|ZlfoXw0o;%mLBm1WFkBX`7; zI_q~djH8=Ms#F^-;Hb#Wl-^Z&uOTLDv{n_fNUTit?mSuH?vvgt_?na^VJ$}wkMgr6lD?naQ8;#!D(x1s!NpzL{;e)J02Ro^9i7*uSN=S6CB9b6Yn2Rv zdf6W(XWztU1-#x(bapt4eN{Zis|Ns;Q>QHU!rn-)dH`T6*w!pQrU8hZB2lhuwm%n9K_XkBz0y+#ZUv3m-c1@*Iycz-qCJacn z|BWwXOQ!j;7A0XF7N8KZ65pxQyAWUH8_*@Wel*{1Dx*PI^SXLko4HvJR=Uy0@x2O) z51_PUuOC}l5^CE;72?h6i>AR(sw2*c)Fd^oeAbQ9+Ui^pZx@i|v*e~2j$%`*n{@SUR z`GY46^)hdD$*d%4Vq8F4C1@+&D#^^Y9f%6+L<9zXJOov;KvZ0y8;B?OChXRMR4wfX99ci*q}B&#}k{m z(dzu{q*B^!ZN(`*TMbGh5cHZoWdgf<%w((_r*)s-tP!A|z4H4w*8KPYDQ_Ih zKHjTgJnA^EVF#Ri@QS;mE_U(B_Aedh0VuDGW7m(5l1j(21*Hv5x5pB*r*}ztgu;T` z$FaN<-MwoX5#vweP8h4>=2&*|M0e@R7}oS;Ta)*b#4+sH$sr++F>Q|}naS?>bqd_RP$o6ce2BJJ@n5A%r(uNF%eMzMOQ z8pRngW)zdNP>W(R?c0uUj9$NC^`#XbN5@LpXsU;A+^q0JY07U?*vqG$_c@80RS~pd zI@@|`mbBTQMSUGrtMVmP`to!(^6TK5Y!s&8Nd>(w`g)#+0+uDe`Z2>douo}8SkgB+ zl6eF>`Aukp!y~Al>OstBBz*$Y@^32QvCP3&;}yjXOv%?gtSYJDuLdQ@NY?G!X48gq zZrwb|<-@6qR{KF~Z1bn^a)aJ z!Cg@v4_9qsA)7=i(I~XCKAJp0C($6TZ9n3P%qh!xn9G@p)fgbpq0LGNVb<+?LT9`?uQ=!YwXTk8g2dH zqfo>~C56|-{T0oXbY+;f>*>W0)%VjN3?^91z73?!FYqsNSG~XoY4!_r=1Cd(0#&%E zECzEm^s1-vnQB8)L^l(Baxio9YXU+FIifVLw%EB&=lBT4>0S2-47c->`Jz2f-Mv^g=reLd*R2pL1Gp6FK zn-}k?cn!l>JC*oo=PR19ya@Xd6h$lIFgCwD&|@k3R#x_6Zvw z7qn3(v;P62O6Dz^%+bA6nIlqJjo%u3Xy1pj=-;eTW(u40+kENoWOo0zrhdy)h`II& zGe6v)OJQ{sqpg$|=Q6XCe5|ykHUQU0+3d&P`$|WwEb7vHshgF3e5tWtxm6W=3$^27w@hZ` zmyG@VlBwWXVh52>1zP`~QhW5@4b`i}Uc;I0sP>LVaT~yTULHp)V(aA>DQWmeq(>|b z&u>=N>yNO&sfZS|_l~AR8%=cA`vA7&k7OyNJ3IYH_E5PS`GCx^_`RGtu2=SHsH=4D zt|~$eDNshkFD}zCsz6vQu$dg2r<ntcGdu()Xk@ZR7v(y3Q`_y1+Z3FRSgi;Dwb7`?OR8(bOyh;eih$NC$P0woBCBGsM0da}sQEZ`!7y(*URBwKXaK_F`ez>wC;3 z7dFwKb-dnN8rzxWU0*K!(1``!FiX=q(=Q)LUv#El80fIBGqHu`XpLo&KbnP>%0@1M z8%_Zx$eN! zPOz&TebG8v27=N?s8&^D27xZA&el_FmJ%b>+)d4+>#JZ-t@--|zM=7Kr-9!fZCJ%L z3{)zZX24#>uHXMWa5GuD+>zC~HD4Ovk=bvB*|eLlVB(>EwQWncctW8}m2`u3 zf@t4xUsQhWsERrh)vNkHL7+=1U+fr389z-_FRGaaFonX+es?bEicR~$R|S8FLS z4$;k@)w=t<^mQytxEm$ij%6<+c_Ws+b+<{_*YlvTD+ma&h=Fm}W}L4=ZnS6RcjIcg zDtywOHU2v~)kVJ2Uafzjs{SY-{3E%Wiut&XbB`zZdd&W+`mNft4S$EEZ>8ewBlsfw zBDb0AjX}aF$Gvv0{R$OQ&&nl0S|>%vD68RLJ;Aen(&5|NvEX~X)jOi++R+^miE_E)*-;vF-o#2^btu?QoW4o`jQGZaWrOIa`|B zma)p%m}#g&lg-hZ*z*8Ev53EI32#dnoge8Yl|%K~vPYGTMh!))16wd#z;6+1DJ}3r z-G;ffp++6?+v!&Rw&F18RQn~3cYoqdpUZ9L)m&#&^$R+JAj-kEZ2o;~fDs4NsyA^x ze2Z70&ywW<)LU(7^wU;b3>kD*+d=G#0@&t94ZHUH zKl>T*q@QB=vZt)}5%GC1fO-8J=y8zp2OvB0T&FJrSn9ul2_=N@!w<6BNgPd7tCdr? zPg`v+K+S3?C0{4mOZH;MPFr{~e_;VDl;q-u!OGNyjPFthA z;#WS*uHg)M9O$79CyPg(*O!cJIP%Ad_n`nb4|#$3JjC=up7(htfbB#67S(ZJsw4k3 z3fj{NVGzX1NoU!nXZ@JF8WRKOp3-tPnOcYY=v zihX0b*x|Xw@UXNEjjj4DV1@@ApLN)X!^)iIZ(J6~NgJc&6j7Wng-6LJMA0Ud2g)gu z*iyP2CC`z>k&<7eTK-0aJj6{cKj$Vkk%mXglDpUl*9meHO8YmJQ`|+1G^VM%++AEK zU2G!z7=Q;imD?D^#6VAO*qch1CL~fnT$8ln6TON2xRdS0)glhx&`0pr>MxEyxm&2$1h38f<+>i?q(JhN#JHomT0hOr)K4>czlS(o z+TWNu%aPhQmUnrIp}{{k*7akrbY0OIl!j*cwx{SPd6;F7nqoI2cf&6=dcrxME~th! zlE>8)r+AQx%9Swrr<&qmDL+h(sU@zEnup1UYN4+WO|rGN*f=2}OxG9JX@!RH5MOm) z@)}3~^Ad7Qn7p~Rc#(!F-%D&pX|b2sl+sIH7&fH!>xdsqg`sju9WkV5>rl13>dZqp z`XA;74NfDso36%&+s}ak{CA*GJvEoccMMW842lkd)fZ5nkUh54#@}lI!-r_RpW<$A;k2qO66HM>UBaBhR zsOn{T2xp5eRzvxLkC-5B4VF9kid{ofgH>U3Lf~Va_<>H8iCX0i4do5KVrW={jwbx= zn*0`>k@icr-%GatkQ(_1{aqjH!GGNpTabLwSA0RX)D_WZyf8#F}%d`E( z!Mm~=h@PU+)XX$!^7QfDr%iu(bY{zm<1_n@p4e~lobmE6^~I=&|CA0KJ$>@j%r>p5 zO2p{t(?`EXxk!0afY<~b)Dq-)qZsO;XVT{XW@4T&dHj@dy+^-1-b~$d#*w>j28cnD z=d`Ia$4}23KV9|+5>0Z)An|?qQIMD#_R_S>DU+x6n=xU+E( z$x|n14jesYhCDY|Y%l*5EH;$41&iULu00V)FI1;(!vE^vOHB~pn`#HqT6#;vUFnwpL6_Z7+uhPq7rz3H&fqD2`NqY-S1WMQ z|Eq%%O^|Xe6>e#k(^89;rfX@ImKJJhsg{;giv9%`L*cf@NJ}kRny#f;T3V!aT&U5< zU4np@80^-u5+6&AM1G2!)0u?h=Dr#T?Kno^`nNhoX#Air;yU8kk^o&A-uNJ>4odH5HF`Q9%*x=caeJeI-OHc9)ffq z(p04VfydW%IyWL+k90i**@tu-(o=PvHs?H&48T4rs0T(!z3M|CeAYP}Dg8#q6r}VU z8S{{4B3+JjInsT8Xou7*!0Eh70kmH5@|DAU)Lu74ety<|RXOq;#cu0qKRoPG?(~Zr^xxjI{X#XoPh0 zE6@-fte*}(NaJ6HX6R^nCOSeIKMOQEJT)5@g{7CjhIVA}IpB+Qvke(9ZG(~z1 z=@F#y^U=Tuf-Hndkxp3#9O>|USb*xk4uLRa>yc(6owCB|+>F$#02(9Ryb@!MzsQ%m z8XY2C{suZkO5fpm)q_GZ1V?J~S_1~iY(~0~3JPILr1Rc|0QJH6J&ZBZc^^2PtC4Ol zayqXeJ+%V@<4^cCKZr3!I{Xxd4r$0Yz%hrKBh5tm2v1~86Q5B*KRO#B}K zoc^Amkl^i`E%o!pSn`M3t;YX@!Ou)clDF?Dl(t27GyeBQyF-L0diySy61bDqVwhWzhg0s?Tx=117PVX)sd6g*Z!QYLt=dj`U30OQTY;BTu0Y0%Ce|bm?vAu1Q=yW!rmgs&2x+k&XvFy_z*3;_r2W|!aEOofLD6hnd#-MBJrd6p+ zYOO|j1lk{>a#bz4Db$gpTZ*1;rH~YV=PcY!L1rv6J$>t7gsHCfkZf(Cf+uh+k*bIA zR2q|~@aBNV0j~tZ?^}v3YFDB{5`=JX+(xe5N^Dr$1ivznfUa%iHmy*@3ct~vfT?Zd zmjH-q@>{LMrnQYPIh`B8&V5xI`Kwl9r`osRIJ{wK_rf-E{b;m24iEA+0VQqZp3!1> z?brrR=gS0KZzIn|4Y5rAI9i-2?w0Guh%!+z;zTb`)Vc?U<6gV1HY{;%L@&8hYq6Qv z7C4>9R5lQ0TcX8KnY9*Mcn!wxxHepYd!fFGdzqVC5BY_*VuOY~;b-{MpCkqY-{wx| zFPJ9okBCtW7*(_uBYnvcu4(IZZX#xbpV#_W*9Lvu>g058gYDhFAedVGMeyK6r}IsC zH}@M_?HVcGx7^%5k`r1#-S0SzP+_Xmc^b3GeOx<@`TK3f@Mbh#v^$b)8-Jj z^ra7-qPP z8f)a0?Zh@dnJ5=thC!&jq`mw-m8U}Pa`}Ecv8V4{l$%hVLX+Uz_6c%UC)n}T_F|ZC z61bSAI-Q-!#5YjH7v!Gy;JO|~o(KZhXuM3ZWPoI!y8sK};4hJ|uW`^MzZxq>K6e-9 zjeSZzvVa$2g6{&kI9BXXBNchm0{KC#*xHbT{BAiWPV8CZ46>d!c~P90Qp1c$FgQy- z9VhlR%tO9Vj_e?|G3-FLNFLomY~~Y>+LhT@yrj*BSb1FsF;tu_@9iK48k!@XWXV5w z5QBXvCKcpjDUeb2$I5OU#V{Z0Nm%T3wj!OriIv-Qgn9kI`&PbIGa^oY6*Xfia;3lS zbY7?CadCKKOJ1{ww?!(dO~+@xsylh8K)UA`FXL9e50e-#Frvp zIU-jJDxZOJK8L%;W7da2*xd+b4QXP&;cB`vUTou=NqQh`y+B2A9b7Y?TAf1C(#=qT z=HY<6+7I?(n>Jyb_VJh$~yVVI- zBL{?akKDSm7-iUj{2F<5XR)zQTktR4<8Z70| zw`Zt)zKa-FV+!QA9F&7BVv1oO@>%j^3ugB?;&T|06{@;#K?`o-OBOM*<~T%W&oZoS z`R(SSQErhSHmyOCJGyMw&;;>!aX_YFg|DzqG%T(s{O(5iy#~V{bp^#h`4u$`XX^^b zJSl&})9_1OVPkE|->q$Ux2|x?i)wDHW4P)oJgQ^Z>MMNcy#S>j`O43C701YiByqIO zUQ@Uv8D6g`tZ*|Rzthc7R8u%*XoP%@2jOQu40}C=zdekE(C^N`UelM0hS&Xt3dwNH zPx!)(^2}hk?k9Y2p!@@aLGcszds6I)BSbqtT| z3CFxoiYVXd+x(E9aL3oM%ujf$?j+=Q)iVP>R$uMbE-n!bD+7ejM8iJ~gfniGceokW z1qcQ1hVuc!k2MIXsA1R~D6H}@d=Vhrt4YY8wG9sfgm1m#kzZ41);goG(c7>!P$=^b zvVq9)H5@Ps7kmwcMqx)?!yiUrc|B_IX}#HKu)Dq?FHpE#e>(CD{nJVt2zMH&;>^z$ z4L|t_n?%EIf071yNaOS)Y2NZDX@EeQOMWEHuMLEMY7+8GZNnda!U`{cnpNm0 zl-4m^Y9L&zV?chjk6}0RK8BzDg(JR(N`LI&sloobbJ5^Zy%#R{38(#bE$=RN5PjZp z6LyKyut+6Cshe$w7S`z{^u2_iJO2OuXeYfvEYdt{@T6kUvsFA*AvP^67-N( zzrKKd)-!NFm&|ltd-Avm{t$Nb6F|$k2@QnuXW{{Z@=V+)RCak5ADGOd$N8R?lBW+4XNigO)dAv6 zDaczMGZ1K^ylNn>!M3cD52@rGkgYSAg>yNi@uIDUME|tKQ+RKfE(Y0WocBSX!zG~C7351WZ+;n^CV_OZ&RP~)=*@rml+((sjC2uCq{kX0(SOKPcXBFyH*jG89&-{K2J{={H8td zMo`1@k%g*u6|Pc(XFm$+k$qNMIQ<6yDG0PVA-vG0;^Q@ZF!lrV?}}i8)fy_cOxf~{ zT2677o~DT2)GqoB3#Vy^Mb9f5UV7WY>3jUAAbh0Zx3UhQ6v8Rj^E0{ia4ed^?((ML;*UX3>(>FN)4EcS zuscCsJ3{O(l`Hb^Be1H<-jM5!1Z`R=4;?AK9`v+JTMWM#2Kg-RvNVcTp_|-#l-NC} zV4H>aPx~=?q8n=eMvNe@Lb;UjxqNPvI5RA3xrLY0$%melP))Dt7EYg*UrEOuF}h!y zj#m=}+vEq7ZW$sE9WA!3>6@ii%aT`)Mz!<-XV5VXz3-Y?aTUTuR$0*BUEU{rfol zBUw~^5o1eZkakyXo}+bp5jf46EeZ0AW5M2{&26j3J`{6R{r7X^ZOgyfNh*IjKG9Qvl=`*&Y2kFS)^ES&DqqaiW#hz|LFIp|<+RVD=THl^U6v#VjmKPm z`dJKA0f(a0Lfft1H-wl6D1$sIy@|BawLzl2EIsYp ztM$_NS~yMnetPmWymYID)0hMNIjiAW*X5u|m}*!7b0&!`UohocczF+vZ(*Fux3pNr z={Q2q9Sx8E%);sCwfa#V)cUtRSMfu;?oSerS){(d%ZEM|Th?-|thqw=O{D4R;=vQ`;J8TB&iuD$G4w2eg!(=Yjk(gr-Hj7=v X1i8bfNLI^pC_x=chR6>-6`TA&x$fsr diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc index a110cf50e73..d3e9824a5b7 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc @@ -336,7 +336,7 @@ void ClassGenerator::generateParseMethods(io::Printer *printer) const { vars["dollar"] = "$"; printer->Print(vars, "if (getSizeNoTag() > expectedSize) { " - "throw InvalidProtocolBufferException(\"Error: expected size of message $dollar$expectedSize, but have read at least $dollar${getSize()}\") " + "throw InvalidProtocolBufferException(\"Error: expected size of message $dollar$expectedSize, but have read at least $dollar${getSizeNoTag()}\") " "}\n"); printer->Print("return this\n"); @@ -360,7 +360,7 @@ void ClassGenerator::generateParseMethods(io::Printer *printer) const { void ClassGenerator::generateGetSizeMethod(io::Printer *printer) const { // getSize(): Int - printer->Print("fun getSize(): Int {\n"); + printer->Print("fun getSize(fieldNumber: Int): Int {\n"); printer->Indent(); printer->Print("var size = 0\n"); @@ -368,6 +368,7 @@ void ClassGenerator::generateGetSizeMethod(io::Printer *printer) const { properties[i]->generateSizeEstimationCode(printer, "size", /* noTag = */ false); } + printer->Print("size += WireFormat.getVarint32Size(size) + WireFormat.getTagSize(fieldNumber, WireType.LENGTH_DELIMITED)\n"); printer->Print("return size\n"); printer->Outdent(); printer->Print("}\n"); @@ -379,7 +380,7 @@ void ClassGenerator::generateGetSizeMethod(io::Printer *printer) const { printer->Print("var size = 0\n"); for (int i = 0; i < properties.size(); ++i) { - properties[i]->generateSizeEstimationCode(printer, "size", /* noTag = */ true); + properties[i]->generateSizeEstimationCode(printer, "size", /* noTag = */ false); } printer->Print("return size\n"); diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc index 2ffe7bd90ee..b3f435213da 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc @@ -117,9 +117,6 @@ void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool i * - Write length as int32 (note that tag shouldn't be added) * - Write all repeated elements via recursive call (for primitive types without tags) */ - printer->Print(vars, "if ($fieldName$.size > 0) {\n"); - printer->Indent(); - // tag printer->Print(vars, "output.writeTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); @@ -141,9 +138,6 @@ void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool i printer->Outdent(); // for-loop printer->Print("}\n"); - - printer->Outdent(); // if-clause - printer->Print("}\n"); } } @@ -184,17 +178,15 @@ void FieldGenerator::generateSerializationForRepeated(io::Printer *printer, bool printer->Print(vars, "$fieldName$.add(tmp)\n"); } else { - /** - * Protobuf format: - * - Check if size of array is > 0, because empty repeated fields shouldn't appear in message - * - Write tag explicitly - * - Write length as int32 (note that tag shouldn't be added) - * - Write all repeated elements via recursive call (for primitive types without tags) - */ - printer->Print(vars, "if ($fieldName$.size > 0) {\n"); - printer->Indent(); + /** + * Protobuf format: + * - Check if size of array is > 0, because empty repeated fields shouldn't appear in message + * - Write tag explicitly + * - Write length as int32 (note that tag shouldn't be added) + * - Write all repeated elements via recursive call (for primitive types without tags) + */ - // all elements + // all elements printer->Print(vars, "for (item in $fieldName$) {\n"); printer->Indent(); @@ -207,18 +199,18 @@ void FieldGenerator::generateSerializationForRepeated(io::Printer *printer, bool printer->Outdent(); // for-loop printer->Print("}\n"); - - printer->Outdent(); // if-clause - printer->Print("}\n"); } } void FieldGenerator::generateSerializationForEnums(io::Printer * printer, bool isRead, bool noTag) const { + map vars; vars["converter"] = getEnumFromIntConverter(); vars["fieldName"] = simpleName; vars["suffix"] = getKotlinFunctionSuffix(); vars["fieldNumber"] = std::to_string(getFieldNumber()); + vars["initValue"] = getInitValue(); + if (isRead) { if (noTag) { printer->Print(vars, "$fieldName$ = $converter$(input.read$suffix$NoTag())\n"); @@ -267,7 +259,7 @@ void FieldGenerator::generateSerializationForMessages(io::Printer * printer, boo // check that actual size equal to expected size printer->Print(vars, "if (expectedSize != $fieldName$.getSizeNoTag()) { " "throw InvalidProtocolBufferException (" - "\"Expected size $dollar${expectedSize} got $dollar${$fieldName$.getSize()}" + "\"Expected size $dollar${expectedSize} got $dollar${$fieldName$.getSizeNoTag()}" "\") }\n"); printer->Outdent(); printer->Print("}\n"); @@ -277,7 +269,7 @@ void FieldGenerator::generateSerializationForMessages(io::Printer * printer, boo printer->Print(vars, "output.writeTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); // write message length - printer->Print(vars, "output.writeInt32NoTag($fieldName$.getSize())\n"); + printer->Print(vars, "output.writeInt32NoTag($fieldName$.getSizeNoTag())\n"); // write message itself without tag printer->Print(vars, @@ -309,9 +301,20 @@ void FieldGenerator::generateSerializationForPrimitives(io::Printer * printer, b } void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead, bool noTag) const { + map vars; + vars["fieldName"] = simpleName; + vars["initValue"] = getInitValue(); + + /* Try to generate syntax for serialization of repeated fields. * Note that it should be first check because of Google's FieldDescriptor structure */ if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { + // we shouldn't write fields with default values when writing + if (!isRead) { + printer->Print(vars, "if ($fieldName$.size > 0) {\n"); + printer->Indent(); + } + bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && descriptor->type() != FieldDescriptor::TYPE_MESSAGE && descriptor->type() != FieldDescriptor::TYPE_STRING && @@ -322,27 +325,48 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead else { generateSerializationForRepeated(printer, isRead, noTag); } - return; } /* Then check is current field is enum. We have to handle it separately too, because * we have to pass enums as Int's to CodedStreams as per protobuf-format */ - if (descriptor->type() == FieldDescriptor::TYPE_ENUM) { + else if (descriptor->type() == FieldDescriptor::TYPE_ENUM) { + // we shouldn't write fields with default values when writing + if (!isRead) { + printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); + printer->Indent(); + } + generateSerializationForEnums(printer, isRead, noTag); - return; } /* Then check for nested messages. Here we re-use writeTo method, that should be defined in * that message. * Note that readFrom/writeTo methods write message as it's top-level message, i.e. without * any tags. Therefore, we have to prepend tags and size manually. */ - if (descriptor->type() == FieldDescriptor::TYPE_MESSAGE) { + else if (descriptor->type() == FieldDescriptor::TYPE_MESSAGE) { + // we shouldn't write fields with default values when writing + if (!isRead) { + printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); + printer->Indent(); + } + generateSerializationForMessages(printer, isRead, noTag); - return; + } + /* Finally, serialize trivial cases */ + else { + // we shouldn't write fields with default values when writing + if (!isRead) { + printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); + printer->Indent(); + } + + generateSerializationForPrimitives(printer, isRead, noTag); } - /* Finally, serialize trivial cases */ - generateSerializationForPrimitives(printer, isRead, noTag); + if (!isRead) { + printer->Outdent(); + printer->Print("}\n"); + } } @@ -414,9 +438,13 @@ void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string var vars["varName"] = varName; vars["fieldName"] = simpleName; vars["fieldNumber"] = std::to_string(getFieldNumber()); + vars["initValue"] = getInitValue(); // First of all, generate code for repeated fields if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { + printer->Print(vars, "if ($fieldName$.size != 0) {\n"); + printer->Indent(); + // We will need total byte size of array, because that size is itself a part of the message and // adds to total message size. // For the sake of hygiene, temporary variables are created in anonymous scope @@ -434,52 +462,59 @@ void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string var FieldGenerator singleFieldGen = FieldGenerator(descriptor, enclosingClass, nameResolver); singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; singleFieldGen.simpleName = "item"; - singleFieldGen.generateSizeEstimationCode(printer, "arraySize"); + singleFieldGen.generateSizeEstimationCode(printer, "arraySize", noTag); printer->Outdent(); // for-loop printer->Print("}\n"); - // now add to total message size size of array, consisting of: + // now add size of array to total message size: printer->Print(vars, "$varName$ += arraySize"); // actual array size - if (!noTag) { - printer->Print(vars, - " + " - "WireFormat.getTagSize($fieldNumber$, WireType.LENGTH_DELIMITED)" // tag size - " + " - "WireFormat.getVarint32Size(arraySize)"); // runtime call, that will get size of varint, denoting size of array - } printer->Print("\n"); printer->Outdent(); // anonymous scope printer->Print("}\n"); + printer->Outdent(); // if-clause + printer->Print("}\n"); + return; } // Then, call getSize recursively for nested messages // TODO: currently suboptimal repeatative calls getSize() are being made. We can optimize it later via caching calls to getSize() if (getProtoType() == FieldDescriptor::TYPE_MESSAGE) { - // don't forget about tag and length annotation - printer->Print(vars, "$varName$ += $fieldName$.getSize()" + printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); + printer->Indent(); + vars["maybeNoTag"] = noTag ? "NoTag" : ""; + vars["maybeFieldNumber"] = noTag ? "" : std::to_string(getFieldNumber()); + printer->Print(vars, "$varName$ += $fieldName$.getSize$maybeNoTag$($maybeFieldNumber$)" "\n"); - if (!noTag) { - printer->Print(vars, "$varName$ += " - "WireFormat.getTagSize($fieldNumber$, WireType.LENGTH_DELIMITED)" - " + " - "WireFormat.getVarint32Size($fieldName$.getSize())\n"); - } + printer->Outdent(); // if-clause + printer->Print("}\n"); return; } // Next, process enums as they should be casted to ints manually if (getProtoType() == FieldDescriptor::TYPE_ENUM) { + printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); + printer->Indent(); + printer->Print(vars, "$varName$ += WireFormat.getEnumSize($fieldNumber$, $fieldName$.ord)\n"); + + printer->Outdent(); // if-clause + printer->Print("}\n"); return; } // Finally, get size of all primitive types trivially via call to WireFormat in runtime vars["kotlinSuffix"] = getKotlinFunctionSuffix(); + printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); + printer->Indent(); + printer->Print(vars, "$varName$ += WireFormat.get$kotlinSuffix$Size($fieldNumber$, $fieldName$)\n"); + + printer->Outdent(); // if-clause + printer->Print("}\n"); return; }