From 2dd3ca4d6aad2861b59747376a27667542713b2e Mon Sep 17 00:00:00 2001 From: paladin-t Date: Sat, 2 Jan 2016 17:58:05 +0800 Subject: [PATCH] *fixed a wrong scope bug caused by cloned class instance. --- HISTORY | 2 ++ core/my_basic.c | 30 ++++++++++++++++++++---------- output/my_basic.exe | Bin 339968 -> 340480 bytes 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/HISTORY b/HISTORY index 5b15a07..fe3d8b6 100755 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,8 @@ Jan. 2 2016 Added support to apply GET statement to a class instance Added support to access a collection by brackets +Fixed a wrong scope bug caused by cloned class instance +Fixed a GC issue by adding reference count when cloning a collection or a referenced usertype Fixed a mistake in VAR statement Polished document diff --git a/core/my_basic.c b/core/my_basic.c index eb22ad7..8dfe0a5 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -409,6 +409,7 @@ typedef struct _routine_t { #ifdef MB_ENABLE_CLASS _class_t* instance; #endif /* MB_ENABLE_CLASS */ + bool_t is_cloned; bool_t is_basic; union { struct { @@ -5748,10 +5749,17 @@ int _clone_clsss_field(void* data, void* extra, void* n) { case _DT_ROUTINE: sub = (_routine_t*)obj->data.routine; if(!_search_identifier_in_scope_chain(instance->ref.s, instance->scope, sub->name, 0, 0)) { + _routine_t* routine = (_routine_t*)mb_malloc(sizeof(_routine_t)); + memset(routine, 0, sizeof(_routine_t)); + routine->name = mb_strdup(sub->name, 0); + routine->instance = instance; + routine->is_cloned = true; + routine->is_basic = sub->is_basic; + routine->func = sub->func; ret = _create_object(); ret->type = _DT_ROUTINE; - ret->data.routine = sub; - ret->ref = true; + ret->data.routine = routine; + ret->ref = false; _ht_set_or_insert(instance->scope->var_dict, obj->data.routine->name, ret); } @@ -6414,16 +6422,18 @@ int _dispose_object(_object_t* obj) { case _DT_ROUTINE: if(!obj->ref) { safe_free(obj->data.routine->name); - if(obj->data.routine->is_basic) { - if(obj->data.routine->func.basic.scope) { - if(obj->data.routine->func.basic.scope->var_dict) { - _ht_foreach(obj->data.routine->func.basic.scope->var_dict, _destroy_object); - _ht_destroy(obj->data.routine->func.basic.scope->var_dict); + if(!obj->data.routine->is_cloned) { + if(obj->data.routine->is_basic) { + if(obj->data.routine->func.basic.scope) { + if(obj->data.routine->func.basic.scope->var_dict) { + _ht_foreach(obj->data.routine->func.basic.scope->var_dict, _destroy_object); + _ht_destroy(obj->data.routine->func.basic.scope->var_dict); + } + safe_free(obj->data.routine->func.basic.scope); } - safe_free(obj->data.routine->func.basic.scope); + if(obj->data.routine->func.basic.parameters) + _ls_destroy(obj->data.routine->func.basic.parameters); } - if(obj->data.routine->func.basic.parameters) - _ls_destroy(obj->data.routine->func.basic.parameters); } safe_free(obj->data.routine); } diff --git a/output/my_basic.exe b/output/my_basic.exe index c59f54019abf137165c232d8b1d6028b54bb2553..1fbf6ee7ec6248bdc03715c3fb4aaf8b3e418cc0 100755 GIT binary patch delta 13291 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 delta 13179 zcmZ{K3wTV&`~R7fghj|jLP%6Z;*tcLJ!j9Jv$yP$#3d4mOCkhusjdh@6XLpwB#0vw z9d%G8E=5T-x>!`(5EZu)mnxN#wpvF~QL2ez|L<%P?YI5?_j%s^yfgF8%scNp^UlmU zC-;s|Zmmzb0tL+-zdVU*`qff2YJ=KQR2ibEr7q6ghW$7cEof!(rl{KQ5S6*6n?F8{ z_|`RhLB5nhgXbl{=^%3jaB^Nl?Kgm9 z^BSmc0Y~IDJu6P2;tYG)5sNg^_yX`=S ziO7SDDQkei=^?!#4F~&iXeb`*H`8sZN7n)hpZB|mD14~XEtHGj>wFge)BLOWMyDhx zD9S*5;!zMw*lH(ha^`|ZJPOo=B~I}u2qml%PY6&$bMFP{6l5$}Ee$4oJ>W6@QwBcQ zWfr1rx;G@6J~|O!4V;1su+Z(KR}@SUvA=6xjw>;#MPUeSN-Gk*#U!5RdCF(kG|lU%S6Txwd=3w-No+g3tC~yf3CvRQ^fDy)CeU z)2U?n_C%XU&(+p)0Lh<-L4pAHY9zZ{1jg$D(5a}Xu|Jg#|-jS?RuiqW1);^Sm-kOGwIm7n8@ z)qQ#*cRa4oOXP#c_KibX_@lnT$yAV;%I+n`)re-#A{Vf1!D<>bHz|r-#HtD7$BJ?F z%-8bB%*GD#7vG`8m=JMsO;PmKq9q~OUg8z;g8Up-E^$f{sS1;Ff;$fG7f7Fu$1(l% zXb;Zs*PE`($NT!d;psUHM4-2EwMEen#KE4prr%6@+hjacx!v=FcqoexC>~Xpf80mj zG66f3(>k7vgG}fQdaVLwCX8pk9xI=nfvpiX7!ISl4ztyriJ(8pvqdtgh`zVL_5nKw z!L0G*CewGbY}s50P5(LKObRKOUKIoX`sm#B+u5?MlD^9);Q9V)3H97yl@P zd05R9l_VzuAoB*ErAwe+4#3BCUFq6h_(z=y zrQ`1UG}H`}{QxCei+e`})8$?9uqZZ!j3leO zi1ONALxuq)cSqeK6;?zaQ936LX}3T7x?PO`^_IT_BZrRs zL`8msBHJBWfi<0rXU7ccL}Gz>s?kDXc71X53-MY4w4uY7V{U;>_YWLEpVr`K1J&)E z5&9e5o~@OG(Le-CBG&DGvPDA~~Keeb1JZjA=C6_G?NmqU(m)GRF1* zyn)xIhCu|YNSzE3A$VK~P2)&>Xu|JwO}uSS+D$}PW4wIQ9TbQ&Ca*?;wilBl5%RL> z-|R%U-W5Vo9`*sRieqs^ia%cPmN!bn#cz#8Q}DgFtg!Z`S#q z#5ceYU2JL7`XDq5zmu+oxOgVrfacVJmhaYDQM&4LAV=!Ic5igrzLL9D|5e165&m4u&blap^-H`iWI6*kKhy0VS*p%sm zw`YdYue@y4nZLV07q*jGy<9-mhx1aA3m%fgS#N+Zg)VDhL-8p1+R3kX^2dP}U6PXX z>sw`w%dhwHDEye@EOZsKJ<}mjIy7REpBV2h|J8!TPj?a-M39g_YXwJ`D#{D^q8!&M zlLBTIC5~_vYazFzh+T|s_G=CO4hRqAq?TT7BEm9TZ zR0St=^}$;f^y}mn6FGAqWvj;y$L!6UlQ8r!9XgArP6^Iy!M)`Pn>#zr{{ zk6x1A%ZJJupH5lod|^+ZIzk}7x60ut8mJ(PKgLJQR1`kTGK}~v0sp!r4Bf>YtSfxU zG?1sQa5!Rg^W5kBBE~A@*wr?hbuo?3+ai|wqv3uKWtv^#?&KR?L6PX=Qq)p($**tk zvHUU^)Dc`5yv9V#nk)`?mDf3(CcS5eA~DvLxhzj9b~x^Rh&ShlTCZLug+BLS`=G=D zuA)M`R6GYwEm=wTFQ~|F2)ow*UM+D^tkcLXZjphw5 zG0)X8*WJO%`un6^cX2KZHv8v$9h&>v}Y^z(gkSJXe^<$dXwI zemPR-v=QubTb?@{II)niJ}EI#|EB({8}kwY3xN7IrMCe71oRXr9qQ!(Nk9$%Xyc!= z6*g@_y~?@H9)Ohub>sT0b@Gi)A9IzMuLZ0>aCs^4;PPCULitM+P2pNx;wpN;zTZaP zx6>DX4wEF)7c6iE;1Crorom^VvnEtm6iZIgeHHwPnuM#6j*PfUIBMoPyDN z$SF--ncPWVr2RoYP~aw)Lik6|T|yqtGU6a{n?(lY@` zdU+GB1>6cm@=pUbw*he{i3F_+@-}>FMI>Ii!V?Y0@2^m!07wsmrQNM48Ns$Nf92R{ z?{y|>9FRMZFOWY_H=v$CeSkHKEP`B^CaJbLq6)=a1nC=1bQZ8V-HfD+c@kNcZU)E`asGhlPN8A;jCoA8M> z1|Mg9?KStG@pS=i|L*7jXTh=Te-^Y`1TzBy@H)Kw-Lv%GyI92js4t#{JEKax5(l7X zco&}8>dqFYJ!`h$H`exTQ4XoITk!C;iLE@hI}4s}!)0qt$YguC_9zN=o|oF^{q?Xt z1vgFctbAY=^iqF6NWKZ(6;@<-keA|f>o#<{T56(r`WohZzJ zqH*;_(Jvs1QBYza=Ik#m-#b!!eFEs#_80_b=gw~NggxH5(H9~4*uTmGKWZ*ByUJT^#!o>7{$yOU zhDS*)xI4;aQ0`Pk%=CnI$0bA0(Vdh2SxbOgP7&sr$m8SteY^DhXL0N1Vli_Rv~UiW z?C%Mxx4^?bT~E6u;d`H|I+IZpnf;nNBDQplblUPTR@*{+PJk)@W&BU@OdGjCY_yfY z?KJGbO1MTGI?xTFKk)T~K}u)X=`$SK7^aqg29)d0I}>6ZTo#`W1HN7U@rL|{R`Yxu z!NsXK^w72*mB%5*G|}gP&FN+&WtGSA?}s)*m?*Xf=v_*oowyfpm}b5nFH^9ele=k2 zk4o54nkW#kIo*t;tOx$to<}E@V9Vh|+NH$y*&81S$pE z2~-C3DbQh{cKGAZPtmPnY}sF&aiM4S$EFi+!Yy#;2~mL_+EnL~dY}?q^tdPd?|qCA}OgrVEMgSS5MqZteS>`8YNk8eN80@sXuTJ3$k7!HWh zb;Y9|6i3&QW1)n(KVraRi~sPaecr|!|5%H@!2Oa#f50rosoqRaT^vmo>c zzj~H}zQLpa?2cyRMSphk4{$Y8`STTIqk{W0<$&iLb%ZzM_2yiqu!r0(sJ65X(mY>&p0-phSpRFu@!7x|}=XT4d``OjNr|3tie zK^)=kyz?rHq80Ktu(>)fyjcnno}s~pq{v_BLuD)Ev30K;MFV`qQ3^5EM=plc{q1BV zqZH{53ppN$7eKgZfTw+iL zJ#=EHyCRx&HhU6M*)`qJS)?EjV6)xCu@Z_w9qobL5h4PsqEM85Y6$9yd_E|GV|(YR z9y6nYJw3)&c#Nr#S4vxZpz?oJ&FqQB!P5-sLNA2>Rg~MC6s1VFLjO}#5{8cdTZzm* z=p+Jd)&0ONfK!!d?`x%!7^2j!h5u1%t+a+k<;}V;QxmZX^Zz3@R65T6Ep|vl#74~f zkC;h%%>OO+i$KJlWc^31R_dnvTdaeghzs2U7 zh*z?p6cO_tt`MsGFRXOPrC25mt5rJ5MD z{C}M#!4&8r?H-66^qXhw9}PnB|8kF0z^)&HG7vrGlzmSuO8LJeq(O1$rN_WZSb0N( z1HvlBYWZlT1nmXbGvi@$HaSYVHVkFbF%{CF1QdjpO4Aci2%UOBdN+Zn-Z)WbC8A|b z{vRY6N21RVwm%<<4xr$gsb+G`IS)WqCwchoQE(Lwo#|AfL&;o*g)&yUoP<`PFQf^{ zXb>IprTwF1m~kCRAoM6$iQri$34tC3R>CGoc_~P2dJ_UWX!Dzp?+M!|ciEZid=o;h zv`ue9juBQVMU6rAZNny;slk)X)aEH>s+WE6ShN&Hb~^xefM+QtcnszWveXd@`jhwA zAbXgrg(TA9h(jJ{G>XB4F8ORc?BOxICADQFz(O*bZ@Hhcr}#UP`5D=s|~svRCAU?8plCgVXk+;6QPhr@TD#cUEeiIdvfF^$eBk<}{zVerLf`hNm}92SHPI2k=5#ZXvLkaO&Vt4_ z`Aq`9`P+ZApgphq`f@s|K%Au#%OWm{4C+MjCN;YYyNod$S6pQFdPwbm=P&$Q9DTJhZF1X!TMw649N0lzz^K9jB@BmW5~nqC3>u zEz8gux@~8e2=MAJ2tY2Dj78wb1pD$L6zhV5q${h?5_;@BX+$xKpnJ`emKCGE0rhiX z!rX#AM|XR%@76N70o=bn!m{Wx+yK6ps*6#I`_?WLm29aXIXRO09kQv+l`gJ^4Sdr( z$colT0jtprPjdi86~~~2MnT_fX~Sy7qEDm?tI>C~YnHU91ZAUQDR2$?#kzA2nM;bM zmmLX~JEZM3|C8y+erj>O0@(}xC)=|2D&$RtJj*8FEW1fE`E~LRNe+6QbpHmD0!e0` z1Fj$8Oy8KTlpI3Xp`_UVb+H%WR*}4xgxf*5m$QL8O}Hn7t0mk$!ns}p?ly4wCry@M zlDJH=O@up5xHQ6jLAc$7J3zPxgxfQF3b20P0$WNlGYGeiaAkyBMY!vPTS~a6gv%jZ z;C0|;5>8LJDTEtMxG{vwB3uIDN(dJ-Te4u(*O!GCNtTl&#~sQP9yNV1d%;k;@6|D^r#FeWj&fevl-IS^+*j7p>91m zzEH~CfD+IH>G%dn9gxf$k%|`5rRS@lXaTuZz)#PrA* zeZ-?5rE?$$v$^9Yv<3xBA8kS*=#~BACO9;po6_YEP>4IV&P-LgmB7?2Stq${Mv-Wx zG+;BxO_8Q;Mqxg=yP(`OL-~=Ja$d2jOtVeW?#(EGF4--e+KgtQOo`iqxIojJV4v$` zR&j*$BeNx(aH)g~dQ)1p1!bYBc2tU5AT+_Q*oqX0rdmke+t7eXogvK1-mNJLo@~3S zD#lgHZjFi7>6H8&-XEmgzgLdNRl;Mt{0Hvj$sHU_-SS_d>_xH_zPo@YkD>51yN6{c zj6{wk6(9>*x}R(rO|rrz`!+PXU0aYnpRTav-h#Xesmpd`ZM_U$gph{i>C(>asBf$F z3W|c)5ps$2{dUx|?XU2F_I{hjhObLrJ5Y%A{Q0DGB%g!=`3O`_kbfeq0_wptk|RIA za-^f87IK$Y&hzH@f{LukH-D60f~2LV9s1o3XLos#v*IeKm;$P1o8@fCkSpL16mR2v z%phAxsa#(V;!numcp{SW^PpFb1bMZytPAOQ5cCLNa-_GE<6U5Q@&pirw7i8FH4F+9 z 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